获取多个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; }
DrectoryCatalog
和AssemblyCatalog
实例将扫描所有出口部件的装配。这将包括两种类型的插件。您不应该为组合这些类型创建一个全新的目录和容器,它应该按原样工作。