【发布时间】:2010-12-16 22:24:45
【问题描述】:
我应该在 Asp.Net MVC 应用程序中的 UnitOfWork 上哪里调用 Commit()?并且仍然保持我的控制器可单元测试。
我是否使用 HttpModule?创建一个基本控制器并使用OnActionExecuted?或 Global.asax:Application_EndRequest()?
【问题讨论】:
标签: asp.net-mvc entity-framework unit-of-work
我应该在 Asp.Net MVC 应用程序中的 UnitOfWork 上哪里调用 Commit()?并且仍然保持我的控制器可单元测试。
我是否使用 HttpModule?创建一个基本控制器并使用OnActionExecuted?或 Global.asax:Application_EndRequest()?
【问题讨论】:
标签: asp.net-mvc entity-framework unit-of-work
您的控制器应如下所示:
[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。
仔细想想 - Web 应用程序上下文中的工作单元通常是 HTTP 请求。
并且一个 HTTP 请求只被定向到一个操作方法来执行工作。当然,您有 PRG 模式(之后重定向到 HttpGet 操作)-但每个 HTTP 请求应该只有 1 个 [HttpPost] 操作调用。
因此,在操作方法级别提交 UoW 是有意义的。
你应该有两个 IUnitOfWork 实现:
因此,在进行单元测试时 - 只需注入 InMemoryUnitOfWork(例如,将更改提交到静态 List<T>)
【讨论】:
听起来您的 UI 应该将 commit 调用发送到域控制器,然后域控制器应该将调用传递给域层中的相关方。
【讨论】: