【问题标题】:How can an aggregate root and associated repositories be identified如何识别聚合根和相关存储库
【发布时间】:2015-06-02 12:16:53
【问题描述】:

场景

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

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

实施

目前,我正在使用三个不同的存储库——BookRepository、AuthorRepository 和 PublisherRepository——来加载一本书、相关作者和出版商。在我的 ApplicationService 中使用所有三个存储库来创建一本新书。

我不明白的地方

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

问题

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

如果 BookRepository 确实是聚合根...

  1. ...从属实体(即作者和出版商)的方法看起来如何(例如 repository.GetBookAuthor、repository.UpdateBookAuthor)?

  2. ...我如何管理作者/出版商(例如显示所有作者以供编辑)?

【问题讨论】:

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


    【解决方案1】:

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

    在您的情况下,我会将书籍、作者和出版商建模为他们自己的聚合体。它们只能通过 ID 关联。所以这本书对象,只有一个名为 AuthorID 的属性。出版商不会有书籍对象的列表,而只是在书籍对象上放置一个 publisherID。原因是出版商不是由他们出版的书来定义的,因为他们可能根本没有书。

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

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

    【讨论】:

    • read up on CQRS, if you are wondering how your query needs would be met if your aggregates don't have all the properties to satisfy some queries我需要这个,有资源吗?
    猜你喜欢
    • 2014-06-27
    • 1970-01-01
    • 2011-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多