2

在 Asp.Net MVC 应用程序中我应该在哪里调用Commit()我的 UnitOfWork?并且仍然保持我的控制器单元可测试。

我使用 HttpModule 吗?创建一个基本控制器并使用OnActionExecuted?或 Global.asax: Application_EndRequest()?

4

2 回答 2

4

您的控制器应如下所示:

[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 实现:

  • EntityFrameworkUnitOfWork : IUnitOfWork
  • InMemoryUnitOfWork : IUnitOfWork

因此,当单元测试时 - 只需注入 InMemoryUnitOfWork (例如,将更改提交到 static List<T>

于 2010-12-16T22:35:07.707 回答
0

听起来您的 UI 应该将commit调用发送到域控制器,然后域控制器应该将调用传递给域层中的相关方。

于 2010-12-16T22:30:57.110 回答