CQRS/DDD 如何使用命令将对象添加到聚合?
CQRS/DDD How would add an object to an aggregate using a command?
我对CQRS/DDD很陌生,所以我的理解可能有很大的漏洞。
但是假设我有一个聚合对象 Widget
。 Widget
由 Note
个对象组成,Note
个对象可以附加一个 File
个对象。
在 CQRS 中,我可能有一个名为 AddNoteToWidget
的命令。我从阅读中知道命令和事件对象都应该是简单的 DTO(我知道它们也可以以其他形式出现,但关键是它们不包含任何行为)。
我也明白实体永远不应该包含对存储库的引用,因为它们应该是持久性的,不知道。
我的 AddNoteToWidget
是否会包含对 File
对象的引用并随命令一起序列化?如果是这种情况,那么我的 File
对象应该是一个值对象。但是,我将其建模为具有自己存储库的实体,因为我希望在整个系统中拥有中央一致的文件存储。
通过阅读您的问题及其评论,很明显您目前将 File
视为子实体和聚合根 。这是一个问题,你应该选择两者之一:
- 模型
File
作为聚合。现在只有 File
的 ID 必须在该聚合之外使用,而不是 File
本身。此外,File
个对象是通过它们自己的存储库检索的。
- 模型
File
作为 Widget
集合中的实体。这意味着只要有 Widget
,就可以随时使用该文件。 File
对象没有自己的存储库,它们通过 WidgetRepository
. 与 Widget
一起加载
根据你的问题,我无法判断两者中哪一个更好。作为准则,聚合边界是 一致性边界 ,并且聚合始终以原子方式持久化。一个应用服务应该只修改一个聚合。
我认为您目前存在的主要问题可以归纳为:
Repositories handle only whole Aggregates, never single Entities that are part of an Aggregate.
当然,可能存在只由一个实体组成的简单聚合,在这种情况下,实体和聚合是相同的。
我对CQRS/DDD很陌生,所以我的理解可能有很大的漏洞。
但是假设我有一个聚合对象 Widget
。 Widget
由 Note
个对象组成,Note
个对象可以附加一个 File
个对象。
在 CQRS 中,我可能有一个名为 AddNoteToWidget
的命令。我从阅读中知道命令和事件对象都应该是简单的 DTO(我知道它们也可以以其他形式出现,但关键是它们不包含任何行为)。
我也明白实体永远不应该包含对存储库的引用,因为它们应该是持久性的,不知道。
我的 AddNoteToWidget
是否会包含对 File
对象的引用并随命令一起序列化?如果是这种情况,那么我的 File
对象应该是一个值对象。但是,我将其建模为具有自己存储库的实体,因为我希望在整个系统中拥有中央一致的文件存储。
通过阅读您的问题及其评论,很明显您目前将 File
视为子实体和聚合根 。这是一个问题,你应该选择两者之一:
- 模型
File
作为聚合。现在只有File
的 ID 必须在该聚合之外使用,而不是File
本身。此外,File
个对象是通过它们自己的存储库检索的。 - 模型
File
作为Widget
集合中的实体。这意味着只要有Widget
,就可以随时使用该文件。File
对象没有自己的存储库,它们通过WidgetRepository
. 与
Widget
一起加载
根据你的问题,我无法判断两者中哪一个更好。作为准则,聚合边界是 一致性边界 ,并且聚合始终以原子方式持久化。一个应用服务应该只修改一个聚合。
我认为您目前存在的主要问题可以归纳为:
Repositories handle only whole Aggregates, never single Entities that are part of an Aggregate.
当然,可能存在只由一个实体组成的简单聚合,在这种情况下,实体和聚合是相同的。