【问题标题】:MEF Property Export with PartCreationPolicy使用 PartCreationPolicy 导出 MEF 属性
【发布时间】:2011-02-09 15:47:24
【问题描述】:

当我尝试这样做时:

[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。

【问题讨论】:

  • 问题:PartCreationPolicy 位于哪个程序集中?

标签: ioc-container mef


【解决方案1】:

PartCreationPolicy 应该在类上,即使导出在属性上。类是对应于部件的,创建策略将控制 MEF 是否在每次向它请求导出时创建该类的新实例。

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

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

【讨论】:

    猜你喜欢
    • 2017-10-05
    • 2012-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-31
    • 2011-03-02
    相关资源
    最近更新 更多