[英]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.