【问题标题】:CQRS - Multiple command/query-handlers inside eachotherCQRS - 彼此内部的多个命令/查询处理程序
【发布时间】:2020-05-14 00:41:34
【问题描述】:

在 CQRS 中相互使用多个查询处理程序和/或命令处理程序是一种好习惯吗?还是每个用例只有一个?

  • 命令处理程序中的命令处理程序
  • 命令处理程序中的查询处理程序
  • 查询处理程序中的查询处理程序
  • 查询处理程序中的命令处理程序 -> 就个人而言,我不会这样做,因为您不会期望查询会更改数据...对吗?

【问题讨论】:

  • 没人知道吗?
  • 就我个人而言,我发现管理只做一件事但做得很好的查询和命令更容易,并将其留给服务层组件将它们编织和协调在一起。
  • 在我看来,只有事件处理程序才能发出命令。在命令处理程序存储库中应满足所有读取需求。由于命令处理程序将发出命令的事务封装在命令处理程序中。

标签: c# cqrs


【解决方案1】:

CQRS 是一种应用单一职责原则的架构模式,它通过提供两个模型(读取和写入模型)而不是一个,将查询与命令处理分开。因此,如果您同时使用多个查询处理程序和/或命令处理程序,则该模式的使用将是错误的。

如果您有大量读取,此模式可以让您进行扩展。因此,它也不是一种适用于系统所有有界上下文的架构模式。

【讨论】:

    【解决方案2】:

    不,我不这么认为。

    这是一种不好的做法,因为这种方式忽略了 CQRS 的两个主要优点。 首先是简单的代码支持和清晰的结构,因为您已经分离了业务逻辑和查询(用于可视化的聚合数据)。

    第二个优势是规模化。一个实例处理命令,另外 5 个处理请求。所以理论上命令代码和查询可以在不同的服务器上执行。同样,不同的查询可能会在不同的服务器上执行,因此包含命令代码和相互查询是个坏主意 - 扩展将非常痛苦。

    一些 CQRS 库事件将 C&Q 端隔离在不同的包中,例如 here

    【讨论】:

      【解决方案3】:

      坏主意。如果处理程序必须做很多事情,例如调用不同的数据库、第 3 方、外部文件等,那么它应该将其委托给其他此类存储库等。

      【讨论】:

        【解决方案4】:

        为什么要在命令处理程序中包含查询处理程序?在创建命令之前查询数据,并在命令中填写所有相关信息以供域执行。

        另一方面,在查询处理程序中包含命令处理程序听起来非常危险,因为您正在突破相当重要的原则,将读取与写入分开。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-06-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多