【问题标题】:Aggregate objects in DDD在 DDD 中聚合对象
【发布时间】:2012-02-17 15:25:25
【问题描述】:

我可以使用与其他类中的成员相同的聚合类吗? 如果是的话,包含聚合的类会强制执行访问等吗?

假设您有一个 User 类。然后是一个名为 LogBook 的类,最后是一个名为 Log/Post 的类(这条小巷的某处)。在我的示例中,LogBook 将是 Log/Post 类的聚合根,而 User 将是整体聚合。现在,User 类是否包含添加日志帖子等的方法?您将在 User 类中创建一个方法,该方法调用 LogBook 类,该类具有执行实际添加日志的所有逻辑的方法。

或者,聚合总是在层次结构之上?没有嵌套。

【问题讨论】:

  • 鲍勃,这听起来不是个好主意。你能举个例子说明你的想法吗?

标签: java jakarta-ee domain-driven-design


【解决方案1】:

这是一个很好的 definition 聚合:

定义:被视为一个单元的关联对象的集群 出于数据更改的目的。外部参考仅限于 聚合的一个成员,指定为根。一套 一致性规则适用于聚合的边界。问题: 很难保证对象变化的一致性 具有复杂关联的模型。需要维护不变量 适用于密切相关的对象组,而不仅仅是离散的 对象。然而,谨慎的锁定方案会导致多个用户 毫无意义地相互干扰,使系统无法使用。 [DDD,第。 126]解决方案:将实体和值对象聚类为 聚合并定义每个边界。选择一个实体 每个聚合的根,并控制对对象的所有访问 通过根在边界内。允许外部对象持有 仅对 root 的引用。对内部成员的瞬态引用 只能在单个操作中传递出去使用。因为 root 控制访问,它不会被对 内部结构。这种安排使得强制执行所有 聚合中对象的不变量和聚合作为 整体在任何状态变化。 [DDD,第。 129]

我认为您不希望 User 类在不通过 LogBook 类的情况下进入 LogBook 的聚合对象。但是,从用户访问日志似乎没问题。

【讨论】:

  • 是的,因此用户将拥有基于用户成员执行操作的方法,本例中为日志。现在我是否需要通过 User 获取日志,然后使用对用户日志的引用来执行进一步操作,而不是在 User 类中创建一个名为 addPost() 的方法,该方法使用内部日志成员来实际添加发帖?
  • 我不愿意说你“应该”做什么,但如果你可以通过用户操作日志帖子,那么用户将是 DDD 定义的日志的聚合根。
  • 但是通过用户返回日志然后根据该引用进行操作会更好吗?
  • 聚合可以作为成员引用与其他类关联吗?
  • 我认为通过用户返回日志是可以的。与聚合中的所有内容都通过根对象这一事实相比,如何获得根对象并不重要。至于在其他聚合中对聚合根的引用,我会尝试通过仅使用一个标识符来避免这种情况,然后您再查看相关聚合。否则,您最终可能会得到一个加载整个数据库的对象图。
【解决方案2】:

我认为聚合的内部可以保存对其他聚合的的引用。但是每个聚合都负责执行自己的边界。没有什么可以阻止其他对象完全在第一个之外访问“引用”聚合 - 即,我不认为嵌套或所有权只是因为一个聚合引用另一个聚合。

在您的示例中,LogBook 似乎更适合作为一个聚合来控制对帖子的访问。试图将其硬塞到更大的用户聚合中似乎是一种尴尬的责任因素。

【讨论】:

  • 这是否意味着 User 类可以有一个名为 addLogPost() 的方法,并且该方法会调用 User 类所属的 LogBook 类上的 addLog()?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-30
  • 1970-01-01
  • 2015-12-01
  • 1970-01-01
  • 2019-07-22
  • 1970-01-01
相关资源
最近更新 更多