在 Asp.Net MVC 应用程序中我应该在哪里调用Commit()
我的 UnitOfWork?并且仍然保持我的控制器单元可测试。
我使用 HttpModule 吗?创建一个基本控制器并使用OnActionExecuted
?或 Global.asax: Application_EndRequest()
?
在 Asp.Net MVC 应用程序中我应该在哪里调用Commit()
我的 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。
当您考虑它时 - Web 应用程序上下文中的工作单元通常是 HTTP 请求。
并且一个 HTTP 请求只针对一种操作方法来执行工作。当然,您有 PRG 模式(之后重定向到 HttpGet 操作) - 但[HttpPost]
每个 HTTP 请求应该只有 1 个操作调用。
因此,在操作方法级别提交 UoW 是有意义的。
您应该有两个 IUnitOfWork 实现:
因此,当单元测试时 - 只需注入 InMemoryUnitOfWork (例如,将更改提交到 static List<T>
)
听起来您的 UI 应该将commit
调用发送到域控制器,然后域控制器应该将调用传递给域层中的相关方。