如何识别聚合根和关联的存储库

时间:2015-03-29 13:59:55

标签: c# domain-driven-design aggregate repository-pattern

SZENARIO

我在查找可能的聚合根并确定正确的根时遇到问题 我的应用程序中的存储库。

场景是这样的:我正在编写一个库应用程序来练习DDD。该应用程序允许用户显示所有书籍,创建新书或编辑现有书籍。一本书只分配了一位作者和一位出版商。在应用程序中,用户还可以独立显示,创建和编辑作者/出版商。

实行

目前我正在使用三个不同的存储库BookRepository,AuthorRepository和PublisherRepository来加载书籍,关联作者和发布者。在我的ApplicationService中使用所有三个存储库来创建新书。

我不明白

看看这段代码,我觉得我错过了一个聚合根。我想也许Book类可能是聚合根。这意味着BookRepository可以加载所有合并的数据(书籍,作者,出版商),听起来很不错。这在加载一本书时效果很好。但是,如果我需要显示所有作者并允许用户创建,编辑或删除作者,会发生什么。我不能用Book类作为聚合根。

问题

如何识别聚合根和关联的存储库?

如果BookRepository是聚合根,那么......

  1. ...下属实体的方法,例如作者和出版商的方法是什么样的(例如repository.GetBookAuthor,repository.UpdateBookAuthor)?

  2. ...如何管理作者/出版商(例如显示所有作者进行编辑)

1 个答案:

答案 0 :(得分:3)

在对聚合根进行建模时,您必须问自己"这个实体是什么定义由?"而不是"这个实体是什么关联的与?"自然趋势是查看像数据库表这样的实体,然后尝试查找外键。使用DDD,您可以对业务不变量进行建模,因此您的实体模型需要反映您要强制执行的不变量,仅此而已。使用DDD存储库的原因是您的实体模型可能看起来与您的数据模型不同。如果你所做的只是CRUD,你的模型可能看起来一样。在这种情况下,如果您甚至可以从DDD中受益,您可能需要重新评估。

在您的情况下,我会将书籍,作者和出版商建模为他们自己的聚合。它们只与ID相关联。所以book对象只有一个名为AuthorID的属性。发布者不会拥有图书对象列表,而只是将bookID放在图书对象上。原因是出版商没有被他们出版的书籍定义,因为他们可能根本没有书籍。

由于您主要将CRUD应用程序作为学习体验,因此可能很难真正探索DDD的好处。我建议你发明一些商业不变量来尝试和模拟实践。

如果您想知道如果您的聚合不具备满足某些查询的所有属性,那么我建议您阅读CQRS,如果您想知道如何满足您的查询需求。