我知道这个问题之前曾被问过几次,但我无法得到我想要的答案。 所以,我已经实现了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
答案 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()
。