Asp.net MVC4,在unitofwork中调用dispose()

时间:2013-04-10 15:50:51

标签: 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> 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();
    }
}

2 个答案:

答案 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);
    }
}