【问题标题】:Where To Call UnitOfWork.Commit() In A Asp.Net MVC Application在 Asp.Net MVC 应用程序中调用 UnitOfWork.Commit() 的位置
【发布时间】: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


    【解决方案1】:

    您的控制器应如下所示:

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

    • EntityFrameworkUnitOfWork : IUnitOfWork
    • InMemoryUnitOfWork : IUnitOfWork

    因此,在进行单元测试时 - 只需注入 InMemoryUnitOfWork(例如,将更改提交到静态 List<T>

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-12
        • 2012-09-06
        • 2010-12-06
        • 1970-01-01
        • 2012-10-23
        相关资源
        最近更新 更多