繁体   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