当前位置: 首页 > 知识库问答 >
问题:

如何在 ddd 中实现引用 beetwen 聚合?

梁烨烨
2023-03-14

在ddd中,实体可以引用同一聚合的实体或另一聚合根(但不能引用另一聚合内的实体)。

  1. 如何实施这样的参考?
  2. 实体的方法如何访问引用的聚合根?
  3. 实体允许对另一个聚合根做的方法是什么?

对于1.和2.,我的问题是,实体不应该访问存储库。此外,神奇的延迟加载机制并不总是可用的,我认为出于同样的原因应该避免。因此,当存储库加载聚合时,存储库是否应该解析其中每个实体的所有引用(以及所有引用的其他聚合)?或者“引用”只是一个id,实体外部的某个人(命令处理程序或从存储库加载聚合并调用方法的人)也使用这个id来加载另一个聚合,然后将其作为参数提供给方法,如以下示例所示?

agg1 = repo1.Load(id);
agg2 = repo2.Load(agg1.refId);
agg1.mymethod(agg2);

对于3.我认为应该在另一个聚合上调用的唯一方法是不改变另一个聚合的查询方法(在cqs意义上),因为每个事务只应该改变一个聚合。对吗?

共有1个答案

江阳羽
2023-03-14

至于问题1。和 2.你说的很好,大多数时候都是这样做的。按 id 引用其他聚合,并在应用程序服务中的域逻辑之外检索它们。您不应该在聚合中加载其他聚合(SRP 违规除外)的原因是您无法控制正在发生的事情,与延迟加载相同。您可以轻松地编写代码,从数据库加载相同的聚合数十次,而它可以加载一次。您可以使用缓存,但也会出现过时数据等问题。

但是,有时,您需要在“DDD”上执行“性能驱动设计”,然后在另一个聚合中加载聚合,但这种情况很少见。

对于您对 3.在“来自 CQRS 的查询”中,你甚至不使用存储库,也不使用聚合,因为你只想获取数据,不涉及域逻辑。

 类似资料:
  • 问题内容: 在寻找有关如何在Java中实现引用变量的解释时,我遇到了一个问题: Java的引用变量内部是什么? Samuel_xL在评论中说,指定供应商名称将是一个更好的问题。所以我的问题是,如何在Oracle JVM中实现实例变量?它是指向地址的指针吗?我知道引用包含告诉JVM如何访问对象的位。但是它的结构如何? 问题答案: 根据我的判断,对象引用存储为称为(普通对象指针)或的类型,具体取决于J

  • 问题内容: 我有逻辑,包括从一个系统中选择大量记录,执行多个转换(基于业务规则)并将它们插入到另一个系统中。 将这些记录中的每一个实例化为一个对象,对它们执行转换,然后将所有这些对象插入另一个系统,似乎是一种高性能(和内存)。 在DDD中实现此目标的最佳方法是跳过类/对象并直接通过SQL(也许是存储过程)来做到这一点吗? 有没有更好的方法使用DDD来实现此目标? 注意:系统使用SQL数据库,目前不

  • 代码中的聚合和关联是什么样子的?(Java或C#) 找不到聚合和关联的代码示例。

  • 我是Spring Data MongoDB的新手,我正在尝试用Spring Data MongoDBJava实现聚合查询。我尝试过从这个问题中搜索,并使用进行搜索,但仍然没有结果。 我的数据格式: 我的查询: 这是我在Javascript后端使用的查询,我可以用Mongoose很容易地做到这一点。然而,我对它的Java实现有一些困难。 当我尝试运行此程序时,会出现以下错误: 当我删除从组聚合中,我

  • 在CQRS ES和DDD中,聚合中的小读模型从其他聚合或有界上下文中获取数据是件好事吗? 例如,在订单验证(订单聚合)中,有一个业务规则,该规则仅在未标记客户时验证订单。标志信息通过同步域事件放入读取模型(特定于聚合)。 你怎么看?

  • 我需要在数据源的每个记录后强制分页。我尝试了,但不起作用。怎么做?