正如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; }
答案 0 :(得分:2)
DrectoryCatalog
和AssemblyCatalog
个实例将扫描所有导出部件的装配。这将包括两种类型的插件。你不必创建一个全新的目录和容器来组成这些类型,它应该按原样工作。