CQRS:我应该为读取模型使用不同的事件吗?

CQRS: Should I use different event for Read Model?

我有一个已经实施了 CQRS 和事件溯源的项目。 现在我要实现一个读取模型。

目前,ProductCreated 事件具有 EventID 和 Product ID。 但是我们对于读取模型,我想使用不同的字段 - 产品名称和类别。

在这种情况下,我是否需要将产品名称和类别添加到 ProductCreated 事件,或者创建另一个仅包含读取模型名称和类别的事件?

我是 CQRS 和事件溯源的新手。我花了一整天的时间来寻找这个问题的答案,但找不到合适的解决方案。

提前致谢。

是否有一些查找 table 某处将产品 ID 映射到名称和类别?如果是这样,请在您的阅读模型中使用 table。

或者此信息是由创建产品的人在创建产品时提供的吗?如果是这样,您绝对必须将其添加到事件中,否则您将丢失该信息。

简单

如果您有专用的读取模型,它肯定应该有 ProductID 以及 ProductName 和 Category。

为什么?

仅仅是因为如果有人请求此模型,让我们说一些没有 ID 的客户 UI 或 API 客户,它将无法追踪到您返回的确切产品是哪个产品多个产品的产品名称可以相同。

In this case, do I need to add the Product Name & category to the ProductCreated event, or create another event with only the name & category for the Read Model?

从命名ProductCreated事件推测是一个保存Product已经创建的信息的事件。这实际上取决于您的业务需求和您的设计,但我建议将所有产品模型信息(至少应该是 public 的属性)放在 ProductCreated 事件中。这将是 ProductId、ProductName、ProductCategory 和其他一些(如果您有 ProductDescription、ProductCode 以及产品模型中的任何内容)。

无论谁正在收听此事件,都可以决定他们是要将整个模型保存在他们的存储中,还是只保存该模型的一个子集。这当然是基于特定事件消费者的需要。

如果您已经或将来会有多个消费者使用您发布的事件,则此方法非常有用。如果没有并且您只有 1 个,那么您可以删除读取模型中不需要的属性。

结论

您不需要第二个事件来传输您描述的数据子集。我建议将所有内容都放入 ProductCreated 事件,然后在处理此事件时在您的读取模型中仅保存您需要的数据子集。