IRONSOFTWAREHOME
開発者向けアップデート

CQRS Pattern C#(開発者向けの動作方法)

Jacob Mellor、Ironチームの最高技術責任者(CTO)
Jacob Mellor
Updated: 2026年4月21日

CQRS イントロダクション

CQRS はコマンドクエリ責任分離の略です。 データの読み取りと書き込みを分離することに焦点を当てたパターンです。 この違いは、いくつかの理由で重要です。 まず、各操作をより柔軟に最適化でき、アプリケーションのパフォーマンスとスケーラビリティを向上させます。 コマンド(書き込み)とクエリ(読み込み)を分けると、それぞれを独立して最適化できます。

例えば、複雑なアプリケーションは高速な読み取り操作を要求するかもしれませんが、遅い書き込み操作には耐えられるかもしれません。 CQRS を適用することで、開発者は読み込みと書き込みに異なるデータモデルを使用でき、各操作の特定のニーズに合わせてデータアクセス層を分離することができます。 この記事では、CQRS パターンのコンセプトと、.NET 開発者向けの *IronPDF ライブラリを探ります。

コアの概念と要素

CQRS の核心は、コマンドとクエリ操作を分離することにあります。それぞれがデータとの相互作用の異なる側面を扱います。 これらの要素を理解することは、パターンを効果的に実装するために重要です。

***コマンド:**データの更新を担当します。 コマンドは複雑なビジネスロジックを体現し、情報を返すことなく行動することでデータストアのデータ状態を変更することができます。 コマンドは書き込みデータタスクを扱う専属の役割を果たし、出力を出さずにアプリケーションの状態に直接影響を与えます。 例えば、新しいユーザーを追加することや既存の製品の詳細を更新することはコマンドによって実行されるアクションです。

***クエリ:**クエリ ハンドラーによって管理されるクエリは、システムの状態を変更せずにデータを取得したり、データ オブジェクトを転送したりします。 それらはデータについての質問です。 例えば、ユーザーのプロフィールを取得することや在庫にある全ての製品をリストすることがクエリです。 クエリはデータを返しますが、データやその状態を変更しないことを保証します。

.NET アプリケーションで CQRS を実装する一般的なツールの一つは、メディエーターパターンライブラリである MediatR です。 それはアプリケーションのコンポーネント間の結合を減らし、彼らを間接的に通信させます。 MediatR はコマンドとクエリのハンドリングを仲介して、コマンド/クエリとそのハンドラを仲介します。

ASP.NET Core を用いた実践的な実装

ASP.NET Core における CQRS パターンの実装は、コマンドとクエリを分離するプロジェクトをセットアップし、MediatR のようなライブラリを用いてそれらを仲介します。 以下は、ASP.NET Core アプリケーションで CQRS を設定する方法の簡略化された概要です。

ステップ 1: ASP.NET アプリケーションの設定

  1. Visual Studio を起動し、新しいプロジェクトを作成することを選択します。

  2. "ASP.NET Core Web アプリケーション"プロジェクトタイプを検索して選択します。 次へをクリックします。

    CQRS パターン C# (開発者向けの仕組み): 図 1 - 新しいASP.NETプロジェクトの作成

  3. プロジェクトに名前を付けて、その場所を設定します。 作成をクリックします。

  4. ASP.NET Core の"Web アプリケーション (モデルビューコントローラ)"テンプレートを選択します。 あなたの要件に合う .NET Core バージョンを対象にしていることを確認してください。 作成をクリックします。

ステップ2

次に、CQRS のためにプロジェクトを整理したくなるでしょう。 コマンド、クエリ、およびそれらが使用する共通インターフェースを分離するフォルダを追加することでこれを行うことができます。 ソリューションエクスプローラーで、プロジェクトを右クリックし、"追加"に移動し、"新しいフォルダ"を選択します。 3つのフォルダ"Commands"、"Queries"、"Interfaces"を作成します。

