我无法找到问题的答案。我正在使用MEF来查找和创建实现IPlugIn的类,但我最终得到了每个PlugIn类的两个版本。我已经确定AggregateCatalog只包含一个程序集,它只包含每个类的一种类型作为一个部分,但我仍然得到每个类的两个实例作为最终结果。我可能只是在做一些愚蠢的事,但我还没有找到它。我很感激任何帮助...
... [ImportMany(typeof(IPlugIn))] public System.Lazy>[] Plugins { get; set; } ... //aggregatecatalog only contains one dll containing plugin classes, 4 of them container = new CompositionContainer(aggregateCatalog, CompositionOptions.DisableSilentRejection | CompositionOptions.IsThreadSafe);\ container.SatisfyImportsOnce(this); ... public void StartAll() { //We have 8 PlugIns here?? How? if (Plugins == null || Plugins.Count() == 0) { log.Warn("No PlugIns Available to Start!"); return; } foreach (var plug in Plugins) { log.Info("Starting PlugIn: " + plug.Value.GetName()); plug.Value.Start(); } } ... [Export(typeof(IPlugIn))] public class MyPlugIn : BasePlugIn, IPlugIn ...
我在Visual Studio中进行调试。我清楚地看到只有一个装配加载。 CompositionContainer只有1个。在StartAll()中的SatisfyImportOnce之后,我有两个IPlugIn类的实例。这与我使用ImportMany的方式有关吗?我对任何想法持开放态度。
答案 0 :(得分:2)
解决方案结果很简单。我完全从IPlugIn界面中删除了[InheritedExport]并创建了正确数量的插件。如果我从每个PlugIn子类中删除[Export ...,我根本没有插件。创建多个实例的是两者的组合。
答案 1 :(得分:1)
如果您的界面上有InheritedExport
属性,则必须在实现该界面的类上使用InheritedExport
。应用Export
会导致组成一个额外的部分,这是您发现的。
此外,如果您要将任何其他ExportMetadata
应用于实现InheritedExport
接口的类,则必须再次添加InheritedExport
属性 为了添加元数据(替换继承的元数据,即使没有)。 InheritedExport或ExportMetadata的MSDN文档中未解决此问题,但我在其他模糊的Microsoft文档中遇到了一些模糊的引用。