Domain driven design 管理聚合边界(DDD)
我在理解如何在DDD中分离骨料时遇到问题。至少,我有一个利益冲突,我不知道如何解决。据我所知,在DDD中,聚合被定义为执行不变量/一致性的事务边界。然而,这导致我的总量巨大且难以维持 我的用例是一个处理电子商务订单的系统。基于业务需求的基本流程如下:Domain driven design 管理聚合边界(DDD),domain-driven-design,Domain Driven Design,我在理解如何在DDD中分离骨料时遇到问题。至少,我有一个利益冲突,我不知道如何解决。据我所知,在DDD中,聚合被定义为执行不变量/一致性的事务边界。然而,这导致我的总量巨大且难以维持 我的用例是一个处理电子商务订单的系统。基于业务需求的基本流程如下: 外部系统(购物车)创建一个订单,包含发货地址、账单地址和行项目 通过创建FulfillmentOrder来完成订单,该订单将发送给外部履行服务提供商 外部履行服务发送货物,并为给定履行订单创建一个或多个装运。每次装运包括已装运行项目、出发国(此外部
订单
,包含发货地址、账单地址和行项目FulfillmentOrder
来完成订单,该订单将发送给外部履行服务提供商装运。每次装运包括已装运行项目、出发国(此外部服务的仓库所在国)和目的地国(==装运地址国)
货物创建发票
,增值税/销售税根据货物的出发国和目的国计算
订单
和发货
(因此订单
和发票
)之间的关系是1:多,而不是1:1
基于上面的聚合定义,我将所描述的用例设计为一个有界上下文(订单处理),order
是我的聚合根,Fulfillment order
,shipping
s和Invoice
s是由聚合根管理的实体集合
有几个不变量跨越所有多个实体,例如:
- 所有发票的总额不得超过订单总额
- 您不能创建包含非退出订单项目的发票
- 装运项目数量不得超过触发装运的履行订单的数量
在建模时,您必须小心,以避免假设信息会立即在系统中传播。特别是在接触真实世界的系统中,信息以有限的速度传播,业务流程包括补偿协议。谢谢。我觉得我对聚合的理解是有缺陷的:我认为不变量的强制执行(在任何时候,无论发生什么)是主要特征。您将重点放在时间方面(在运输过程中强制执行不变量),而装运、发票等之间的最终一致性则通过其他方式(业务流程)强制执行。在我上面的示例中,如果存在检查最终不一致性的业务流程,您确实可以将订单、履行订单、装运和发票建模为单独的聚合,分别补偿这些不一致性。