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 / transactionshandler 模式
每个命令或查询都由专用的 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 反馈 — 无需本地设置。
此课程中的所有课时
- CQRS 概念
- 使用 MediatR 处理命令和请求
- 管道行为
- 通知与事件