【问题标题】:CQRS Command how to store and query entities that are not persisted to data store immediatelyCQRS 命令如何存储和查询未立即持久化到数据存储的实体
【发布时间】:2013-10-11 04:48:28
【问题描述】:

在 CQRS 中,我们将命令和查询分开。据我了解,命令引发可能修改实体状态的域事件,而查询直接从数据存储返回查看特定 DTO。根据this article,用户界面通过命令总线发出命令,命令总线创建由各自的命令处理程序处理的命令,然后协调域逻辑以确定域事件的发生并将任何状态更改保持/发布到存储库(可选地使用事件溯源)。持久化后,状态更改可通过查询获得。

现在,如果命令创建的实体不会立即持久化/发布,该怎么办?首先,那个尚未持久化的实体在哪里?它是在命令总线、命令处理程序、存储库中,还是应该由一个新的瘦应用层来持有? Query 应该如何访问它?

这里的问题是,对于非持久化实体的任何查询似乎都与持久化实体的查询有很大不同,除非 CQRS 要求 ALL 实体在创建时持久化,这 IMO 不一定与所有实体兼容域。

具体来说,我正在尝试构建软件来记录各种培训课程的培训信息。但是,如果培训课程通过保存课程按钮手动而不是始终在创建时保留,我希望它。我不知道 StartNewTrainingSessionCommand 会将新的培训课程存储在哪里,以便可以查询它(如果不在数据存储中)。

【问题讨论】:

    标签: entity cqrs


    【解决方案1】:

    我认为您的理解有些错误:命令通过服务总线发送到命令处理程序,该处理程序使用业务对象来完成工作。领域事件应该由业务(领域)对象生成,但有时命令处理程序也会这样做。

    我没有看到不保存已创建实体的原因。在您的特定情况下,如果域允许,您可以自动保存默认的空 TrainingSession,然后在用户按下 Save 按钮时更新。

    如果这种方法不可行,那么只需将输入数据(几乎是视图模型)存储在临时位置(会话、数据库)并仅在用户单击按钮时发出命令。

    【讨论】:

    • 将新的 TrainingSession 保存在“内存中”存储库中并在用户单击“保存”时将其保存到 db 存储库中是否有意义?
    • 把它保存在一个临时的地方(你决定在哪里)直到它被发送到真正的存储库是有意义的。如果它是桌面应用程序,那么在内存中可能会很好。
    • 完全同意 MikeSW。如果需要,请将您的瞬态数据保留在域之外,作为一种缓存。然后,当用户“保存”数据时,向您的 AR/Saga 发送命令以更新您的域模型。读取模型将根据您的 AR 生成的领域事件进行更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-19
    • 1970-01-01
    • 2011-11-24
    • 1970-01-01
    • 1970-01-01
    • 2021-06-26
    相关资源
    最近更新 更多