DDD:所有聚集的根都需要孩子吗?

时间:2014-10-31 14:14:35

标签: domain-driven-design aggregateroot

到目前为止我在DDD上阅读的所有内容都暗示只有封装其他实体的实体才是根聚合。

在以下情况下怎样:

WorkOrder
 - idManufacturer
 - WONumber
 - Description

Manufacturer
 - idSelf
 - Name

WorkOrder引用制造商,但不会是WorkOrder的子项,因为其他实体可能引用WorkOrder,在这种情况下,我会考虑两个Root实体,但制造商不是聚合...

这是对的吗?

3 个答案:

答案 0 :(得分:1)

当有人告诉我没有孩子的实体可以作为聚合根时,我曾经有过DDD的灯泡时刻。

特别是当有人说"只保留你的聚合根源时,#34;。

在您的示例中,您的聚合根是WorkOrderManufacturer。您拥有WorkOrder的存储库和Manufacturer的存储库。

答案 1 :(得分:1)

实际上,您通常只会使用值对象进行聚合。有儿童情绪的AR很少见。阅读红皮书(实施DDD Vaughn Vernon),描述了小聚合的规则。

答案 2 :(得分:0)

聚合根的作用是封装和强制不变量。它可能包含其他对象,但它们都通过AR进行交互。关于聚合的重要事项是,它应该独立于您选择的持久性机制。你的大多数聚合应该没有依赖关系!

我可能会弄错,但看起来idManufacturer是外键。这将建议(并非总是如此)它没有被封装。让我流连忘返的事情是聚合中的字段是私有的。这引发了一个问题,即如何保存它的状态以及如何将数据放到UI上。有很多方法可以解决这个问题。我首选的方法是使用Event Sourcing和CQRS。然后,我可以根据我的聚合生成的事件构建UI。我也可以坚持这些事件并使用它们来重建我的聚合。

我在博客上进行了更深入的研究,您可能需要查看How to Build an Aggregate Root! 。您还可以在使用CQRS和事件采购时找到有关构建主详细信息屏幕的帖子,这可以找到here

我希望有所帮助。