2011-08-03 43 views
1

正如this後的回答,我可以使用此代碼獲取使用目錄/容器的插件。獲取多個MEF目錄/容器

var catalog = new AggregateCatalog(); 
catalog.Catalogs.Add(new DirectoryCatalog(@"./")); // or different directory 
var container = new CompositionContainer(catalog); 
container.ComposeParts(this); 

當我需要多個插件時,這段代碼是如何修改的?例如,如果我有兩個插件:一個用於使用接口Icolor獲取顏色,另一個用於使用接口Isize的大小,我怎麼能區分這兩個插件?

我可以想到有兩個不同的顏色和大小目錄,但我不認爲這是一個通用的解決方案。

// get catalog and container 
AggregateCatalog catalogForColor = new AggregateCatalog(); 
catalogForColor.Catalogs.Add(new DirectoryCatalog(@"/pluginForColorDirectory")); 
var containerForColor = new CompositionContainer(catalogForColor); 
containerForColor.ComposeParts(this); 

AggregateCatalog catalogForSize = new AggregateCatalog(); 
catalogForSize.Catalogs.Add(new DirectoryCatalog(@"/pluginForSizeDirectory")); 
var catalogForSize = new CompositionContainer(catalogForSize); 
catalogForSize.ComposeParts(this); 

// the property to store the catalog 
public IEnumerable<Lazy<Icolor, IMessageSenderMetadata>> Color { get; set; } 
public IEnumerable<Lazy<Isize, IMessageSenderMetadata>> Size { get; set; } 
+0

也許我錯過了一些東西,但我並不真正瞭解這個問題。目錄可以保存多個相同或不同類型的插件。所以你根本不需要修改上面的代碼。 – Wolfgang

回答

2

DrectoryCatalogAssemblyCatalog實例將掃描所有導出部件組件。這將包括這兩種類型的插件。您不必爲創作這些類型創建一個全新的目錄和容器,它應該按原樣工作。