ExportLifetimeContext <T>

Joh*_*ren 4 mef

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

这种处置是否与Value属性相关联?刚刚去的特定问题是CreateExport().Value什么?

Wim*_*nen 9

当您要求ExportFactory创建新对象时,MEF实际上可能还会创建依赖项,以及这些依赖项的依赖项等.由于您要求单个对象,因此可能会创建许多对象.

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

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

在Autofac 2中,存在非常类似的机制.而不是ExportFactory,他们使用Func<Owned<T>>,你需要打电话Owned<T>.Dispose()来清理.


编辑:MEF文档有一个零件生命周期部分,其中描述了在哪些情况下容器确实保留对导出的引用.它还没有提到,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()
    {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @John MEF专为开放式系统而设计,因此这背后的想法是,在编写零件时,您无法知道其进口的传递闭合中的任何部分是否需要处理.因此,当在开放式系统中使用ExportFactory时,您应该始终处置生命周期上下文.如果你只编写你创建的部分并且你知道它们都不是IDisposable那么就可以不调用Dispose. (2认同)