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

}

多くの unitofwork およびリポジトリ チュートリアルで、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 インターフェイスがある場合、コンパイラは生成された Final ブロッ​​クで 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 に答える