使用PartCreationPolicy进行MEF属性导出

时间:2010-04-19 11:48:05

标签: ioc-container mef

当我尝试这样做时:

[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 个答案:

答案 0 :(得分:7)

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

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

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