如何在工作单元模式中正确使用Dispose?

时间:2017-06-03 15:11:26

标签: entity-framework repository unit-of-work

我知道这个问题之前曾被问过几次,但我无法得到我想要的答案。 所以,我已经实现了Repository(通用)和UOW模式,所以我可以使用EF访问我的数据库。这是UnitOfWork类的一部分:

    protected virtual void Dispose(bool disposing)
    {
        if (!disposed)
        {
            if (disposing)
            {
                entities.Dispose();
            }
        }
        this.disposed = true;
    }

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

问题是:谁在调用void Dispose方法?我没见过使用该方法的例子。

这是工作单位的上半部分:

    private BDEntities entities = null;

    public UnitOfWork()
    {
        if (entities == null)
        {
            entities = new BDEntities();
        }
    }

这是对的吗?我应该使用"使用"?如果是,那么为什么我需要Dispose方法?

你能给我一个正确和简单用法的例子吗?

谢谢你, ROTEM

1 个答案:

答案 0 :(得分:1)

你没有遇到任何关于谁调用dispose的例子的原因是因为UoW通常与依赖注入和依赖注入容器一起使用,例如Autofac。在这种情况下,此容器负责创建对象并在以后处置它们。当然,这不是UoW可以使用的唯一方式,但它是一种常见的模式。

至于回答你的问题:我认为你采取的方法或多或少是对的。 UoW类应该是包装上下文的类,因此它应该是处理它的那个(实际上,DbContext本身是一个UoW)。

您可以简化Dispose方法。由于您没有任何非托管资源(而不是IDisposable资源(如指针),因此完全可以在UoW的Dispose方法中调用上下文的Dispose方法:

 public void Dispose()
 {
   entities.Dispose();
 }

(没有其他Dispose方法,没有SuppressFinalize来电。)

是的,你应该绝对使用using。这正是您需要Dispose()方法的原因;只有具有IDisposable类型的对象才能在using块中使用。如果你编写一个使用块,它基本上转换为try-finally块;你使用的块中的代码进入try块,最后,调用Dispose()