"Interfaces"フォルダに、あなたのコマンドとクエリのインターフェースを追加します。 コマンドの場合、ICommandHandler というインターフェースがあり、コマンドを取り込みアクションを実行する Handle というメソッドがあります。 クエリの場合、IQueryHandler というインターフェースがあり、クエリを取り込みデータを返す Handle というメソッドを持つことができます。

CQRS パターン C# (開発者向けの仕組み): 図 2 - ファイルの整理方法の例

ステップ3

さて、デモンストレーションのためにコマンドとクエリを追加しましょう。 あなたのアプリケーションがタスクを管理するし、タスクを追加 (コマンド) し、タスクを取得 (クエリ) したいとしましょう。

"Interfaces"フォルダに、2つのインターフェースを追加します:

// Define interfaces for your handlers:
public interface ICommandHandler<TCommand>
{
    void Handle(TCommand command);
}

public interface IQueryHandler<TQuery, TResult>
{
    TResult Handle(TQuery query);
}

"Commands"フォルダに、AddItemCommand クラスを追加し、タスクの詳細をプロパティとして設定します。 また、ICommandHandler を実装し、データベースにタスクを追加するロジックを含む AddItemCommandHandler クラスを追加します。

"Queries"フォルダに、タスクのリクエストを表す GetTasksQuery クラスを追加します。 IQueryHandler を実装し、データベースからのタスクを取得するロジックを含む GetTasksQueryHandler クラスを追加します。

単純な例として、AddItemCommand は次のように見えるかもしれません:

public class AddItemCommand
{
    public string Name { get; set; }
    public int Quantity { get; set; }

    // Constructor
    public AddItemCommand(string name, int quantity)
    {
        Name = name;
        Quantity = quantity;
    }
}

そして、 AddItemCommandHandler:

public class AddItemCommandHandler : ICommandHandler<AddItemCommand>
{
    public void Handle(AddItemCommand command)
    {
        // Here, you'd add the item to your database, for example, to have employee data stored
        Console.WriteLine($"Adding item: {command.Name} with quantity {command.Quantity}");
        // Add database logic here
    }
}

GetItemsQuery はタスクをフェッチするためのパラメータが必要ない場合は空であり、GetItemsQueryHandler は次のように見えるかもしれません:

public class GetItemsQuery
{
    // This class might not need any properties, depending on your query
}

namespace CQRS_testing.Queries
{
    using CQRS_testing.Interfaces;

    public class GetItemsQueryHandler : IQueryHandler<GetItemsQuery, IEnumerable<string>>
    {
        public IEnumerable<string> Handle(GetItemsQuery query)
        {
            // Here, you'd fetch items from your database
            return new List<string> { "Item1", "Item2" };
        }
    }
}

ASP.NET コントローラでは、これらのハンドラを使用してコマンドとクエリを処理します。 タスクを追加する場合、コントローラアクションは AddTaskCommand を作成し、フォームデータからプロパティを設定し、そしてそれを処理するために AddTaskCommandHandler のインスタンスに渡します。 タスクを取得する場合、データを取得しビューに渡すために GetTasksQueryHandler を呼び出します。

コントローラで接続する

コマンドとクエリが設定されたら、それらをコントローラで使用することができます。 以下は、ItemsController クラスでこれを行う方法の例です:

public class ItemsController : Controller
{
    private readonly ICommandHandler<AddItemCommand> _addItemHandler;
    private readonly IQueryHandler<GetItemsQuery, IEnumerable<string>> _getItemsHandler;

    // Constructor injection is correctly utilized here
    public ItemsController(ICommandHandler<AddItemCommand> addItemHandler, IQueryHandler<GetItemsQuery, IEnumerable<string>> getItemsHandler)
    {
        _addItemHandler = addItemHandler;
        _getItemsHandler = getItemsHandler;
    }

    public IActionResult Index()
    {
        // Use the injected _getItemsHandler instead of creating a new instance
        var query = new GetItemsQuery();
        var items = _getItemsHandler.Handle(query);
        return View(items);
    }

