代码之家  ›  专栏  ›  技术社区  ›  John Leidegren

exportlifetimecontext<t>

mef
  •  4
  • John Leidegren  · 技术社区  · 14 年前

    为什么 ExportLifetimeContext<T> 存在?它是用来干什么的?为什么有必要对这个对象调用Dispose?我真的需要麻烦打电话吗?如果我不得不花时间考虑资源管理,我会觉得管理不是很好,对我来说管理不是很好。

    是否仍将此Dispose绑定到Value属性?刚才去有什么特别的问题吗 CreateExport().Value ?

    1 回复  |  直到 14 年前
        1
  •  9
  •   Wim Coenen    14 年前

    当你问一个 ExportFactory 为了创建一个新的对象,MEF实际上还可以创建依赖项,以及这些依赖项的依赖项,等等。可能会创建许多对象,因为您要求一个对象。

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

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

    在Autofac2中,存在一种非常相似的机制。而不是 出口工厂 他们使用 Func<Owned<T>> 你需要打电话 Owned<T>.Dispose() 清理。


    编辑 :MEF文档具有 Parts lifetime 在其中描述它的部分,在这种情况下,容器保持对导出的引用。它还没有提到 ExportLifetimeContext.Dispose 但我想这和 CompositionContainer.ReleaseExport .
    编辑 注意: 出口工厂 适用于您有明确定义的寿命的情况。如果不是这样(或者您知道清理永远都不必要),那么您应该创建自己的工厂实现。当然,你有责任确保 不可分的 是创造出来的,因为不可能把它清理干净。

    下面是一个使用 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()
        {
            ...
        }
    }