Commit()
Asp.Net MVCアプリのUnitOfWorkはどこに呼び出す必要がありますか?それでも、コントローラーユニットをテスト可能にしてください。
HttpModuleを使用しますか?ベースコントローラーを作成して使用しOnActionExecuted
ますか?またはGlobal.asax Application_EndRequest()
:?
Commit()
Asp.Net MVCアプリのUnitOfWorkはどこに呼び出す必要がありますか?それでも、コントローラーユニットをテスト可能にしてください。
HttpModuleを使用しますか?ベースコントローラーを作成して使用しOnActionExecuted
ますか?またはGlobal.asax Application_EndRequest()
:?
コントローラは次のようになります。
[HttpPost]
public ActionResult SubmitOrder(Order o)
{
try
{
repository.Add(o);
unitOfWork.Commit();
}
catch (YourCustomExceptionClass exc)
{
ModelState.AddError(exc.ToString());
}
return View();
}
unitOfWorkは、コントローラーレベルで次のように宣言する必要があります。
IUnitOfWork unitOfWork;
そして、コントローラーのctorに注入されます-できればHTTPリクエストごとにDIを使用します。
あなたがそれについて考えるとき-ウェブアプリケーションの文脈での作業の単位は通常HTTPリクエストです。
また、HTTPリクエストは、作業を実行するための1つのアクションメソッドのみに送信されます。もちろん、PRGパターンがあります(後でHttpGetアクションにリダイレクトします) 。ただし、 [HttpPost]
HTTPリクエストごとに1つのアクション呼び出しのみが必要です。
したがって、アクションメソッドレベルでUoWをコミットすることは理にかなっています。
IUnitOfWorkの2つの実装が必要です。
したがって、単体テストの場合は、InMemoryUnitOfWorkを挿入するだけです(List<T>
たとえば、変更を静的にコミットします)
UIがcommit
呼び出しをドメインコントローラーに送信し、ドメインコントローラーがドメインレイヤーの関係者に呼び出しを渡す必要があるようです。