2010-08-14 65 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()就足以导致重新构建。