当键不在事件中时查找读取模型投影行?

Finding read model projection row when key is not in event?

我想在我的 CQRS/ES 应用程序中为我的事件创建一个新的读取模型投影。

问题是我需要用于我的投影的密钥不存在于我的所有事件中:

我的根集合是一辆汽车。

我的新读取投影是 CarsRepairedPerManufacturer,它将计算每个制造商的维修汽车数:

也许我在这里遗漏了一些东西,因为如果这是无法解决的,它将限制您在 ES/CQRS 中可以做的预测类型。

你的问题没有具体提到 DDD,但它是一个非常有用的范例。 CQRS/ES 不是这里的障碍。

您遇到了上下文混合的经典问题。创建汽车(或 "built")的上下文并不关心他们去修理时会发生什么。维修发生的环境并不真正关心汽车的制造过程。您的单个 Car 聚合试图同时服务于两个上下文,这就是为什么您会出现这种阻抗不匹配并且应该让您暂停以重新考虑您的设计。

您确定您已正确绘制聚合边界,即 'Car' 需要跟踪其创建和修复吗?为什么没有 'Car' 聚合和 'Repair' 聚合?

您在 CarCreated 事件中有制造商的 ID,因此您可以从那里获取它。

CarCreated 事件发生在 CarRepaired 事件之前,因此当您获得 CarCreated 事件时,将制造商的 ID 与 CarID 一起保存在投影中。然后,当您获得 CarRepaired 事件时,您可以在投影中查找制造商的 ID(如果您使用的是 SQL 数据库,您可以为此创建一个新的 table)。投影不仅可以保存要显示的数据,还可以保存用于创建投影本身的状态。

另一种选择是将制造商的 ID 与 CarRepaired 事件一起发送。您已经在 CarCreated 事件的聚合中拥有它。这样您就不必在数据库中为一次查找创建一个新的 table。