【问题标题】:Use MEF to allow only 2 instances at max per application使用 MEF,每个应用程序最多只允许 2 个实例
【发布时间】:2013-03-25 17:24:25
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    问题在于装饰MyClassPartCreationPolicyAttribute的设置。

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

    这是一篇关于Part Creation Policy 的好文章。 还可以查看ExportFactory in MEF 2,了解有关部件寿命和共享的 MEF2 新增内容

    【讨论】:

    • 我不想要非共享。我想要半共享。意味着如果使用合同名称“Condition-1”导入我想要一个共享实例,如果使用合同名称“Condition-2”导入另一个共享实例。我想要一个附加到合同名称而不是类类型的共享实例。这就是为什么我用两个导出属性来装饰这个类。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-01
    相关资源
    最近更新 更多