在Autofac中创建生命周期范围

时间:2016-09-09 05:41:34

标签: c# .net dependency-injection inversion-of-control autofac

让我们说在运行时我创建了一个对象,它将包含几个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());
    }
}

1 个答案:

答案 0 :(得分:2)

好的,我自己找到了解决方案: 我没有创建文档,只是将工厂改为生成Owned<Document>。这些可以被处置并获取他们用它们解决的所有本机资源。

真的很简单。感谢Autofac: - )