![](/img/trans.png)
[英]OutputCache setting inside my asp.net mvc web application. Multiple syntax to prevent caching
[英]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方法的问题。
目前我有以下内容:
现在在生成的控制器类中,我得到了这个处理方法:
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);
}
}
任何人都可以这样做:
base.Dispose(disposing);
控制器内部将确保正确处理所有非托管资源。.但是当我将数据访问权限移动到存储库内部时,如何确保存储库消耗的所有非托管资源都已处理? 并在controller类内调用base.Disposed(dispose),是否还会处置存储库类内消耗的所有非托管资源? 任何人都可以这样做吗?
据我所知,您无需执行其他任何操作DbContext
在Repository
类中处置DbContext
。
如果您有更多的资源 Repository
类,那么你将需要添加自己的.Dispose()
调用在Repository.Dispose
,这将是它。
base.Dispose(disposing)
在DeptsController
调用类Dispose
的方法,它的基类 ,即Controller
......是如此的基类可以处理它的内部使用的资源-什么你应该担心。
上下文不应该无限期地保持打开状态。 它们旨在在需要时创建,使用和完成后进行处置。
另外,ASP.NET是一个无状态平台,因此无论如何响应都会被垃圾回收。
因此,您的存储库不需要实现IDispoasable
,因此您的控制器也不需要实现。 在您的存储库的using
块内创建一个DbContext
,它将被自动处置。
然而...
我如何确保处置库消耗的所有非托管资源?
这就是Dispose
目的。 产生可抛弃物体的任何原因均应负责处置它们。 因此,如果您在存储库中创建了可抛弃的对象而不能立即处置(出于某种原因),那么您需要在Dispose
方法中处置它们。 如果您不从可抛弃的基类继承,那么就没有可调用的基类; 否则,您应调用基处置以确保基类处置任何资源
正在在控制器类内部调用
base.Disposed(disposing)
disposebase.Disposed(disposing)
,还将处置存储库类内部消耗的任何非托管资源吗?
否。调用base.Dispose
调用基类的Dispose
方法。 基类不了解存储库,因此调用base.Dispose
不会处理存储库。 当调用repo.Dispose()
时,这是在控制器的Dispose
方法中完成的。
调用base.Dispose(dispose); 控制器内部将确保正确处理所有非托管资源。
好吧,它可以确保处置基类创建的所有非托管(和托管IDisposable
)资源。 由派生的控制器创建的资源应在重写的Dispose
方法中Dispose
(您正在执行)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.