C# 4.0 使用MEF,每个应用程序最多只允许2个实例
我在应用程序中使用MEF作为IOC。我发现自己陷入了这样的境地:我的应用程序中的一个类在所有线程中一次只需要两个实例。我认为只需使用不同的容器名称添加两次export属性,然后使用该容器名称创建两个实例就可以了C# 4.0 使用MEF,每个应用程序最多只允许2个实例,c#-4.0,inversion-of-control,mef,C# 4.0,Inversion Of Control,Mef,我在应用程序中使用MEF作为IOC。我发现自己陷入了这样的境地:我的应用程序中的一个类在所有线程中一次只需要两个实例。我认为只需使用不同的容器名称添加两次export属性,然后使用该容器名称创建两个实例就可以了 [Export("Condition-1",typeof(MyClass)] [Export("Condition-2",typeof(MyClass)] [PartCreationPolicy(System.ComponentModel.Composition.CreationPoli
[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是共享的,契约名称是否无关紧要?问题在于装饰MyClass的PartCreationPolicyAttribute的设置 Shared意味着每次调用Container.GetExport都将返回一个实例。它就像一个单身汉。在您的案例中,您需要的是CreationPolicy.NonShared策略,它将为每个clla返回一个不同的实例到Container.GetExport 这里有一篇关于这个问题的好文章。
另外,还可以查看有关部件寿命和共享的MEF2添加内容我不希望非共享。我想要半共享的。表示如果使用合同名称条件-1导入,则需要一个共享实例,如果使用合同名称条件-2导入,则需要另一个共享实例。我希望将共享实例附加到合同名称而不是类类型。这就是为什么我用两个导出属性来装饰这个类。