我有一个unitofwork类,我认为Dispose()方法会自动调用,但事实并非如此。
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()方法的代码。完成所有交易后,是否需要手动调用Dispose()方法?
我试过这样,但它不起作用。
public class UserController : Controller
{
UnitOfWork unitofwork = new UnitOfWork();
~UserController() {
Debug.WriteLine("This is never called");
unitofwork.Dispose();
}
}
答案 0 :(得分:4)
如果要自动调用Dispose,则需要包含using语句。
using(var uow = new UnitOfWork()){
..do stuff
}
在using语句结束时,如果一个对象有一个IDisposable接口,编译器将在生成的Finally块中调用Dispose函数。否则,如果没有using语句,则需要手动调用dispose函数。
响应你的编辑...我不确定~UserController()做了什么(我从未见过那种语法?你是否试图在你的构造函数中进行处理?无论如何,使用下面的例子,你会看到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);
}
}
答案 1 :(得分:0)
类Controller是Disposable,它在每个请求结束时被销毁。有关更多信息,您只需阅读this
即可public abstract class Controller : ControllerBase, [...] IDisposable, [...]
所以你可以覆盖他的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);
}
}