我正在使用 CQRS 和域事件概念构建具有域模型的应用程序(但没有事件源,只是普通的旧 SQL)。SomethingChanged 类型的事件没有问题。然后我陷入了实现SomethingCreated事件的困境。
当我创建一个映射到具有标识主键的表的实体时,在实体被持久化之前我不知道 Id。实体是持久性无知的,因此当从实体内部发布事件时,Id 是未知的 - 它仅在调用 context.SaveChanges() 后神奇地设置。那么如何/在哪里/何时可以将 Id 放入事件数据中?
我在想:
- 包括对事件中实体的引用。这将在域内工作,但不一定在具有多个自治系统通过事件/消息进行通信的分布式环境中工作。
- 覆盖 SaveChanges() 以某种方式更新排队等待发布的事件。但是事件是不可变的,所以这看起来很脏。
- 摆脱身份字段并使用实体构造函数中生成的 GUID。这可能是最简单的,但可能会影响性能并使其他事情变得更加困难,例如调试或查询(
where id = 'B85E62C3-DC56-40C0-852A-49F759AC68FB'
、 noMIN
等MAX
)。这就是我在许多示例应用程序中看到的。 - 混合方法 - 不理会身份,主要将其用于外键和更快的连接,但使用 GUID 作为唯一标识符,我通过它从应用程序的存储库中提取实体。