    [HttpPost]
    public IActionResult Add(string name, int quantity)
    {
        // Use the injected _addItemHandler instead of creating a new instance
        var command = new AddItemCommand(name, quantity);
        _addItemHandler.Handle(command);
        return RedirectToAction("Index");
    }
}

特に ASP.NET Core で依存性注入 (DI) を使用している場合は、Startup.cs ファイルでの DI コンテナへのコマンドとクエリハンドラを登録して、すべてを接続します。この方法で、ASP.NET は必要なときにハンドラのインスタンスを提供できます。

ハンドラを登録する基本的な例がこちらです:

builder.Services.AddTransient<ICommandHandler<AddItemCommand>, AddItemCommandHandler>();
builder.Services.AddTransient<IQueryHandler<GetItemsQuery, IEnumerable<string>>, GetItemsQueryHandler>();

CQRS の実践的な適用において、書き込み操作のデータモデルと読み込み操作のデータモデルの違いは本質的であり、データの取り扱いをサポートする多様で最適化されたアプローチをアーキテクチャに保証します。

IronPDF: C# PDFライブラリ

CQRS パターン C# (開発者向けの仕組み): 図 3 - IronPDF Web ページ

IronPDF を使用した PDF 管理を探求する は、C# プログラミング言語で作業する開発者向けのツールで、アプリケーション内で直接 PDF ドキュメントを作成、読み取り、および編集することができます。 このライブラリはユーザーフレンドリーで、PDF レポートの生成、請求書の作成、または HTML コードから PDF を作成する などの PDF 機能を統合するのが簡単です。 IronPDF は、PDF 内の文字や画像の編集、ドキュメントのセキュリティ設定、ウェブページを PDF 形式に変換することができるなど、さまざまな機能をサポートしています。 その多用途性と使いやすさは、プロジェクトに PDF 操作を実装しようとする開発者にとって貴重なリソースです。

IronPDF は、その HTML to PDF 変換機能 で優れており、すべてのレイアウトとスタイルを保持します。 それはウェブコンテンツから PDF を作成し、レポート、請求書、ドキュメントに適しています。 HTMLファイル、URL、およびHTML文字列をシームレスにPDFに変換できます。

using IronPdf;

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();

        // 1. Convert HTML String to PDF
        var htmlContent = "<h1>Hello, IronPDF!</h1><p>This is a PDF from an HTML string.</p>";
        var pdfFromHtmlString = renderer.RenderHtmlAsPdf(htmlContent);
        pdfFromHtmlString.SaveAs("HTMLStringToPDF.pdf");

        // 2. Convert HTML File to PDF
        var htmlFilePath = "path_to_your_html_file.html"; // Specify the path to your HTML file
        var pdfFromHtmlFile = renderer.RenderHtmlFileAsPdf(htmlFilePath);
        pdfFromHtmlFile.SaveAs("HTMLFileToPDF.pdf");

        // 3. Convert URL to PDF
        var url = "http://ironpdf.com"; // Specify the URL
        var pdfFromUrl = renderer.RenderUrlAsPdf(url);
        pdfFromUrl.SaveAs("URLToPDF.pdf");
    }
}

コード例

さあ、IronPDF が CQRS パターンに従う C# アプリケーション内でどのように利用できるかを探っていきましょう。 以下は、CQRS 設定内で PDF レポートを生成するために IronPDF を使用する方法を示す簡単な例です。 この例は概念的なものであり、コマンドとしての PDF ドキュメントの生成に焦点を当てています。

using IronPdf;
using System.Threading.Tasks;

namespace PdfGenerationApp.Commands
{
    public class GeneratePdfReportCommand
    {
        // Command handler that generates a PDF report
        public async Task GenerateReportAsync(string reportContent, string outputPath)
        {
            // Initialize the IronPDF HTML to PDF renderer
            var renderer = new ChromePdfRenderer();
            // Use IronPDF to generate a PDF from HTML content
            var pdf = await Task.Run(() => renderer.RenderHtmlAsPdf(reportContent));
            // Save the generated PDF to a specified path
            pdf.SaveAs(outputPath);
        }
    }
}

