IRONSOFTWAREHOME
开发者更新

CQRS模式C#(开发人员如何使用)

Jacob Mellor,Team Iron 的首席技术官
Jacob Mellor
Updated: 2026年4月21日

CQRS 介绍

CQRS 代表命令查询职责分离。 这是一个专注于将数据的读取与写入分离的模式。 这种区别出于多种原因至关重要。 首先,它使每个操作的优化更具灵活性,从而提高应用程序的性能和可扩展性。 当您分离命令(写入)和查询(读取)时,可以独立优化它们。

例如,一个复杂的应用程序可能需要快速的读取操作,但可以容忍较慢的写入操作。 通过应用 CQRS,开发人员可以为读取和写入使用不同的数据模型,将数据访问层分隔开,以满足每个操作的特定需求。 在本文中,我们将探讨 CQRS 模式的概念以及 *IronPDF 库适用于 .NET 开发者。

核心概念和组件

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 Pattern C# (开发人员的工作原理):图 1 - 创建一个新的 ASP.NET 项目

    CQRS模式C#(开发人员如何使用):图1 - 创建一个新的ASP.NET项目

  3. 选择 ASP.NET Core 的"Web 应用程序(模型-视图-控制器)"模板。确保您正在定位符合您要求的 .NET Core 版本。 点击创建。

步骤 2 接下来,您需要为 CQRS 组织您的项目。 点击创建

您可以通过添加文件夹来分隔命令、查询和它们将使用的公共接口来完成这项工作。

在解决方案资源管理器中,右键单击您的项目,转到"添加",然后选择"新建文件夹"。 创建三个文件夹:"Commands"、"Queries"和"Interfaces"。 在"Interfaces"文件夹中,为您的命令和查询添加接口。 对于命令,您可能会有一个接口 ICommandHandler,其中包含一个 Handle 方法,该方法接受命令并执行操作。

对于查询,您可能会有一个接口 IQueryHandler,其中包含一个 Handle 方法,该方法接收查询并返回数据。 CQRS Pattern C# (开发人员的工作原理):图 2 - 文件组织示例 ### 步骤 3

CQRS模式C#(开发人员如何使用):图2 - 文件可能的组织方式示例

假设您的应用程序管理任务,您想添加一项任务(命令)并检索任务(查询)。

在"Interfaces"文件夹中,添加两个接口: 在"Commands"文件夹中,添加一个类 AddItemCommand,包含任务详细信息的属性。

同时,添加一个类 AddItemCommandHandler,它实现了 ICommandHandler 并包含将任务添加到数据库的逻辑。

// 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网页

探索 IronPDF 进行 PDF 管理 是一个为使用 C# 编程语言的开发人员提供的工具,使他们能够直接在应用程序中创建、读取和编辑 PDF 文档。 该库用户友好,使生成 PDF 报告、发票或 从 HTML 创建 PDF 代码的 PDF 功能集成变得更简单。 IronPDF 支持各种功能,包括编辑 PDF 中的文本和图像、设置文档安全性以及将网页转换为 PDF 格式。 它的多功能性和易用性使其成为希望在项目中实现 PDF 操作的开发人员的宝贵资源。

IronPDF 在其 HTML 转 PDF 转换功能 方面表现出色,保持所有布局和样式不变。 它可以从 web 内容创建 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");
    }
}

代码示例

现在,让我们探索如何在遵循命令查询职责分离 (CQRS) 模式的 C# 应用程序中利用 IronPDF。 下面是一个简化的示例,演示如何在 CQRS 设置中使用 IronPDF 生成 PDF 报告。 这个示例是概念性的,重点是将 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 模式中的一个命令。 它包括一个方法 GenerateReportAsync,接受 reportContent 作为 HTML 字符串,以及一个 outputPath,PDF 报告将保存在此路径下。 IronPDF 的 HtmlToPdf 类用于将 HTML 内容转换为 PDF 格式,然后保存到指定路径。 这个设置说明了如何将 PDF 生成功能集成到您应用程序的架构中,特别是在需要按 CQRS 提倡的明确关注点分离的场景中。

CQRS模式C#(开发人员如何使用):图4 - 输出的PDF

结论

最后,命令查询职责分离 (CQRS) 模式提供了一种结构化的方法,以在应用程序中分离读取和写入数据的职责。 这种分离不仅阐明了架构,还增强了您系统的灵活性、可扩展性和性能。 通过遵循上述步骤,您可以在ASP.NET Core应用程序中实现CQRS,使用像MediatR这样的工具来简化命令、查询及其处理程序之间的沟通。

将IronPDF集成到基于CQRS的应用程序中进一步扩展了其功能,使您能够轻松创建、操作和存储PDF文档。 若要持续使用,许可证从$999起价,为您的项目需求提供多种选择。 IronPDF 提供免费试用版,让您有机会在承诺之前探索其功能。 要继续使用,许可证从$999开始,提供各种选项以满足您的项目需求。

Jacob Mellor,Team Iron 的首席技术官
首席技术官

Jacob Mellor 是 Iron Software 的首席技术官,也是一位开创 C# PDF 技术的有远见的工程师。作为 Iron Software 核心代码库的原始开发者,他从公司成立之初就开始塑造公司的产品架构,与首席执行官 Cameron Rimington 一起将公司转变为一家拥有 50 多名员工的公司,为 NASA、特斯拉和全球政府机构提供服务。

相关文章

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

深受全球数百万工程师信赖

Iron Software 的客户徽标
获取您的无义务咨询
填写下面的表格或通过sales@ironsoftware.com
您的资料将始终保密。
深受全球数百万工程师信赖
Iron Software 的客户徽标
立即获取您的免费30 天试用密钥。
无需信用卡或创建账户
C# 用于 PDF 的 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 起