为什么ExportLifetimeContext<T>
存在?它是为了什么?为什么有必要在这个目标上调用Dispose?我真的需要打扰它吗?如果我不得不花时间考虑资源管理,它感觉不到很好,对我来说感觉不太好。
这种处置是否与Value属性相关联?去CreateExport().Value
是否存在特定问题?
答案 0 :(得分:9)
当你要求ExportFactory
创建一个新对象时,MEF实际上也可能创建依赖关系,以及这些依赖关系的依赖关系等等。可能会创建许多对象,因为您要求使用单个对象。
其中一些额外的对象可能是IDisposable
,容器负责在不再需要时处置它们。
要向容器发出使用您的对象的信号,请致电ExportLifetimeContext<T>.Dispose()
。然后,如果需要,MEF容器将负责处理请求的对象及其依赖项。如果你不这样做,MEF将永远保留对这些对象的引用,等待它可以处理它们的信号。
在Autofac 2中,存在一种非常相似的机制。他们使用ExportFactory
代替Func<Owned<T>>
,您需要致电Owned<T>.Dispose()
进行清理。
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()
{
...
}
}