让我们说在运行时我创建了一个对象,它将包含几个IDisposable。据我所知,最好为该对象创建一个生命周期范围,以便所有一次性用品都能自动清理。
但我究竟如何创建范围?这不需要传递容器或使其成为全局变量吗? 另外:何时/如何结束终身范围?
以下是我的课程现在的样子,没有范围:
internal class DocumentManager
{
private readonly List<Document> mDocuments;
private readonly Func<Document> mDocumentFactory;
public DocumentManager(Func<Document> documentFactory)
{
mDocumentFactory = documentFactory;
mDocuments = new List<Document>();
}
public void AddDocument()
{
mDocuments.Add(mDocumentFactory.Invoke());
}
public void CloseAllDocuments()
{
mDocuments.Clear(); // -> Memory leak!
}
}
internal class Document
{
private List<NativeResource> mNativeResources;
public Document(Func<NativeResource> nativeResourceFactory)
{
// Create some native resources. They will need to be disposed when this object dies?
mNativeResources = new List<NativeResource>();
mNativeResources.Add(mNativeResourceFactory.Invoke());
mNativeResources.Add(mNativeResourceFactory.Invoke());
mNativeResources.Add(mNativeResourceFactory.Invoke());
}
}
答案 0 :(得分:2)
好的,我自己找到了解决方案:
我没有创建文档,只是将工厂改为生成Owned<Document>
。这些可以被处置并获取他们用它们解决的所有本机资源。
真的很简单。感谢Autofac: - )