簡體   English   中英

為我的asp.net mvc Web應用程序提供一個Repository類。 如何確保我正確處理所有東西

[英]Provide a Repository class for my asp.net mvc web application. How to make sure i am disposing eveything correctly

我在asp.net mvc Web應用程序中實現存儲庫類時,有一個關於如何管理我的Dispose方法的問題。

目前我有以下內容:

  1. 我正在使用VS 2013,並且創建了一個新的asp.net mvc-5 Web應用程序。
  2. 我使用實體框架6.0在我的Web應用程序中映射數據庫表並生成一個.edmx文件。
  3. 我使用“ MVC 5控制器,使用實體框架”支架為我的一個模型對象創建了一個新的Controller類。

現在在生成的控制器類中,我得到了這個處理方法:

 public class DeptsController : Controller
    {
        private ApplicationDbContext db = new ApplicationDbContext();
//code goes here
        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                db.Dispose();
            }
            base.Dispose(disposing);
        }
    }

現在,我想將數據訪問代碼移動到單獨的Repository類中,並在Repository類而不是控制器類內部初始化DbContext對象。

所以我創建了以下存儲庫類:

public class repository

    {
        private ApplicationDbContext db = new ApplicationDbContext();
        //code goes here...
        public void Dispose()
        {
            db.Dispose();
        }

我將控制器類修改為使用存儲庫類,如下所示:

 public class DeptsController : Controller
    {
        //private ApplicationDbContext db = new ApplicationDbContext();
        private repository repo = new repository();
        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                repo.Dispose();
            }
            base.Dispose(disposing);
        }
    }

任何人都可以這樣做:

  1. 由於我將把數據訪問邏輯移到我的存儲庫中,所以除了DbContext外還需要處理什么? 我的意思是在使用Repository之前,先調用base.Dispose(disposing); 控制器內部將確保正確處理所有非托管資源。.但是當我將數據訪問權限移動到存儲庫內部時,如何確保存儲庫消耗的所有非托管資源都已處理? 並在controller類內調用base.Disposed(dispose),是否還會處置存儲庫類內消耗的所有非托管資源?

任何人都可以這樣做嗎?

據我所知,您無需執行其他任何操作DbContextRepository類中處置DbContext

如果您有更多的資源 Repository類,那么你將需要添加自己的.Dispose()調用在Repository.Dispose ,這將是它。

base.Dispose(disposing)DeptsController調用類Dispose的方法,它的基類 ,即Controller ......是如此的基類可以處理它的內部使用的資源-什么你應該擔心。

上下文不應該無限期地保持打開狀態。 它們旨在在需要時創建,使用和完成后進行處置。

另外,ASP.NET是一個無狀態平台,因此無論如何響應都會被垃圾回收。

因此,您的存儲庫不需要實現IDispoasable ,因此您的控制器也不需要實現。 在您的存儲庫的using塊內創建一個DbContext ,它將被自動處置。

然而...

我如何確保處置庫消耗的所有非托管資源?

這就是Dispose目的。 產生可拋棄物體的任何原因均應負責處置它們。 因此,如果您在存儲庫中創建了可拋棄的對象而不能立即處置(出於某種原因),那么您需要在Dispose方法中處置它們。 如果您不從可拋棄的基類繼承,那么就沒有可調用的基類; 否則,您應調用基處置以確保基類處置任何資源

正在在控制器類內部調用base.Disposed(disposing) dispose base.Disposed(disposing) ,還將處置存儲庫類內部消耗的任何非托管資源嗎?

否。調用base.Dispose調用基類的Dispose方法。 基類不了解存儲庫,因此調用base.Dispose不會處理存儲庫。 當調用repo.Dispose()時,這是在控制器的Dispose方法中完成的。

調用base.Dispose(dispose); 控制器內部將確保正確處理所有非托管資源。

好吧,它可以確保處置基類創建的所有非托管(和托管IDisposable )資源。 由派生的控制器創建的資源應在重寫的Dispose方法中Dispose (您正在執行)。

暫無
暫無

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

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