CQRS/DDD 如何使用命令将对象添加到聚合?

CQRS/DDD How would add an object to an aggregate using a command?

我对CQRS/DDD很陌生,所以我的理解可能有很大的漏洞。

但是假设我有一个聚合对象 WidgetWidgetNote 个对象组成,Note 个对象可以附加一个 File 个对象。

在 CQRS 中,我可能有一个名为 AddNoteToWidget 的命令。我从阅读中知道命令和事件对象都应该是简单的 DTO(我知道它们也可以以其他形式出现,但关键是它们不包含任何行为)。

我也明白实体永远不应该包含对存储库的引用,因为它们应该是持久性的,不知道。

我的 AddNoteToWidget 是否会包含对 File 对象的引用并随命令一起序列化?如果是这种情况,那么我的 File 对象应该是一个值对象。但是,我将其建模为具有自己存储库的实体,因为我希望在整个系统中拥有中央一致的文件存储。

通过阅读您的问题及其评论,很明显您目前将 File 视为子实体和聚合根 。这是一个问题,你应该选择两者之一:

  1. 模型 File 作为聚合。现在只有 File 的 ID 必须在该聚合之外使用,而不是 File 本身。此外,File 个对象是通过它们自己的存储库检索的。
  2. 模型 File 作为 Widget 集合中的实体。这意味着只要有 Widget,就可以随时使用该文件。 File 对象没有自己的存储库,它们通过 WidgetRepository.
  3. Widget 一起加载

根据你的问题,我无法判断两者中哪一个更好。作为准则,聚合边界是 一致性边界 ,并且聚合始终以原子方式持久化。一个应用服务应该只修改一个聚合。

我认为您目前存在的主要问题可以归纳为:

Repositories handle only whole Aggregates, never single Entities that are part of an Aggregate.

当然,可能存在只由一个实体组成的简单聚合,在这种情况下,实体和聚合是相同的。