【问题标题】:How to communicate between repositories如何在存储库之间进行通信
【发布时间】:2020-07-16 18:59:54
【问题描述】:

据我了解,RepositoryAggregationRoot 之间存在 1-1 关系。

假设我有一个AggregationRoot_A,其属性包含一个AggregationRoot_B 的ID。

我将拥有Repository_ARepository_B。我在哪里处理需要来自AggregationRoot_A 对象和AggregationRoot_B 对象的数据的查询?。

获取所有AggregationRoot_A 对象并一个接一个地获取AggregationRoot_B 对象来处理它们太疯狂了,因为可以使用简单的join 或数据库端的任何东西来完成操作。

所以,我的问题是,我在哪里可以处理涉及来自 2 个聚合根相关的数据的操作。

【问题讨论】:

    标签: domain-driven-design ddd-repositories


    【解决方案1】:

    Repository 和 AggregationRoot 之间存在 1-1 关系。

    是的

    在哪里处理需要来自 AggregationRoot_A 对象和 AggregationRoot_B 对象的数据的查询?

    目前对此的看法通常是完全绕过领域模型,尽可能高效地查询数据库。

    如果你愿意的话,回忆一下聚合的早期定义(Evans,2003)

    聚合是关联对象的集群,我们将其视为一个单元以进行数据更改。

    如果我们不尝试更改数据,那么我们不需要“聚合”来确保正确完成更改。我们只需要一种方法来获取当前支持聚合的信息,并将该信息转换为我们想要的报告。

    作为技术问题,您可能会在与数据存储紧密耦合的基础架构代码和不应该耦合的应用程序代码之间创建清晰的界限。这样的外观可能看起来有点像聚合体。关键区别在于,在这种情况下,外观无法更改底层数据。

    换句话说,这个外观可能表面上看起来像一个存储库,但它会缺少一些关键元素 - 无法添加新对象,没有类似保存的功能,也没有支持更改的对象。

    当您执行查询时,您使用的是不可变值,而不是可变实体。

    这个伪存储库的响应应该是某个域类的实例?或者它只是一个普通的对象?我应该为此报告查询中的项目创建一个特定的类吗?

    其中任何一个都可能是正确的答案。在您只是生成报告、网页、html 文档的情况下,将原始数据复制到最终表示中而不搞乱仪式通常是有意义的。课程用马。

    这个伪存储库的响应应该是某个域类的实例?或者它只是一个普通的对象?我应该为此报告查询中的项目创建一个特定的类吗?

    嗯,您真正想从伪存储库中取出的是一个内存数据结构,您可以 (a) 按原样序列化,或 (b) 转换。

    如果您正在做的是准备通过线路发送该信息,那么您可能希望尽可能少的仪式 - 如果您可以将记录集直接转换为信息的在线表示,完美——尝试一遍又一遍地将信息移入和移出“对象”可能不会让您随着时间的推移更容易维护代码。

    当您将该信息用作其他内容的输入时,您更有可能希望将该信息包含在某个角色接口的实现中,这样消费者就不会过于紧密地耦合到它没有的数据结构不在乎。

    【讨论】:

    • 出于所讨论的目的:是否有任何理由不选择实现一个存储库,该存储库将通过直接查询持久空间(例如数据库)来绕过聚合的使用并成为其中的一部分领域模型?
    • 存储库应该经过集成测试。您需要确保您的查询运行良好。特别是考虑到通常涉及很多弱类型转换。甚至可能是一些动态构造的查询。这就是为什么存储库应该只关注数据库集成的原因。它不应该加载额外的业务逻辑,比如检查你是否应该更新数据。更新的数据是否有效。用户是否有足够的权限、资金余额和合同日期。否则你可能不需要 DDD。
    • 感谢@VoiceOfUnreason 和你们。令人困惑的是,我在存储库中有 GetAll、GetById、GetByWhatever 方法,而这在我的理解中是查询内容。但是现在我必须创建一个伪存储库来进行跨聚合根查询。对不起,如果我误解了。
    • 而且,这个伪存储库的响应应该是某个域类的实例?或者它只是一个普通的对象?我应该为此报告查询中的项目创建一个特定的类吗?
    • 如果您只需要读取数据,然后将其呈现为 HTML 或返回,例如JSON,您可以创建适合您需要的类。它可以是视图模型类或简单的 DTO(数据传输对象),您可以直接在 API 响应中发回。只要您不更改任何数据,您就可以查询它并以最适合您阅读和进一步处理它的要求的方式表示它(例如用于报告或显示)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-20
    • 1970-01-01
    • 2012-02-16
    • 2010-12-12
    • 2013-10-04
    相关资源
    最近更新 更多