2010-08-14 3 views
1

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

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, используемой exportsCatalog просто отлично, но это никогда не перестраивает FontStyleProviders (или MessageContainerViewModels)

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

ответ

2

Проблема в том, что вы фактически не добавляете каталог, который вы называете 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() будет достаточно, чтобы вызвать перекомпоновку.

Смежные вопросы