CQRSの概念
明確さを保つため、コマンドとクエリを分離します。
「CQRSの概念」はCoddyKit上の無料C# Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応の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コマンド
コマンドは、注文の作成やサブスクリプションのキャンセルなど、システムの変更意図を表します。命令形の名前を付け、通常は ID だけ、または何も返しません。
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ハンドラーパターン
各コマンドまたはクエリは、専用のハンドラーで処理します。1 つのメッセージ、1 つのハンドラー、1 つの責務にすることで、クラスを小さく、焦点の絞られたものに保てます。
// CreateOrderCommand -> CreateOrderHandler
// GetOrderByIdQuery -> GetOrderByIdHandler薄いコントローラー
CQRS を使うと、コントローラーは薄くなります。コントローラーはメッセージを作成してディスパッチし、すべてのロジックはハンドラーに置きます。これにより、肥大化したコントローラーをなくし、テスト容易性を高められます。
[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 では、両方で 1 つのデータベースを使います。高度な構成では、読み取り用と書き込み用のストアを分けて同期し、スケールのために結果整合性を受け入れます。まずはシンプルに始めてください。
// Level 1: one DB, separate handlers (most apps)
// Level 2: separate read/write models
// Level 3: separate read/write databasesメリット
CQRS には次のメリットがあります。
- 目的が明確で、単一の責務を持つハンドラー。
- 各ハンドラーを分離してテストできるため、テストが容易。
- 検証やロギングなど、横断的関心事を置く自然な場所。
- 読み取りと書き込みを独立してスケール可能。
// One class per use case = easy to find and testコスト
CQRS ではクラスと間接層が増えます。単純な CRUD アプリでは、過剰設計になる可能性があります。ビジネスロジックが豊富な場合や、ドメインが複雑な場合に適用してください。
// Trade-off: clarity & scale vs. boilerplateMediatR の導入
MediatR ライブラリは、各メッセージをハンドラーにディスパッチするプロセス内メディエーターパターンを実装しています。そのため、メッセージとハンドラーを手作業で接続する必要がありません。このコースの以降の内容では、これを使用します。
dotnet add package MediatR理解度チェック
基本的な違いを確認しましょう。
まとめ
CQRS の概念を学びました。
- 状態を変更するコマンドと、読み取りを行うクエリを分離します。
- 各メッセージに焦点を絞ったハンドラーを 1 つ割り当て、コントローラーを薄く保ちます。
- CQRS はイベントソーシングとは独立しており、単一のデータベースでも使用できます。
- MediatR がメッセージをハンドラーにディスパッチします。
次は、MediatR を使ったコマンドとハンドラーについて学びます。
よくある質問
「CQRSの概念」レッスンは無料ですか?
はい。「CQRSの概念」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C# Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C# Academyコースには全4レッスンが含まれています。
「CQRSの概念」で何を学びますか?
明確さを保つため、コマンドとクエリを分離します。 ブラウザで直接実行するハンズオンコードでC# Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
C# Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのC# Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「CQRSの概念」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このC# Academyレッスンでコードを書いて実行できますか?
はい。すべてのC# Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。