考虑具有许多属性的聚合。例如UserGroup。如果我想发布UserGroupCreatedEvent,我可以做两件事:
将刚创建的UserGroup中的属性复制到 UserGroupCreatedEvent并复制它们的值。 OR:
请参阅UserGroupCreatedEvent
在很多例子中,像Axon的联系人应用程序,我看到了财产重复。我想知道为什么,如果在现实世界的CQRS应用程序中,这不是很多开销,开发人员选择引用聚合。
答案 0 :(得分:3)
域事件的一个重要属性是是不可变的。考虑到这一点,你提到的两种可能性差别很大:
UserGroup
时记录其值。 UserGroup
只会告诉您UserGroup
已创建,但不是当时的属性。如果在此期间删除UserGroup
,则表示信息丢失。您复制的属性取决于该差异。你需要能够查找,例如创建时UserGroup
的名称?将其添加为属性。如果不是(并且如果不期望它将被要求),不要。
此外,域事件具有全局范围(即它们在您的BC之外是有意义的),因此您应该包括BC之外的客户端需要了解域事件的所有信息。
请注意,将整个聚合根对象附加到域事件会违反域事件的不变性规则,因此这可能是一个坏主意。
答案 1 :(得分:3)
事件是DTO,它意味着跨越边界。直接包括聚合有以下问题:
这些是域事件应该只是相关状态变化的扁平表示的主要原因。
P.S:如果您需要在活动中包含整个州,可能是事件设计不当或您正在处理简单的数据结构。通常,聚合包含一些值对象和/或封装一些业务约束。