gpt4 book ai didi

mef - 导出LifetimeContext

转载 作者:行者123 更新时间:2023-12-04 17:17:06 25 4
gpt4 key购买 nike

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

无论如何,此处置是否与 Value 属性相关联?只是去 CreateExport().Value 是否有具体问题? ?

最佳答案

当您询问 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()
{
...
}
}

关于mef - 导出LifetimeContext<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3243642/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com