簡體   English   中英

沒有DI的多層MVC Dispose()

[英]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()是否足夠? 還是在每個級別都需要“處置”? 通常,如果我所做的是正確的? 謝謝。

嘗試對創建DbContext進行抽象,看看這個這個

我懷疑存儲庫類是否需要Dispose()邏輯。 那BLL呢? 它有一個上下文對象,但是只是傳遞它呢? 這里是否需要Dispose()邏輯。

不。 不需要。

dbContext不擁有任何昂貴的資源來保證其處置(例如,打開連接)。 檢索數據后,dbContext將立即關閉其連接。 即使在高負載下,性能增益也可以忽略不計。

在DbContext上使用Dispose()的問題

公開dbContext的Dispose()方法會引發將來調用該方法的潛在問題,從而有效地破壞了ORM的目的(無意中殺死了惰性加載器)。 在共享的dbContexts上,此問題將很明顯,在該共享庫中,一個存儲庫將其處置,而其他一些存儲庫可能仍在使用它。

盡管在某些特殊情況下您需要顯式調用dbContext.Dispose(),但在大多數情況下它已經足夠了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM