我无法找到问题的答案。我使用 MEF 查找并创建实现 IPlugIn 的类,但最终每个 PlugIn 类都有两个版本。我已确定 AggregateCatalog 仅包含一个程序集,该程序集仅包含每个类的 1 种类型作为零件,但我仍然得到每个类的两个实例作为最终结果。我可能只是做了一些愚蠢的事情,但我还没有发现。我将不胜感激任何帮助...
... [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 的方式有关吗?我对任何想法持开放态度。
最佳答案
结果证明解决方案很简单。我从 IPlugIn 界面中完全删除了 [InheritedExport],并创建了正确数量的插件。如果我从每个 PlugIn 子类中删除 [Export...,我就根本没有插件。正是这两者的结合创造了多个实例。
关于c# - MEF Composition ImportMany 产生同一类的两个版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13078821/