【发布时间】:2013-09-09 12:45:03
【问题描述】:
我正在为 MVC 的 M 部分应用 DDD,经过一些研究(正在学习!),我意识到我需要我的控制器与域服务(在模型中)进行交互。这将使我的控制器成为域服务的消费者,因此成为应用程序服务(在 DDD 术语中)。这是准确的吗?控制器和 DD 定义的应用服务有区别吗?
【问题讨论】:
标签: model-view-controller domain-driven-design
我正在为 MVC 的 M 部分应用 DDD,经过一些研究(正在学习!),我意识到我需要我的控制器与域服务(在模型中)进行交互。这将使我的控制器成为域服务的消费者,因此成为应用程序服务(在 DDD 术语中)。这是准确的吗?控制器和 DD 定义的应用服务有区别吗?
【问题讨论】:
标签: model-view-controller domain-driven-design
控制器在 DDD 中不被视为服务。控制器在 UI 层中运行。应用程序服务从数据库获取数据、验证数据、将数据传递给客户端(MVC 可以是客户端,但来自 winforms 应用程序的请求也可以)等等。
控制器所做的只是为来自 UI 的请求提供服务。它不属于应用程序域。
【讨论】:
应用层位于领域层和表示层之间。控制器是表示层的一部分,向应用程序层发送命令或查询,应用程序服务使用域模型的服务和对象执行它们。所以控制器不同于应用服务,它们可能与实际的通信形式绑定,例如HTTP。你不应该直接从控制器调用域服务,这可能是错误代码的标志。
Domain Driven Design: Domain Service, Application Service
- 域服务:封装不适合域对象的业务逻辑,并且不是典型的 CRUD 操作 - 这些将属于存储库。
- 应用程序服务:由外部消费者用来与您的系统对话(想想 Web 服务)。如果消费者需要访问 CRUD 操作,它们会暴露在这里。
因此,您的服务可能是应用程序服务而不是域服务,或者某些部分应用程序服务,某些部分域服务。您应该检查并重构您的代码。我想 4 年后这并不重要,但我目前正在开发的应用程序也有同样的想法。这个应用程序可能太小而无法在其上使用 DDD,因此将控制器与应用程序服务混淆是这里过度设计的标志。
何时开始添加更多层是一个有趣的问题。我认为每个应用程序都应该以某种domain model and adapters 开头以连接到该域模型。因此,如果应用程序足够简单,则可能不需要添加 2 层以上。但这只是一个想法,我对 DDD 的经验并不丰富。
【讨论】:
分层架构将应用程序拆分为 UI 层、应用程序层、领域层和基础设施层(Vaugn Vernons 实施领域驱动设计(位置 2901))。控制器属于这种更广泛的设计架构的“应用层”,因此将直接与模型中的域服务交互,并被视为应用服务。不仅如此,它显然还将使用可用的实体和聚合。
【讨论】:
在DDD Reference 中根本没有提到控制器。所以我认为从 DDD POV 答案是不确定的。所以我会考虑更实际的问题:“我们是否需要分离控制器和应用程序服务”?
优点:
缺点:
所以如果输入处理混淆了用例逻辑,我会选择控制器和应用程序服务的分离。如果两者都足够简单,我会选择将用例逻辑保留在控制器中,以便您可以轻松地在代码用例中看到与输入处理分开的情况。
【讨论】: