Entity framework 如何正确使用单位工作模式中的配置?

Entity framework 如何正确使用单位工作模式中的配置?,entity-framework,repository,unit-of-work,Entity Framework,Repository,Unit Of Work,我知道这个问题以前被问过好几次,但我没有得到我想要的答案。 因此,我已经实现了存储库(通用)和UOW模式,因此我可以使用EF访问我的数据库。以下是UnitOfWork类的一部分: protected virtual void Dispose(bool disposing) { if (!disposed) { if (disposing) { entities.Disp

我知道这个问题以前被问过好几次,但我没有得到我想要的答案。 因此,我已经实现了存储库(通用)和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);
    }
    private BDEntities entities = null;

    public UnitOfWork()
    {
        if (entities == null)
        {
            entities = new BDEntities();
        }
    }
问题是:谁在调用void Dispose方法??我没有看到使用这种方法的例子

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

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

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }
    private BDEntities entities = null;

    public UnitOfWork()
    {
        if (entities == null)
        {
            entities = new BDEntities();
        }
    }
是这样吗?我应该使用“使用”吗?如果是,为什么我需要Dispose方法

你能给我举一个恰当而简单的用法的例子吗

谢谢,,
Rotem

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

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

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

 public void Dispose()
 {
   entities.Dispose();
 }
(没有其他
Dispose
方法,没有
SuppressFinalize
调用)


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

非常感谢!因此,基本上,该方法应该是这样的:if(entities==null){using(entities=new bsodenties()){};},我并不需要Dispose方法,因为“using”已经封装了它?是吗?是的,我认为基本上应该这样使用。至于Dispose()方法:如果使用using块,则在处理完对象后不必显式调用它。但是您确实需要在类中实现它,如图所示,这样就可以通过using块的封装调用调用它。