我陷入了分析瘫痪的漩涡,试图将DDD应用于各种各样的 我过去开发的应用程序或计划将来做的应用程序。
让我们举个简单的垒球联赛。我们有联赛,球队 属于一个联盟(只有一个),属于一个团队的球员。我知道 这些规则可能会有所不同,但我们只是假装。
我认为这是一个没有联盟的球队,如果你删除了一个 联盟你删除属于它的所有球队(以及球员),所以我有 一个聚合在这里,根是联盟。现在球队也很重要 概念,这是否意味着团队也可以成为自己的聚合根?埃文斯 说明当你删除聚合根时,它的所有内部都会被删除, 所以这会让一支没有父母联盟的球队离开。
如果有人可以发光,我将非常感激。
感谢
答案 0 :(得分:1)
您至少question three询问了非常相似的times。域名总是相同的:运动队,联赛和球员,但你提供的细节总是不同的,这就是你得到和接受不同答案的原因。你显然处于分析状态瘫痪状态。你第一次想出完美模特的可能性很小。开始编写代码和测试,您将立即获得反馈。寻找代码气味,重构和更好的模型将会出现。
关于此版本的问题。汇总definition:
一组关联对象,被视为一个单元 数据变化的目的。外部引用仅限于一个 聚合的成员,指定为根。一套一致性 规则适用于Aggregate的边界。
经典示例是Order as Aggregate root和Order Lines as Entities,它们是Order Aggregate的一部分。请注意,订单行在订单之外没有意义。
在你的情况下,“团队不能没有联盟”的规则是不同的。宣布团队成为League Aggregate的一部分是不够的。它类似于“没有客户的订单不能存在”。这并不意味着客户是订单总数的一部分。客户是它自己的Aggregate,它本身就有意义。就像团队自身有意义一样,它有自己的历史,粉丝等。
这个问题也可以从“数据交换”的角度来解决。在Evan的示例中,整个Order被锁定,以便可以强制执行内部不变量。如果您对联盟进行更改,您是否也希望所有球队和球员都被锁定?
因此,基于您此次提供的信息,您需要两个聚合:联盟和团队。请记住,聚合可以互相引用。