この例では、GeneratePdfReportCommand は CQRS パターンにおけるコマンドを表します。 それは reportContent を HTML 文字列として、outputPath に PDF レポートを保存する GenerateReportAsync というメソッドを含みます。 IronPDF の HtmlToPdf クラスを使って、HTML コンテンツを PDF 形式に変換し、指定されたパスに保存します。 このセットアップは、特に CQRS で推進される責任分離が必要なシナリオで、アプリケーションのアーキテクチャに PDF 生成機能を統合する方法を示しています。

CQRS パターン C# (開発者向けの仕組み): 図 4 - 出力された PDF

結論

要約すると、コマンドクエリ責任分離(CQRS)パターンは、アプリケーションにおけるデータの読み取りと書き込み責任を分離するための構造化されたアプローチを提供します。 この分離は、アーキテクチャを明確にするだけでなく、システムの柔軟性、スケーラビリティ、パフォーマンスを向上させます。 上記のステップに従うことで、ASP.NET Core アプリケーションに CQRS を実装し、MediatR のようなツールを使用してコマンド、クエリ、およびそのハンドラ間の通信を簡素化することができます。

IronPDF を CQRS ベースのアプリケーションに統合することで、その能力がさらに拡大し、PDF ドキュメントの作成、操作、および保存が簡単になります。 レポート、請求書、またはあらゆる形式のドキュメントを生成する際に、IronPDF の包括的な機能と簡潔な構文は、開発工具キットにおける強力なツールとなります。 IronPDF は 無料トライアルを提供しており、コミットする前にその機能性を探索する機会を提供します。 継続使用のために、ライセンスは$999から始まり、プロジェクトのニーズに合わせたさまざまなオプションを提供します。

Jacob Mellor、Ironチームの最高技術責任者(CTO)
最高技術責任者(CTO)

ジェイコブ・メラーはIron Softwareの最高技術責任者(CTO)であり、C# PDFテクノロジーを開拓する先見的なエンジニアです。Iron Softwareのコアコードベースを支えるオリジナル開発者として、彼は創業以来、会社の製品アーキテクチャを形成し、CEOのCameron Rimingtonとともに、会社をNASA、Tesla、および世界的な政府機関にサービスを提供する50人以上の会社に変えました。1999年にロンドンで最初のソフトウェアビジネスを開業し、2005年に最初 for .NETコンポーネントを作成した後、Microsoftのエコシステム全体で複雑な問題を解決することを専門としました。

関連する記事

Key in blue circle

無料の30日間トライアルキーをすぐに入手してください。

Your trial license will be sent to your email address

制限なし。100% ロック解除済み。クレジットカード不要。

OR
bullet_checkedクレジットカードやアカウントの作成は不要です。制限なし。100% ロック解除済み。クレジットカード不要。
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried Iron Suite
無料のライブデモを予約する
Booking Badge

世界中の数百万人のエンジニアから信頼されています。

ライセンスはより安く
義務のない相談を受ける
下記のフォームを記入するか、sales@ironsoftware.comにメールしてください。
あなたの詳細は常に守秘されます。
世界中の数百万人のエンジニアから信頼されています。
ライセンスはより安く
あなたの無料30日間の試用キーをすぐに入手。
クレジットカードやアカウントの作成は不要です。
PDF用C# NuGetライブラリ
NuGetでインストール

バージョン: 2026.9

PM > Install-Package IronPdf
nuget.org/packages/IronPdf/
  1. ソリューションエクスプローラーで参照を右クリックし、NuGetパッケージを管理を選択
  2. ブラウズを選択し、"IronPDF"を検索
  3. パッケージを選択してインストール
C# PDF DLL
DLLをダウンロード

バージョン: 2026.9

またはここからWindowsインストーラーをダウンロードする。

  1. IronPDFを~/Libsなどの場所に解凍し、ソリューションディレクトリ内に配置する
  2. Visual Studioソリューションエクスプローラーで参照を右クリックし、"IronPDF.dll"をブラウズして選択

ライセンスは$999から