【问题标题】:CQRS: Should I use different event for Read Model?CQRS:我应该为读取模型使用不同的事件吗?
【发布时间】:2019-10-08 03:23:22
【问题描述】:

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

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

在这种情况下,我需要将产品名称和类别添加到 ProductCreated 事件中,还是创建另一个只有读取模型的名称和类别的事件?

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

提前致谢。

【问题讨论】:

    标签: asp.net-core cqrs event-sourcing


    【解决方案1】:

    简单

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

    为什么?

    仅仅是因为如果有人请求此模型,假设某些客户端 UI 或 API 客户端没有 ID,它将无法追踪您返回的确切产品是哪个产品,因为多个产品的 ProductName 可能相同。

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

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

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

    如果您已经或将来有您发布的事件的多个消费者,这种方法是很好的。如果没有并且您只有 1 个,那么您可以删除读取模型中不需要的属性。

    结论

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2018-04-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-03
        • 1970-01-01
        • 2018-09-12
        • 1970-01-01
        相关资源
        最近更新 更多