Lou*_*uis 20 model-view-controller domain-driven-design
我正在为我的MVC的M部分应用DDD,并经过一些研究(研究!),我已经意识到我需要我的控制器与域服务(在模型中)进行交互.这将使我的控制器成为域服务的使用者,因此也是应用程序服务(以DDD术语).这准确吗?控制器与DD定义为应用程序服务之间是否存在差异?
控制器不被视为DDD中的服务.控制器在UI层中运行.应用程序服务从数据库获取数据,验证数据,将数据传递给客户端(MVC可以是客户端,但是来自winforms应用程序的请求也是如此)等.
所有控制器正在做的是处理来自UI的请求.它不属于应用程序域.
分层架构将应用程序拆分为 UI 层、应用层、领域层和基础设施层(Vaugn Vernons 实施领域驱动设计(位置 2901))。控制器属于这个更广泛的设计架构的“应用层”,因此将直接与模型中的域服务交互,并被视为应用程序服务。不仅如此,它显然还将使用可用的实体和聚合。
应用程序层位于域层和表示层之间。控制器是表示层的一部分,将命令或查询发送到应用程序层,在此应用程序服务使用域模型的服务和对象执行命令或查询。因此,控制器与应用程序服务不同,它们可能绑定到实际的通信形式,例如HTTP。您不应直接从控制器调用域服务,这可能是代码放错位置的迹象。
- 域服务:封装业务逻辑,这些业务逻辑自然不适合域对象,并且不是典型的CRUD操作-那些属于存储库。
- 应用程序服务:供外部使用者用来与您的系统对话(例如Web服务)。如果消费者需要访问CRUD操作,则可以在此处找到他们。
因此,您的服务可能是应用程序服务,而不是域服务,或某些部分应用程序服务,某些部分域服务。您应该检查并重构代码。我想四年后没关系,但是我对当前正在开发的应用程序有相同的想法。这个应用程式可能太小,无法在其上使用DDD,因此将控制器与应用程式服务混淆是过度工程的迹象。
何时开始添加更多层是一个有趣的问题。我认为每个应用程序都应从某种域模型和适配器开始,以连接到该域模型。因此,如果应用程序足够简单,则可能无需添加两个以上的层。但这只是一个想法,我对DDD并不了解。