ExportLifetimeContext <T> </T>

时间:2010-07-14 05:42:44

标签: mef

为什么ExportLifetimeContext<T>存在?它是为了什么?为什么有必要在这个目标上调用Dispose?我真的需要打扰它吗?如果我不得不花时间考虑资源管理,它感觉不到很好,对我来说感觉不太好。

这种处置是否与Value属性相关联?去CreateExport().Value是否存在特定问题?

1 个答案:

答案 0 :(得分:9)

当你要求ExportFactory创建一个新对象时,MEF实际上也可能创建依赖关系,以及这些依赖关系的依赖关系等等。可能会创建许多对象,因为您要求使用单个对象。

其中一些额外的对象可能是IDisposable,容器负责在不再需要时处置它们。

要向容器发出使用您的对象的信号,请致电ExportLifetimeContext<T>.Dispose()。然后,如果需要,MEF容器将负责处理请求的对象及其依赖项。如果你不这样做,MEF将永远保留对这些对象的引用,等待它可以处理它们的信号。

在Autofac 2中,存在一种非常相似的机制。他们使用ExportFactory代替Func<Owned<T>>,您需要致电Owned<T>.Dispose()进行清理。

<小时/> 编辑:MEF文档有一个Parts lifetime部分,其中描述了容器在哪些情况下保留对导出的引用。它还没有提到ExportLifetimeContext.Dispose,但我想这与CompositionContainer.ReleaseExport类似。
修改:请注意ExportFactory适用于您有明确定义的生命周期的情况。如果不是这种情况(或者您知道永远不需要清理),那么您应该创建自己的工厂实现。当然,您有责任确保不会创建任何IDisposable,因为无法正确清理它。

以下是使用Func<T>自定义工厂导入/导出的示例。

[Export(typeof(ISomeInterface))]
public class SomeClass
{
    private readonly Func<Foo> fooFactory;

    [ImportingConstructor]
    public SomeClass(Func<Foo> fooFactory)
    {
        this.fooFactory = fooFactory;
    }

    public void DoStuff()
    {
       Foo newFoo = fooFactory();
       ...
    }
}

public class FooFactory
{
    [Export(typeof(Func<Foo>))]
    public void CreateFoo()
    {
        ...
    }
}