Asp.net mvc 4 Asp.net MVC4,在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

我有一个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,则需要包装在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来控制寿命。