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

How to properly use Dispose in Unit Of Work Pattern?

我知道这个问题已经被问过好几次了,但我找不到我想要的答案。 因此,我已经实现了存储库(通用)和 UOW 模式,因此我可以使用 EF 访问我的数据库。这是 UnitOfWork class 的一部分:

    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方法??我没有看到该方法的用法示例。

这是工作单元的上半部分class:

    private BDEntities entities = null;

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

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

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

谢谢, 罗腾

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

关于回答你的问题:我觉得你的做法或多或少是对的。 UoW class 应该是包装上下文的那个,所以它也应该是处理它的那个(本质上,DbContext 本身就是一个 UoW)。

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

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

(没有其他 Dispose 方法,没有 SuppressFinalize 调用)。

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