Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 4.0 使用MEF,每个应用程序最多只允许2个实例_C# 4.0_Inversion Of Control_Mef - Fatal编程技术网

C# 4.0 使用MEF,每个应用程序最多只允许2个实例

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

我在应用程序中使用MEF作为IOC。我发现自己陷入了这样的境地:我的应用程序中的一个类在所有线程中一次只需要两个实例。我认为只需使用不同的容器名称添加两次export属性,然后使用该容器名称创建两个实例就可以了

[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导入,则需要另一个共享实例。我希望将共享实例附加到合同名称而不是类类型。这就是为什么我用两个导出属性来装饰这个类。