[英]MVC Dispose() in multi-layer without DI
我目前有一个多层MVC应用程序(Web,BLL,DAL),试图了解如何正确使用DbContext的Dispose。
关于如何使用依赖注入进行操作的信息很多。
我不确定我是否会使用DI。 因此,为什么我要努力弄清到目前为止所做的事情是否正确。
以下是已完成的操作:
网页
在Controller中,实例化DbContext,并使用Dispose()方法。
private MyDbContext _context = new MyDbContext();
...
...
protected override void Dispose(bool disposing)
{
if (disposing)
{
_context.Dispose();
}
base.Dispose(disposing);
}
实例化BLL.service对象并将其传递给DbContext
BLL
实例化DAL.repository对象并将其传递给DbContext
DAL
此类继承自:IDisposable
并包含Dispose方法。
private bool disposed = false;
protected virtual void Dispose(bool disposing)
{
if (!this.disposed)
{
if (disposing)
{
_context.Dispose();
}
}
this.disposed = true;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
上下文原因:
控制器实例化DbContext,并将其传递给存储库类。 这样更好(即共享上下文),而不是每个存储库都实例化它们自己的上下文。
问题:
我怀疑存储库类是否需要Dispose()逻辑。 那BLL呢? 它有一个上下文对象,但是只是传递它呢? 这里是否需要Dispose()逻辑。
即控制器中的Dispose()是否足够? 还是在每个级别都需要“处置”? 通常,如果我所做的是正确的? 谢谢。
我怀疑存储库类是否需要Dispose()逻辑。 那BLL呢? 它有一个上下文对象,但是只是传递它呢? 这里是否需要Dispose()逻辑。
不。 不需要。
dbContext不拥有任何昂贵的资源来保证其处置(例如,打开连接)。 检索数据后,dbContext将立即关闭其连接。 即使在高负载下,性能增益也可以忽略不计。
在DbContext上使用Dispose()的问题
公开dbContext的Dispose()方法会引发将来调用该方法的潜在问题,从而有效地破坏了ORM的目的(无意中杀死了惰性加载器)。 在共享的dbContexts上,此问题将很明显,在该共享库中,一个存储库将其处置,而其他一些存储库可能仍在使用它。
尽管在某些特殊情况下您需要显式调用dbContext.Dispose(),但在大多数情况下它已经足够了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.