聚合可以成为域事件的一部分吗?

时间:2015-08-28 14:16:19

标签: domain-driven-design cqrs aggregateroot domain-events

考虑具有许多属性的聚合。例如UserGroup。如果我想发布UserGroupCreatedEvent,我可以做两件事:

  1. 将刚创建的UserGroup中的属性复制到 UserGroupCreatedEvent并复制它们的值。 OR:

  2. 请参阅UserGroupCreatedEvent

  3. 中的新UserGroup

    在很多例子中,像Axon的联系人应用程序,我看到了财产重复。我想知道为什么,如果在现实世界的CQRS应用程序中,这不是很多开销,开发人员选择引用聚合。

2 个答案:

答案 0 :(得分:3)

域事件的一个重要属性是是不可变的。考虑到这一点,你提到的两种可能性差别很大:

  • 复制属性会在创建UserGroup时记录其值。
  • 通过ID引用UserGroup只会告诉您UserGroup已创建,但不是当时的属性。如果在此期间删除UserGroup,则表示信息丢失。

您复制的属性取决于该差异。你需要能够查找,例如创建时UserGroup的名称?将其添加为属性。如果不是(并且如果不期望它将被要求),不要。

此外,域事件具有全局范围(即它们在您的BC之外是有意义的),因此您应该包括BC之外的客户端需要了解域事件的所有信息。

请注意,将整个聚合根对象附加到域事件会违反域事件的不变性规则,因此这可能是一个坏主意。

答案 1 :(得分:3)

事件是DTO,它意味着跨越边界。直接包括聚合有以下问题:

  • 聚合是一个仅在其自身有界的背景下才有意义的概念;
  • 一个事件应该只包含相关的变化,而不是整个概念的状态;
  • 因为事件是DTO,所以它将被(反)序列化,这将是正确封装对象的技术问题;
  • 接收处理事件的每个组件/上下文都将具有定义聚合的组件的依赖关系;

这些是域事件应该只是相关状态变化的扁平表示的主要原因。

P.S:如果您需要在活动中包含整个州,可能是事件设计不当或您正在处理简单的数据结构。通常,聚合包含一些值对象和/或封装一些业务约束。