【问题标题】:DDD, Aggregates and ReposDDD、聚合和回购
【发布时间】:2014-10-16 06:07:58
【问题描述】:

我有以下实体(示例):

  • Book
  • Author

Book 实体也是一个聚合,因为它关联了一个或多个 Authors。现在我在如何从 repo 中获取这个聚合时遇到了问题。我有以下情况 - 我也确实需要注意性能:

  1. 列出所有Books。无需获取Authors。
  2. 列出所有具有Authors 名称的Bookss。显然,我们需要获取Books 和相关Authors 的聚合。
  3. 列出所有Books 的作者count。类似于 (2),除了我不想从 repo 中获取 Authors,只是计数。

那么我的存储库应该是什么样子?具体问题:

  • 我们应该有像findBooksfindBooksWithAuthorsfindBooksWithAuthorsCount这样的方法吗?但这会导致大量的方法,因为我们的实体之间有很多关系。
  • 我们是否应该只在AuthorsRepo 中添加findBooksloadAuthors,即不进行连接,直到遇到一些性能问题,然后再进行重构。
  • 我是否应该创建一些聚合值对象,例如:描述关系的BookAndAuthors

请注意,这个例子是微不足道的 - 你必须知道我们的模型更丰富,有更多的关系。

【问题讨论】:

    标签: domain-driven-design ddd-repositories


    【解决方案1】:

    您是否需要获取此类信息以显示在 UI 上?,

    我鼓励您将读取和写入关注点分开,并保持您的存储库接口简单(类似于集合接口)。

    看看CQRS,它与 DDD 配合得非常好,将大大简化您的设计。

    一旦您进入 CQRS,请记住,CQRS 不一定涉及事件溯源

    在您的情况下,我会推荐this article 中显示的最简单的方法,基本上有一个读取服务(可以称之为 Finder),它会触发 SQL 并为您提供 UI 所需的任何 DTO/Map。

    【讨论】:

    • 不仅是 UI,其他模块也使用相同的代码。无论如何,如果我理解正确的话,CQRS 说我们有一个单独的模型:查询模型。您建议使用 Finder 来获取所需数据的各种不同方法。
    • 是的,这就是我的建议
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-25
    • 1970-01-01
    • 2016-11-05
    • 2016-03-21
    • 1970-01-01
    • 1970-01-01
    • 2011-02-07
    相关资源
    最近更新 更多