【发布时间】:2011-05-29 08:05:50
【问题描述】:
要在域驱动设计中执行 CRUD 操作,我是否需要为每个根聚合创建一个 域服务,该服务将具有 store 方法,该方法将调用 repository 接口,该接口在基础设施层。这是正确的方法吗。 如果我错了,请纠正我。
【问题讨论】:
-
在我看来,您不需要那个“域服务”,因为它只会将责任委托给存储库,而不是其他任何东西。为什么不直接调用存储库?
要在域驱动设计中执行 CRUD 操作,我是否需要为每个根聚合创建一个 域服务,该服务将具有 store 方法,该方法将调用 repository 接口,该接口在基础设施层。这是正确的方法吗。 如果我错了,请纠正我。
【问题讨论】:
CRUD 不适用于域驱动设计。在领域驱动设计中,您使用领域的动词和名词。而不是“创建新订单”,您有一个“下订单”的用户聚合根。如果您的系统充满了 CRUD 操作,那么您并没有像应该使用的那样使用领域驱动设计,相反,您只是给原本简单的问题增加了复杂性。
管理屏幕是 CRUD 的理想选择。您有一些项目列表,其中添加或修改没有需要强制执行的业务(域)规则。它只是简单的“插入新行,修改该行,删除该行”。
订单处理系统更加复杂,并将开始受益于领域驱动设计。 “下订单”。 “支付订单”。 “下订单并完成付款后,开始发货流程”。这些具有需要在域中建模的复杂规则,因此,域驱动设计是一个很好的候选者。
【讨论】:
我基本同意:
存储库接口是模型层的一部分,并在基础设施层中实现。但请记住,存储库就像收集和存储完整的对象。它们不像持久层那样建模,因此不能存储聚合根的一部分。要构建复杂的聚合根,可以使用工厂。
还请记住,有效的设计必须依赖于所使用的(持久性)技术。
【讨论】: