在 CQRS 中执行没有处理程序的命令和查询?

Executing Commands and Queries without Handlers in CQRS?

我们正在实施一个基于领域驱动设计、清洁架构和 CQRS 的企业系统。

但是,我对 CQRS 中处理程序的概念和用法有些困惑。我见过的每个例子,命令的执行都委托给相应命令的处理程序。

我想知道在 CQRS 中是否可以在没有处理程序的情况下执行命令(或查询)? (或者我们不能缺一不可?)。

如果是这样,我们能否将命令直接分派到底层的 Clean Architecture 层(例如用例、存储库等)以便继续执行它们(不干扰处理程序)?

那么查询呢?他们是否需要查询处理程序,或者我们可以直接在我们的 REST API 中简单地调用读取模型?

同时处理过多的架构模式会产生这种效果;你并不孤单。

CQRS 中的典型命令示例包含 CommandCommand Handler,但它们是为了说明一些重要原则:

  • APIs 发射 Commands 并忘记
  • APIs for Commands 不要return任何数据给被叫者
  • Command Handlers 从消息队列中提取 Command 并处理它们
  • Commands 将导致更改在稍后的时间点变为 visible/available,通过最终一致性

如果您只关心将写入层与读取层分开,则无需使用 Command + Command Handlers。您可以从 API 层调用简单的应用程序服务方法。只需确保遵循 CQRS 的原则,例如不在写入端和读取端之间共享代码,不 return 在 write/changes 上向被调用方发送数据,以及使用事件管道来构建查询模型。

作为后台工作人员而不是应用程序服务的一部分进行实际更改以提供异步工作模型也很有用。

话虽如此,但遵循 Command + Command Handler 模式会极大地帮助您,因为它可以让您在开发过程中更轻松地对架构决策进行推理。

另一方面,查询模型通常是为直接处理 API 请求而构建的。换句话说,你领域中的同一个聚合或概念可能有多个查询模型结构构建在其上,以满足不同的API需求。您通常 return 已构建的 Query Model(没有任何 post 处理)在 return 到 API 同步调用中。是的,您只需直接在您的 REST API 中调用读取模型,或通过应用程序服务中的包装器方法。