获取多个MEF目录/容器

本文关键字:容器 目录 MEF 获取 | 更新日期: 2023-09-27 18:04:29

正如在这篇文章中回答的那样,我可以使用这个代码来使用目录/容器获取插件。

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

获取多个MEF目录/容器

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