1

我在我的应用程序中使用 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 是共享的,合同名称是否无关紧要?

4

1 回答 1

0

The problem is in the setup of PartCreationPolicyAttribute that decorates MyClass.

CreationPolicy.Shared means that a single instance will be returned for each call to Container.GetExport. It is like a singleton. What you need in your case is the CreationPolicy.NonShared policy which will return a different instance for each clla to Container.GetExport.

Here's a good article on Part Creation Policy. Also have a look at ExportFactory in MEF 2 for MEF2 additions regarding the lifetime and sharing of parts

于 2013-03-26T09:19:03.070 回答