获取多个MEF目录/容器

时间:2011-08-03 18:36:54

标签: c# .net mef

正如this帖子所述,我可以使用此代码来获取使用目录/容器的插件。

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

1 个答案:

答案 0 :(得分:2)

DrectoryCatalogAssemblyCatalog个实例将扫描所有导出部件的装配。这将包括两种类型的插件。你不必创建一个全新的目录和容器来组成这些类型,它应该按原样工作。