有界上下文共享同一个聚合

Bounded contexts sharing a same aggregate

DDD 公开了限界上下文、领域模型、聚合……但我经常错过业务规则的关键点。我想知道业务规则如何集成到这种方法中。这是一个例子:

假设您在一家信贷公司中有 2 个限界上下文。一个用于追讨债务,另一个用于提前退款。这些上下文嵌入了真实的业务特性。从概念的角度来看,我认为这些有界上下文应该分别嵌入公共模型部分和类似的领域模型实体(3 或 4 个会计实体的图)。即使他们各自的模型嵌入了一个共同的子模型(我们不打算它可以改变),适用于这些子模型的业务规则是不同的。 DebtRecoveryService 确保正确应用规则,而另一个 EarlyFundsService 使用特定的会计规则做同样的事情。

你认为聚合应该只考虑它代表的实体图,而被其他有界上下文"reused"。它适合 CQRS 吗?

谢谢,

很明显,根据 DDD,你应该复制你的模型,当它们被不同的边界域共享时。

此外,服务模式鼓励不要在服务的两端使用相同的对象。

不过。如果您使用 POCO 样式的数据对象并将业务逻辑封装在服务中而不是经典的 OO 对象图方法,那么您本质上是在使用多种模式来保护自己免受同一个问题的影响。

在这种情况下,如果该模型的领域含义随着时间的推移在有界上下文之间漂移,那么拥有共享通用模型的代码重用的好处可能会超过潜在的技术债务。

本质上这可能发生在有界上下文中。我觉得你的问题可以归结为 "Have I chosen the correct bounded contexts?" 这当然是主观的。

一个基本规则是,只有当某些域逻辑似乎不适合任何实体时,才应使用域服务。域服务 并不意味着特定于限界上下文 "watch dogs" 来控制对共享哑数据结构所做的更改。

如果域不变量可以包含在一个聚合中,一定要把它们放在那里——在两个 BC 中有两个具有相似数据但不同规则的聚合是正常的,这就是为什么你首先要有限界上下文的原因。

附带说明一下,限界上下文设计不是您应该即兴创作的东西。我强烈推荐阅读原始蓝皮书中描述的战术 战略模式以及 Vaughn Vernon 的红皮书。

上下文映射或共享内核等模式,仅举几例,是设计限界上下文时需要了解的有用工具。 BC 设计不仅取决于业务问题,还取决于组织因素,例如哪些团队将维护上下文、历史因素(遗留上下文与新建上下文)等。

您将在书中了解所有这些内容以及大量其他重要内容,这有望消除您似乎陷入的困惑。