使用MEF仅允许每个应用程序最多2个实例

时间:2013-03-25 17:24:25

标签: c#-4.0 inversion-of-control mef

我在我的应用程序中使用MEF作为IOC。我发现自己陷入了这样一种情况,即我的应用程序中的一个类(跨所有线程)我一次只需要两个实例。我认为通过使用不同的容器名称添加两次导出属性然后使用该容器名称来创建两个实例会很容易。

[Export("Condition-1",typeof(MyClass)]
[Export("Condition-2",typeof(MyClass)]
[PartCreationPolicy(System.ComponentModel.Composition.CreationPolicy.Shared)]
public class MyClass  {   }

然后将它们导出为

Container.GetExport<MyClass>("Condition-1").Value
Container.GetExport<MyClass>("Condition-2").Value

但这个技巧不起作用。我终于能够通过使用CompsositionBatch

来解决我的问题
cb.AddExportedValue<MyClass>("Condition-1",new MyClass());
cb.AddExportedValue<MyClass>("Condition-2",new MyClass());

但我的问题是,为什么我无法根据合同名称获得不同的实例。如果共享CreationPolicy,合同名称无关紧要吗?

1 个答案:

答案 0 :(得分:0)

问题在于PartCreationPolicyAttribute设置装饰MyClass

CreationPolicy.Shared意味着每次调用Container.GetExport都会返回一个实例。它就像一个单身人士。您需要的是CreationPolicy.NonShared策略,该策略将为每个clla返回一个不同的实例Container.GetExport

这是关于Part Creation Policy的好文章。 另请参阅ExportFactory in MEF 2有关生命周期和零件共享的MEF2添加内容