2

我有一个 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();
    }
}
4

2 回答 2

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);
    }
}
于 2013-04-10T15:52:43.340 回答
0

Controller 类是 Disposable,在每次请求结束时销毁。有关更多信息,您可以阅读此内容

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);
    }
}
于 2015-03-10T20:17:39.357 回答