【问题标题】:How to implement Unit of work in MVC: Responsibility如何在 MVC 中实现工作单元:责任
【发布时间】:2011-01-15 08:33:11
【问题描述】:

谁有责任


谁负责启动和完成 MVC 架构中的工作单元?

【问题讨论】:

    标签: asp.net-mvc design-patterns architecture unit-of-work


    【解决方案1】:

    这不是控制器的责任,它违反了SRP。控制器甚至根本不应该知道 UoW。在 Web 中,通常使用对服务器的每个请求一个 UoW。在这种情况下,UoW 应该在请求结束时处理,并在请求开始之后的某个地方开始(理想情况下,UoW 的开始应该是惰性的)。执行此操作的最佳位置是使用 Application_EndRequest 和 Application_BeginRequest 处理程序的 Global.asax(或您的 HttpApplication 类)。
    这可以通过 IOC 框架轻松实现(我最喜欢的是 Windsor),有关实现细节,请参阅 this question

    【讨论】:

    • @zihotki - 在您的设计中,什么向工作单元添加了命令?
    • @Jeff,请求中的所有命令/服务/存储库共享(并属于)同一个 UoW。如果命令/服务/存储库需要直接引用 UoW(例如,NHibernate 中的 Session,或 EF 中的 DataContext),则应由 IOC 注入。它应该如何注入(setter 或构造函数或通过直接调用 IOC)取决于您的架构。
    • “执行此操作的最佳位置是使用 Application_EndRequest 和 Application_BeginRequest 处理程序的 Global.asax(或您的 HttpApplication 类)。”或者您可以获取一个新的 httpmodule 来挂钩这些事件,并为每个请求提供一个 nHibernateSession 对象。我同意明确控制 UoW 与 SRP 相违背,但最终 U 在页面的上下文中。不错的答案:) +1
    • 单元测试怎么样?您将如何以这种方式对工作单元进行单元测试?
    • @Rushino,我将测试命令和服务,并在“测试前”事件中为每个测试创建一个 UoW,并在“测试后”事件中关闭它。但具体的实现将取决于命令或服务的实现
    【解决方案2】:

    控制器。这将获取上下文,因此您可以开始和完成工作单元。例如,每个请求的 nHibernate 会话需要您知道请求何时开始和完成,因此您需要上下文来为您提供请求。

    【讨论】:

    • +1 谢谢马克!无论如何,我将等待更多关于:)的意见
    • 这很酷,很难说出您想要的答案是什么,因为查看工作单元的方法不止一种。有些人将其作为页面渲染的全部工作,其他人则具有可以由其他类处理的事务范围。即使对于更细粒度的情况,我认为让控制器负责它最终可以归还(处置或其他)的资源是件好事。也许您可以发布更多内容,我可以尝试给出更好的答案。谢谢:)
    • 感谢您的回答 Mark :) 好吧,在面向工作单元的请求中。我想你是对的。我只是相信可能有一些事情没有考虑到。 : ) -IE。我没有在面向交易的 UoW 中:P- 再次感谢
    • 更新:见 Zihotki 声明。
    【解决方案3】:

    我是松耦合架构的信徒。我的控制器对存储库、上下文或工作单元一无所知。我创建了控制器调用的服务层(不确定这是正确的术语)。然后,此服务与存储库 (dll) 一起使用以保存所有数据。

    【讨论】:

      【解决方案4】:

      正如 zihotki 所说,如果您将此责任交给控制器,您将违反 SRP。这是一种面向数据操作的模式,因此不应该成为控制器的关注点……这将导致两种违规行为:一种违反 SRP,另一种违反 SoC 原则。

      至于谁负责,那是由你的架构来定义的。 StartRequest/EndRequest 建议似乎足够可靠。

      【讨论】:

      • 谢谢 Jose +1 我也同意 StartRequest/EndRequest。
      猜你喜欢
      • 2011-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-23
      • 1970-01-01
      • 1970-01-01
      • 2021-01-14
      • 1970-01-01
      相关资源
      最近更新 更多