我没有找到解决我问题的答案。我正在使用MEF查找和创建实现IPlugIn的类,但最终每个插件类都有两个版本。我确定AggregateCatalog仅包含一个Assembly,而每个Part只包含1种类型的零件,但是最终结果仍然是每种的两个实例。我可能只是在做一些愚蠢的事情,但还没有发现。我将不胜感激...
...
[ImportMany(typeof(IPlugIn))]
public System.Lazy> []插件{get;组; }
...
// aggregatecatalog仅包含一个包含插件类的dll,其中有4个
容器=新的CompositionContainer(aggregateCatalog,
CompositionOptions.DisableSilentRejection
| CompositionOptions.IsThreadSafe); \
container.SatisfyImportsOnce(this);
...
公共无效StartAll()
{
//我们这里有8个插件??怎么样?
如果(插件== null || Plugins.Count()== 0)
{
log.Warn(“无插件可启动!”);
返回;
}
foreach(var插件插件)
{
log.Info(“ Starting PlugIn:” + plug.Value.GetName());
plug.Value.Start();
}
}
...
[导出(typeof(IPlugIn))
公共类MyPlugIn:BasePlugIn,IPlugIn
...
我正在Visual Studio中进行调试。我清楚地看到只有一个程序集正在加载。 CompositionContainer仅有一个。在StartAll()中满足SatisfyImportOnce之后,每个IPlugIn类都有两个实例。这与我使用ImportMany的方式有关吗?我愿意接受任何想法。
最佳答案
结果证明很简单。我从IPlugIn界面中完全删除了[InheritedExport],并创建了正确数量的插件。如果我从每个PlugIn子类中删除[Export ...],则根本没有插件。这是两者的组合,创建了多个实例。