0Pricing
C# Academy · レッスン

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. boilerplate

MediatR の導入

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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. CQRSの概念
  2. MediatRによるコマンドとハンドラー
  3. パイプラインビヘイビアー
  4. 通知とイベント
← C# Academyに戻る