代码之家  ›  专栏  ›  技术社区  ›  djskinner

带部件创建策略的MEF属性导出

  •  4
  • djskinner  · 技术社区  · 14 年前

    当我尝试这样做时:

    [Export(typeof(IMyService))]
    [PartCreationPolicy(CreationPolicy.Shared)]
    private MyService Service
    {
        get
        {
            var service = new MyService();
            service.Configure();
            return service;
        }
    }
    

    我得到一个编译错误: Attribute 'PartCreationPolicy' is not valid on this declaration type. It is only valid on 'class' declarations.

    这是虫子吗?我不明白为什么MEF会允许属性导出,但不允许指定部件寿命。

    使用VS2010 RC。

    1 回复  |  直到 9 年前
        1
  •  7
  •   Daniel Plaisted    14 年前

    partCreationPolicy应该在类上进行,即使导出在属性上进行。类是与部件对应的,并且创建策略将控制每次请求导出时MEF是否创建该类的新实例。

    我不确定您是要使用共享还是非共享。在代码示例中,将creationpolicy设置为shared,但随后将在属性getter中创建myservice的新实例。这似乎表明您可能正在寻找一个非共享的创建策略。

    如果您希望每次请求导出时都创建一个新服务,那么应该通过创建策略来创建,而不是通过在getter中创建一个新实例来创建。导出的值不应该在运行时更改,事实上,MEF只调用一次getter,并存储需要再次访问导出值时的返回值。因此,在getter中创建一个新实例可以使它看起来像是在实际只有一个服务的情况下创建了多个服务。