2010-08-14 33 views
1
的ImportMany

我有在具有爲其定義的importManyAttribute一個類中定義的屬性,聲明如下:問題重新構圖與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; 
    } 
} 

在這一點上,一切都按預期工作,但我似乎無法觸發「this」類實例的重新組合。我有一個導入方法如下:

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)); 
    } 
} 

它由exportsCatalog蠻好用的ApplicationExtensionPath文件夾中找到新的類型,但它從來沒有真正重新建立

我一直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()就足以導致重新構建。