聚合可以成为域事件的一部分吗?
Can an aggregate be part of a domain-event?
考虑具有许多属性的聚合。例如用户组。如果我想发布 UserGroupCreatedEvent,我可以做两件事:
将刚刚创建的用户组的属性复制到
UserGroupCreatedEvent 并复制它们的值。或者:
在 UserGroupCreatedEvent 中引用新的 UserGroup
在许多示例中,例如 Axon 的联系人应用程序,我看到了 属性 重复。我想知道为什么,如果在现实世界的 CQRS 应用程序中,这不是很多开销,开发人员会选择引用聚合。
域事件的一个重要属性是它们是不可变的。考虑到这一点,你提到的两种可能性差异很大:
- 复制属性会记录它们在
UserGroup
创建时的值。
- 通过 ID 引用
UserGroup
只是告诉您创建了一个 UserGroup
,而不是它当时具有的属性。如果UserGroup
在此期间被删除,则表示信息丢失。
您复制哪些属性取决于这个差异。你需要能够查找吗? UserGroup
创建时的名称?将其添加为 属性。如果不需要(并且如果预计永远不需要它),则不要。
此外,域事件具有全局范围(即它们在您的 BC 之外有意义),因此您应该包括您的 BC 之外的客户理解域事件所需的所有信息。
请注意,将整个聚合根对象附加到域事件违反了域事件的不变性规则,因此这很可能是个坏主意。
一个事件是一个 DTO,它意味着跨越边界。直接包含聚合存在以下问题:
- 聚合是一个只有在其自身的有界上下文中才有意义的概念;
- 一个事件应该只包含相关的变化,而不是概念的全部状态;
- 因为事件是一个 DTO,在某一时刻它会被(反)序列化,这将是正确封装对象的技术问题;
- 每个 component/context 接收处理事件都将依赖于定义聚合的组件;
这些是领域事件应该只是相关状态变化的扁平化表示的主要原因。
P.S:如果您需要在事件中包含整个状态,可能事件设计不当或者您正在处理一个简单的数据结构。通常一个聚合包含一些值对象and/or封装了一些业务约束
考虑具有许多属性的聚合。例如用户组。如果我想发布 UserGroupCreatedEvent,我可以做两件事:
将刚刚创建的用户组的属性复制到 UserGroupCreatedEvent 并复制它们的值。或者:
在 UserGroupCreatedEvent 中引用新的 UserGroup
在许多示例中,例如 Axon 的联系人应用程序,我看到了 属性 重复。我想知道为什么,如果在现实世界的 CQRS 应用程序中,这不是很多开销,开发人员会选择引用聚合。
域事件的一个重要属性是它们是不可变的。考虑到这一点,你提到的两种可能性差异很大:
- 复制属性会记录它们在
UserGroup
创建时的值。 - 通过 ID 引用
UserGroup
只是告诉您创建了一个UserGroup
,而不是它当时具有的属性。如果UserGroup
在此期间被删除,则表示信息丢失。
您复制哪些属性取决于这个差异。你需要能够查找吗? UserGroup
创建时的名称?将其添加为 属性。如果不需要(并且如果预计永远不需要它),则不要。
此外,域事件具有全局范围(即它们在您的 BC 之外有意义),因此您应该包括您的 BC 之外的客户理解域事件所需的所有信息。
请注意,将整个聚合根对象附加到域事件违反了域事件的不变性规则,因此这很可能是个坏主意。
一个事件是一个 DTO,它意味着跨越边界。直接包含聚合存在以下问题:
- 聚合是一个只有在其自身的有界上下文中才有意义的概念;
- 一个事件应该只包含相关的变化,而不是概念的全部状态;
- 因为事件是一个 DTO,在某一时刻它会被(反)序列化,这将是正确封装对象的技术问题;
- 每个 component/context 接收处理事件都将依赖于定义聚合的组件;
这些是领域事件应该只是相关状态变化的扁平化表示的主要原因。
P.S:如果您需要在事件中包含整个状态,可能事件设计不当或者您正在处理一个简单的数据结构。通常一个聚合包含一些值对象and/or封装了一些业务约束