Asp.net mvc 4 Asp.net MVC4,在unitofwork中调用dispose()
我有一个unitofwork类,我以为Dispose()方法会被自动调用,但事实并非如此Asp.net mvc 4 Asp.net MVC4,在unitofwork中调用dispose(),asp.net-mvc-4,unit-of-work,Asp.net Mvc 4,Unit Of Work,我有一个unitofwork类,我以为Dispose()方法会被自动调用,但事实并非如此 public class UnitOfWork : IDisposable { private DBContext context = new DBContext(); private GenericRepository<Users> usersRepository; public GenericRepository<Users> UsersRepositor
public class UnitOfWork : IDisposable
{
private DBContext context = new DBContext();
private GenericRepository<Users> usersRepository;
public GenericRepository<Users> UsersRepository
{
get
{
if (this.usersRepository == null)
{
this.usersRepository = new GenericRepository<Users>(context);
}
return usersRepository;
}
}
public void Save()
{
context.SaveChanges();
}
private bool disposed = false;
protected virtual void Dispose(bool disposing)
{
if (!this.disposed)
{
if (disposing)
{
Debug.WriteLine("This never be called :( ");
context.Dispose();
}
}
this.disposed = true;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
如果希望自动调用Dispose,则需要包装在using语句中
using(var uow = new UnitOfWork()){
..do stuff
}
在using语句末尾,如果对象具有IDisposable接口,编译器将在生成的Finally块中调用Dispose函数。否则,如果没有using语句,则需要手动调用dispose函数
为了响应您的编辑…我不确定~UserController()的作用(我从未见过这种语法?您是否试图在构造函数中进行dispose?总之,使用下面的示例,您将看到dispose方法被正确调用
public class UserController : Controller
{
private UnitOfWork unitofwork;
public UserController(){
unitofwork = new UnitofWork();
}
public ActionResult DoStuff(){
var model = unitofwork.DoWork();
unitofwork.Dispose();
return View(model);
}
}
如果希望自动调用Dispose,则需要包装在using语句中
using(var uow = new UnitOfWork()){
..do stuff
}
在using语句结束时,如果对象具有IDisposable接口,编译器将调用生成的Finally块中的Dispose函数。否则,如果没有using语句,则需要手动调用Dispose函数
为了响应您的编辑…我不确定~UserController()的作用(我从未见过这种语法?您是否试图在构造函数中进行dispose?总之,使用下面的示例,您将看到dispose方法被正确调用
public class UserController : Controller
{
private UnitOfWork unitofwork;
public UserController(){
unitofwork = new UnitofWork();
}
public ActionResult DoStuff(){
var model = unitofwork.DoWork();
unitofwork.Dispose();
return View(model);
}
}
类控制器是一次性的,并且在每个请求结束时销毁。有关更多信息,您可以阅读 因此,您可以重写他的Dispose方法来销毁您自己的unitOfWork:
public class HomeController : Controller
{
private readonly UnitOfWork _unitOfWork = new UnitOfWork();
public ActionResult Index()
{
var homeViewModel = new HomeViewModel {Users = _unitOfWork.UserRepository.LastUsers()};
return View(homeViewModel);
}
protected override void Dispose(bool disposing)
{
_unitOfWork.Dispose();
base.Dispose(disposing);
}
}
类控制器是一次性的,并且在每个请求结束时销毁。有关更多信息,您可以阅读 因此,您可以重写他的Dispose方法来销毁您自己的unitOfWork:
public class HomeController : Controller
{
private readonly UnitOfWork _unitOfWork = new UnitOfWork();
public ActionResult Index()
{
var homeViewModel = new HomeViewModel {Users = _unitOfWork.UserRepository.LastUsers()};
return View(homeViewModel);
}
protected override void Dispose(bool disposing)
{
_unitOfWork.Dispose();
base.Dispose(disposing);
}
}
谢谢你的回答,我只是这样尝试,~UserController{unitofwork.Dispose();},但它也从未调用过。hhh它不能为Controller设置析构函数方法吗?你能用你尝试过的内容更新你的问题吗?我从评论中看不出你真正尝试了什么。我认为你不能依赖~UserController()因为您不知道GC何时会确定控制器准备好收集,可能在您的请求返回后很久。将UofW作为类字段也只允许GC在释放控制器时处理对象。我认为最好将UofW包装在using语句中,并将其范围保持在y所在的操作中您正在尝试使用它。如果您确实需要它来跨越操作或控制器,那么您可以考虑将其添加到IOC容器中,并让DI控制寿命。谢谢您的回答,我只是这样尝试,~UserController{unitofwork.Dispose();},但它也从未调用过。hhh它是否无法为控制器设置析构函数方法?能否用您尝试的内容更新您的问题?我无法从评论中真正看到您尝试了什么。我认为您不能依赖~UserController()因为您不知道GC何时会确定控制器准备好收集,可能在您的请求返回后很久。将UofW作为类字段也只允许GC在释放控制器时处理对象。我认为最好将UofW包装在using语句中,并将其范围保持在y所在的操作中你正在尝试使用它。如果你确实需要它来跨越动作或控制器,那么你可以考虑将它添加到IOC容器中,让DI来控制寿命。