MEF Composition ImportMany yield two versions of same class
我找不到我问题的答案。我正在使用MEF来查找和创建实现IPlugin的类,但最终每个插件类有两个版本。我已经确定AggregateCatalog只包含一个程序集,该程序集只包含作为一部分的每个类的一种类型,但是作为最终结果,我仍然得到每个类的两个实例。我可能只是做了件蠢事,但我还没找到。如果有任何帮助…
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | ... [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中调试。我清楚地看到只有一个组件加载。复合容器每个只有1个。在startall()中满足importance之后,每个iplugin类都有两个实例。这是我使用importmany的方式吗?我愿意接受任何想法。
解决办法很简单。我完全删除了iplugin接口中的[inheriteexport],这创建了正确数量的插件。如果我删除了[导出…从每个插件子类中,我根本没有插件。创建多个实例的是这两个实例的组合。
如果接口上有
此外,如果要将任何其他