0Pricing
C# Academy · 课时

CQRS 概念

分离命令与查询,使代码更清晰。

CQRS 概念 是 CoddyKit 上的免费 C# Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C# Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C# Academy 课程共包含 4 节课。

什么是 CQRS

CQRS 是 Command Query Responsibility Segregation(命令查询职责分离)的缩写。其理念很简单:将更改状态的代码(命令)与读取状态的代码(查询)分开。

// Commands : change state, return little or nothing
// Queries  : return data, change nothing

命令

命令表达了更改系统的意图,例如创建订单或取消订阅。命令通常使用祈使式命名,并且通常只返回一个标识符或不返回任何内容。

public record CreateOrderCommand(int CustomerId, string[] Items);
public record CancelOrderCommand(int OrderId);

查询

查询用于请求数据,不产生副作用。查询通常根据其返回内容命名,并携带所有筛选参数。

public record GetOrderByIdQuery(int OrderId);
public record ListOrdersQuery(int CustomerId, int Page);

为什么要分开

读取和写入有不同的需求:

  • 读取需要快速、反规范化,并且便于缓存。
  • 写入需要验证、业务规则和一致性。

将两者分开后,每一方都可以独立演进和扩展。

// Read side  -> optimized projections / DTOs
// Write side -> domain rules / transactions

handler 模式

每个命令或查询都由专用的 handler 处理。一条消息对应一个 handler,并且各自承担一项职责——这样可以使类保持精简且专注。

// CreateOrderCommand  -> CreateOrderHandler
// GetOrderByIdQuery    -> GetOrderByIdHandler

精简的控制器

使用 CQRS 后,控制器会变得精简。控制器构造一条消息并分发它;所有逻辑都位于 handler 中。这样可以消除臃肿的控制器,并提高可测试性。

[HttpPost]
public async Task<IActionResult> Create(CreateOrderCommand cmd)
{
    var id = await _sender.Send(cmd);
    return CreatedAtAction(nameof(Get), new { id }, null);
}

CQRS 不是事件溯源

一个常见的误解是:CQRS 只是读写分离。事件溯源(将状态存储为事件日志)是另一种模式,虽然与 CQRS 很适合搭配使用,但并非必需。

// You can do CQRS with a plain single database.

单一数据存储与分离数据存储

基础 CQRS 对两方使用同一个数据库。高级方案会使用独立的读存储和写存储,并让它们保持同步,同时为了扩展性接受最终一致性。请从简单方案开始。

// Level 1: one DB, separate handlers (most apps)
// Level 2: separate read/write models
// Level 3: separate read/write databases

优点

CQRS 可以带来:

  • 职责明确、用途单一的 handler。
  • 更容易进行测试——每个 handler 都可以隔离测试。
  • 为横切关注点(验证、日志记录)提供自然的放置位置。
  • 读取和写入可以独立扩展。
// One class per use case = easy to find and test

代价

CQRS 会增加更多类和间接层。对于简单的 CRUD 应用,这可能是过度设计。请在业务逻辑丰富或领域复杂的地方使用它。

// Trade-off: clarity & scale vs. boilerplate

引入 MediatR

MediatR 库实现了进程内中介者模式,将每条消息分发给其 handler,因此您无需手动连接它们。本课程的其余部分都会使用它。

dotnet add package MediatR

快速检查

请确认核心区别。

回顾

您学习了 CQRS 的概念:

  • 将命令(状态更改)与查询(读取)分开。
  • 每条消息都有一个专注的 handler,从而保持控制器精简。
  • CQRS 独立于事件溯源,并且可以使用单个数据库。
  • MediatR 会将消息分发给 handler。

下一步:使用 MediatR 处理命令和 handler。

常见问题解答

「CQRS 概念」课时是免费的吗?

是的 — 「CQRS 概念」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C# Academy 课程的其余内容,请升级到 CoddyKit PRO。 C# Academy 课程共包含 4 节课。

「CQRS 概念」这节课中我会学到什么?

分离命令与查询,使代码更清晰。 你通过在浏览器中直接运行的动手代码来练习 C# Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 C# Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 C# Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。

「CQRS 概念」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 C# Academy 课中编写并运行代码吗?

能。每节 C# Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. CQRS 概念
  2. 使用 MediatR 处理命令和请求
  3. 管道行为
  4. 通知与事件
← 返回 C# Academy