2014-10-31 41 views
1

迄今为止我所读到的关于DDD的一切都意味着只有封装其他实体的实体才是根集合。DDD:所有聚合根需要孩子吗?

怎么样在这样的情况:

WorkOrder 
- idManufacturer 
- WONumber 
- Description 

Manufacturer 
- idSelf 
- Name 

工单的引用制造商,但不会是工单的孩子其他实体可能会引用工单,在这种情况下,我会考虑这两个根实体,但厂家不一个聚合...

这是正确的吗?

+0

什么是你有界的上下文,并且用户可以直接与制造商交互? – 2014-10-31 17:07:02

+0

也许[我的帖子](http://www.sapiensworks.com/blog/post/2014/10/31/DDD-Identifying-Bounded-Contexts-and-Aggregates-Entities-and-Value-Objects.aspx)将帮助您更好地了解如何识别聚集体和聚集体根(AR)。顺便说一句AR与儿童的概念无关 – MikeSW 2014-11-01 16:06:58

回答

1

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

特别是当有人说“坚持只有你的聚合根”。

在你的例子中,你的聚合根是WorkOrderManufacturer。您需要一个WorkOrder的存储库和一个Manufacturer的存储库。

1

实际上,您将只能使用值对象进行聚合。带小孩的AR很少见。阅读红皮书(实施DDD Vaughn Vernon),描述了小聚合体的规则。

0

聚合根的工作是封装和执行不变量。它可能由其他对象组成,但它们都通过AR进行交互。关于聚合记住的重要事情是,它应该独立于您选择的持久性机制。大部分聚合应该没有依赖关系!

我可能会误解,但它看起来像idManufacturer是一个外键。这将建议(并非总是如此)它不封装。这让我花了一段时间才想到我的头脑是一个聚合中的字段是私人的。这就提出了如何保存它的状态以及如何让数据放入UI的问题。有很多方法。我最喜欢的方法是使用事件采购和CQRS。然后我可以从我的聚合产生的事件中构建UI。我也可以坚持这些事件并用它们来重建我的聚合。

我已经进入了更多的博客深度,你可能想看看How to Build an Aggregate Root! 。在使用CQRS和事件源时,您可能会发现构建主详细信息屏幕的帖子非常有用,可以找到here

我希望帮助。