2010-03-17 132 views
0

如果Book聚合Chapter,然后聚合Page,那么聚合根应该是什么?一种可能性可能是:哪些实体应该是聚合根?

Book是一个聚合根,其中章作为叶,章是聚合,页为叶。

在这种情况下,章节是一个集合中的一个叶和另一个中的一个根。这个可以吗?在这种情况下,有两个存储库,一个是Book,另一个是Chapter?如果是这样,那么章节库是不是可以用来规避只能通过Book来访问章节的事实?处理这种情况的最佳方式是什么?

回答

1

在我看来,只有当一个给定聚合的单根时,聚合根的整体思想才有意义。哪一个 - 取决于你的要求。让我们来看看两种可能性:

  1. 书是一个根,它包含包含页的章节。当您的使用场景都包括与书籍交互时,此设计很有用:用户选择书籍并将其操作/命令应用于整本书籍。请注意,图书集合是在你的领域模型的“操作”层面 - 它总体上代表了概念是什么的一部分是日常业务。

  2. 章是根。是包含页面。它也有参考书。当使用场景专注于与单个章节进行交互时,此设计很有用。章聚合现在在'操作'层。本书本身形成一个聚合体,但被放置在操作层下的'潜能/能力'层。这意味着图书对于企业来说是一种资产,是企业的推动者,但不是日常活动的一部分。此外,书籍不知道被章节引用。

总之,一切都取决于你的具体情况,你的要求。请注意,领域模型中的图层主要是一个商业概念,而不是技术层面 - 它们会促使您对域进行良好建模。欲了解更多信息,请阅读Eric Evans的领域驱动设计,尤其是“大型结构”部分。

+0

谢谢Szymon。这些都是澄清决定背后的推理的好点。如果可以的话,我想稍微扩展一下情况:假设该书还包含作者。如果您支持两个用例,一个焦点在章节(及其页面集合),另一个焦点在书籍(及其作者集合)上,您现在有理由使章节成为聚合在一个方案中创建根,并在另一个方案中预订聚合根。但Book包含章节,所以我们有一个包含另一个聚合根的聚合根。怎么办? – MylesRip 2010-03-19 15:28:50

+0

一些DDD专家(如Udi Dahan)承认,聚合根不是模型的结构元素,可以根据特定的用例进行不同的放置。这可以解决您的问题。在“书籍”聚合中,“章节”和“书籍”可以在不同用例中聚合。这种方法在这里描述:http://www.udidahan.com/2009/06/29/dont-create-aggregate-roots/。根据使用案例的总根不是“经典”DDD原则之一,而且是许多讨论的主题。 – 2010-03-20 10:21:05

+0

是的。这就说得通了。感谢Udi文章的链接。这很有趣。 – MylesRip 2010-03-22 17:13:16

相关问题