Проблема перекомпоновки на ImportMany с MEF - PullRequest
1 голос
/ 14 августа 2010

У меня есть свойство, определенное для класса, для которого определен атрибут importManyAttribute, объявление выглядит следующим образом:

public const string FontStyleProvidersPropertyName = "FontStyleProviders";
[ImportMany(typeof(IFontStyleProvider), RequiredCreationPolicy = CreationPolicy.Shared, AllowRecomposition=true)]
public List<IFontStyleProvider> FontStyleProviders { get; set; }

при первом запуске я создаю свой составной контейнер следующим образом

private CompositionContainer BuildCompositionContainer()
{
    //build our composable parts catalog
    Assembly executingAssembly = Assembly.GetExecutingAssembly();
    CompositionContainer applicationContainer;
    string localPath = Path.GetDirectoryName(executingAssembly.Location);

    try
    {
        aggregateCatalog = new AggregateCatalog();
        aggregateCatalog.Catalogs.Add(new AssemblyCatalog(executingAssembly));

        if (!Directory.Exists(Path.Combine(localPath, ApplicationExtensionsPath)))
        {
            Directory.CreateDirectory(Path.Combine(localPath, ApplicationExtensionsPath));
        }

        exportsCatalog = new DirectoryCatalog(Path.Combine(localPath, ApplicationExtensionsPath));

        aggregateCatalog.Catalogs.Add(new DirectoryCatalog(Path.Combine(localPath, ApplicationExtensionsPath)));

        //create a composition container
        return applicationContainer = new CompositionContainer(aggregateCatalog);
    }
    catch (Exception e)
    {
        Debug.Fail("Catalog Construction Failed", e.StackTrace);
        throw;
    }
}

На данный момент все работает, как и ожидалось, но я не могу вызвать повторную композицию на экземпляре этого класса.У меня есть метод импорта следующим образом:

private void Import()
{
    exportsCatalog.Refresh();
    CompositionBatch batch = new CompositionBatch();
    batch.AddPart(this);
    applicationContainer.Compose(batch);

    var copy = PropertyChanged;
    if (copy != null)
    {
        copy(this, new PropertyChangedEventArgs(FontStyleProvidersPropertyName));
        copy(this, new PropertyChangedEventArgs(MessageContainerViewModelsPropertyName));
    }
}

Он находит новые типы в папке ApplicationExtensionPath, используемой exportCatalog, просто отлично, но он фактически никогда не перестраивает FontStyleProviders (или MessageContainerViewModels)

Я несколько раз просматривал документы и не могу понять, почему.

1 Ответ

2 голосов
/ 15 августа 2010

Проблема в том, что вы на самом деле не добавляете каталог, который вы называете Refresh(), в AggregateCatalog. Изменить это:

exportsCatalog = new DirectoryCatalog(Path.Combine(localPath, ApplicationExtensionsPath));
aggregateCatalog.Catalogs.Add(new DirectoryCatalog(Path.Combine(localPath, ApplicationExtensionsPath)));

К этому:

exportsCatalog = new DirectoryCatalog(Path.Combine(localPath, ApplicationExtensionsPath));
aggregateCatalog.Catalogs.Add(exportsCatalog);

Кроме того, если ваш класс составлен, вы не должны его снова составлять. Достаточно просто вызвать exportsCatalog.Refresh(), чтобы вызвать перекомпозицию.

...