跳至页脚内容
.NET 帮助

Mediatr C#(开发人员如何使用)

MediatR 是一个流行的 .NET 库,实现了中介者模式,使对象通过中介者而不是直接相互通信。 这种方法在希望在组件之间保持低耦合的应用程序中特别有用。 在本文中,我们将详细了解 C# 开发中的 MediatR,提供如何将其集成到您的 Web 应用程序项目中的实际示例和指导。 我们还将探索IronPDF 用于 .NET 应用程序中的 PDF 功能的库,以便在 ASP.NET Core 项目中集成 PDF 功能。

中介者模式和 MediatR 简介

Mediatr C# (对开发人员的工作方式):图 1 - MediatR 和中介者模式

中介者模式是一种软件设计模式,以降低对象之间的直接依赖关系的方式促进对象之间的交互,促进松耦合。 MediatR 提供了一个不复杂的中介者实现,专注于促进对象通信的简单性和效率。

MediatR 库的核心概念是请求和多个处理程序。 在请求点上,对象封装操作或动作详情,等待 MediatR 机制的处理。 每个请求由相应的处理程序或处理方法处理,该方法包含执行请求的业务逻辑。这种结构对于实现命令查询职责分离 (CQRS) 模式特别有用,因为读写操作的分离可以导致更易维护和扩展的软件架构。

使用包管理器控制台在 .NET Core 项目中安装 MediatR

要在 ASP.NET Core 项目中开始使用 MediatR,您首先需要安装 MediatR 包。 这可以通过 Visual Studio 的包管理器控制台使用以下命令完成:

Install-Package MediatR

Mediatr C# (对开发人员的工作方式):图 2 - 安装 MediatR

安装包后,需要将 MediatR 添加到 ASP.NET Core 依赖注入容器中。 这通常在您的 Web 应用程序项目的 Program.csStartup.cs 文件中完成,具体取决于您使用的 ASP.NET Core 版本。 以下是在具有最小 API 表现层的程序中如何做到这一点的方法。

// Initialize a new web application
var builder = WebApplication.CreateBuilder(args);

// Add MediatR to the service container
builder.Services.AddMediatR(typeof(Program).Assembly);

// Build the web application
var app = builder.Build();
// Initialize a new web application
var builder = WebApplication.CreateBuilder(args);

// Add MediatR to the service container
builder.Services.AddMediatR(typeof(Program).Assembly);

// Build the web application
var app = builder.Build();
' Initialize a new web application
Dim builder = WebApplication.CreateBuilder(args)

' Add MediatR to the service container
builder.Services.AddMediatR(GetType(Program).Assembly)

' Build the web application
Dim app = builder.Build()
$vbLabelText   $csharpLabel

在程序类中,var builder = WebApplication.CreateBuilder(args); 初始化 Web 应用程序,为 MediatR 集成做好准备。

创建您的第一个 MediatR 请求和处理程序

MediatR 请求是表示执行特定操作所需数据的简单类。 以下是一个表示创建新用户的命令的请求类示例。

public class CreateUserCommand : IRequest<int>
{
    public string Name { get; set; }
    public string Email { get; set; }
    public int Id { get; set; }
}
public class CreateUserCommand : IRequest<int>
{
    public string Name { get; set; }
    public string Email { get; set; }
    public int Id { get; set; }
}
Public Class CreateUserCommand
	Implements IRequest(Of Integer)

	Public Property Name() As String
	Public Property Email() As String
	Public Property Id() As Integer
End Class
$vbLabelText   $csharpLabel

在此示例中,CreateUserCommand 类实现 IRequest 接口,指示该请求期望整数响应,这可能代表创建用户的 ID。

接下来,您需要为此请求创建一个处理程序。在每个处理程序中,Handle 方法是执行请求的逻辑所在的地方:

public class CreateUserHandler : IRequestHandler<CreateUserCommand, int>
{
    public async Task<int> Handle(CreateUserCommand command, CancellationToken token)
    {
        // Implement logic to create a user here
        // For this example, let's pretend we create a user and return the ID
        return await Task.FromResult(1); // Assume the user's ID is 1
    }
}
public class CreateUserHandler : IRequestHandler<CreateUserCommand, int>
{
    public async Task<int> Handle(CreateUserCommand command, CancellationToken token)
    {
        // Implement logic to create a user here
        // For this example, let's pretend we create a user and return the ID
        return await Task.FromResult(1); // Assume the user's ID is 1
    }
}
Public Class CreateUserHandler
	Implements IRequestHandler(Of CreateUserCommand, Integer)

	Public Async Function Handle(ByVal command As CreateUserCommand, ByVal token As CancellationToken) As Task(Of Integer)
		' Implement logic to create a user here
		' For this example, let's pretend we create a user and return the ID
		Return Await Task.FromResult(1) ' Assume the user's ID is 1
	End Function
End Class
$vbLabelText   $csharpLabel

在您的应用程序中使用 MediatR

通过遵循设置 MediatR 使用的相同过程,您可以将其集成到您的应用程序工作流程中。 这通常通过 ASP.NET Core 应用程序中的控制器或端点完成。 以下是使用 API 控制器的示例:

[ApiController]
[Route("[controller]")]
public class UsersController : ControllerBase
{
    private readonly IMediator _mediator;

    public UsersController(IMediator mediator)
    {
        _mediator = mediator;
    }

    [HttpPost]
    public async Task<ActionResult<int>> Create(CreateUserCommand command)
    {
        var userId = await _mediator.Send(command);
        return CreatedAtRoute("GetUser", new { id = userId }, command);
    }
}
[ApiController]
[Route("[controller]")]
public class UsersController : ControllerBase
{
    private readonly IMediator _mediator;

    public UsersController(IMediator mediator)
    {
        _mediator = mediator;
    }

    [HttpPost]
    public async Task<ActionResult<int>> Create(CreateUserCommand command)
    {
        var userId = await _mediator.Send(command);
        return CreatedAtRoute("GetUser", new { id = userId }, command);
    }
}
<ApiController>
<Route("[controller]")>
Public Class UsersController
	Inherits ControllerBase

	Private ReadOnly _mediator As IMediator

	Public Sub New(ByVal mediator As IMediator)
		_mediator = mediator
	End Sub

	<HttpPost>
	Public Async Function Create(ByVal command As CreateUserCommand) As Task(Of ActionResult(Of Integer))
		Dim userId = Await _mediator.Send(command)
		Return CreatedAtRoute("GetUser", New With {Key .id = userId}, command)
	End Function
End Class
$vbLabelText   $csharpLabel

在此控制器中,Create 动作方法通过调用 _mediator.Send(command)CreateUserCommand 发送到 MediatR。 然后 MediatR 找到适合此命令的处理程序并执行它。 结果返回并在同一过程中用于生成响应。

超越基本请求:通知和行为

MediatR 还支持通知和行为。 通知是多个处理程序可以订阅和处理的消息,允许应用程序中采用更多事件驱动的方法。 另一方面,行为类似于 MediatR 请求的中间件,允许您实现跨领域关注点,如日志记录、验证或事务管理。

IronPDF库简介

Mediatr C# (对开发人员的工作方式):图 3 - IronPDF

IronPDF 是为 .NET 开发人员设计的 C# 库,他们需要一种简单的方法来在其应用程序中创建、编辑和处理 PDF 文件,而无需担心写入问题。 开发人员可以简单地将网页或HTML 代码直接转换为 PDF 格式,而无需使用复杂的 API。 IronPDF 不仅限于创建 PDF; 它还提供用于编辑 PDF 的功能,例如添加文本、图像和页面,甚至在 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");
    }
}
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");
    }
}
Imports IronPdf

Friend Class Program
	Shared Sub Main(ByVal args() As String)
		Dim renderer = New ChromePdfRenderer()

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

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

		' 3. Convert URL to PDF
		Dim url = "http://ironpdf.com" ' Specify the URL
		Dim pdfFromUrl = renderer.RenderUrlAsPdf(url)
		pdfFromUrl.SaveAs("URLToPDF.pdf")
	End Sub
End Class
$vbLabelText   $csharpLabel

代码示例

在此示例中,我们假设 MediatR 请求指的是某种形式的媒体内容或元数据,我们希望将其包含在我们的 PDF 中。 由于 MediatR 不直接与 IronPDF 的功能相关联,我们将通过从包含媒体信息或引用的 HTML 内容创建 PDF 文档来开始使用。

using IronPdf;

public class PdfGenerator
{
    public void CreatePdfWithMediaInfo(string htmlContent)
    {
        // Insert your License Key here if required
        License.LicenseKey = "License-Key";

        // Initialize the HtmlToPdf renderer
        var renderer = new ChromePdfRenderer();

        // Create an HTML template with media information
        string htmlTemplate = $@"
            <html>
            <head>
                <title>Media Information</title>
            </head>
            <body>
                <h1>Media Details</h1>
                <!-- Insert your media information here -->
                {htmlContent}
            </body>
            </html>";

        // Convert the HTML string to a PDF document
        var pdfDocument = renderer.RenderHtmlAsPdf(htmlTemplate);
        pdfDocument.SaveAs("MediaInformation.pdf");
    }
}

class Program
{
    static void Main(string[] args)
    {
        // Example HTML content with MediatR information
        string htmlContent = @"
            <div>
                <h2>MediatR Information</h2>
                <p>MediatR is a media tracking system...</p>
            </div>";

        // Create an instance of PdfGenerator
        PdfGenerator pdfGenerator = new PdfGenerator();

        // Call the CreatePdfWithMediaInfo method to generate the PDF
        pdfGenerator.CreatePdfWithMediaInfo(htmlContent);

        Console.WriteLine("PDF generated successfully.");
    }
}
using IronPdf;

public class PdfGenerator
{
    public void CreatePdfWithMediaInfo(string htmlContent)
    {
        // Insert your License Key here if required
        License.LicenseKey = "License-Key";

        // Initialize the HtmlToPdf renderer
        var renderer = new ChromePdfRenderer();

        // Create an HTML template with media information
        string htmlTemplate = $@"
            <html>
            <head>
                <title>Media Information</title>
            </head>
            <body>
                <h1>Media Details</h1>
                <!-- Insert your media information here -->
                {htmlContent}
            </body>
            </html>";

        // Convert the HTML string to a PDF document
        var pdfDocument = renderer.RenderHtmlAsPdf(htmlTemplate);
        pdfDocument.SaveAs("MediaInformation.pdf");
    }
}

class Program
{
    static void Main(string[] args)
    {
        // Example HTML content with MediatR information
        string htmlContent = @"
            <div>
                <h2>MediatR Information</h2>
                <p>MediatR is a media tracking system...</p>
            </div>";

        // Create an instance of PdfGenerator
        PdfGenerator pdfGenerator = new PdfGenerator();

        // Call the CreatePdfWithMediaInfo method to generate the PDF
        pdfGenerator.CreatePdfWithMediaInfo(htmlContent);

        Console.WriteLine("PDF generated successfully.");
    }
}
Imports IronPdf

Public Class PdfGenerator
	Public Sub CreatePdfWithMediaInfo(ByVal htmlContent As String)
		' Insert your License Key here if required
		License.LicenseKey = "License-Key"

		' Initialize the HtmlToPdf renderer
		Dim renderer = New ChromePdfRenderer()

		' Create an HTML template with media information
		Dim htmlTemplate As String = $"
            <html>
            <head>
                <title>Media Information</title>
            </head>
            <body>
                <h1>Media Details</h1>
                <!-- Insert your media information here -->
                {htmlContent}
            </body>
            </html>"

		' Convert the HTML string to a PDF document
		Dim pdfDocument = renderer.RenderHtmlAsPdf(htmlTemplate)
		pdfDocument.SaveAs("MediaInformation.pdf")
	End Sub
End Class

Friend Class Program
	Shared Sub Main(ByVal args() As String)
		' Example HTML content with MediatR information
		Dim htmlContent As String = "
            <div>
                <h2>MediatR Information</h2>
                <p>MediatR is a media tracking system...</p>
            </div>"

		' Create an instance of PdfGenerator
		Dim pdfGenerator As New PdfGenerator()

		' Call the CreatePdfWithMediaInfo method to generate the PDF
		pdfGenerator.CreatePdfWithMediaInfo(htmlContent)

		Console.WriteLine("PDF generated successfully.")
	End Sub
End Class
$vbLabelText   $csharpLabel

在此代码片段中,htmlContent 是一个变量,应包含您的媒体信息以 HTML 格式。 这可以包括文本、图像、视频链接或任何其他 HTML 兼容内容。 IronPDF 将此 HTML 内容转换为 PDF 文档,保留 HTML 中指定的布局和格式。

Mediatr C# (对开发人员的工作方式):图 4 - PDF 输出

结论

Mediatr C# (对开发人员的工作方式):图 5 - 授权

通过按照本文中概述的步骤,您现在应该为将 MediatR 合并到您的项目中奠定了坚实的基础,从基本的命令和查询处理开始,一直到利用更高级的功能如通知和行为。 随着应用程序的增长和发展,MediatR 提供了可以帮助保持代码库清晰、可维护和可扩展的工具和模式。

结束时,值得注意的是,探索和集成不同的库和工具,如 IronPDF,可能会进一步增强您的 .NET 项目。 IronPDF 提供高级 PDF 功能的免费试用。 对于需要高级 PDF 功能的项目,IronPDF 的授权从 $799 开始,为 .NET 开发人员提供了一种扩展其应用程序功能的强大解决方案。

常见问题解答

如何将 MediatR 集成到 ASP.NET Core 项目中?

要将 MediatR 集成到 ASP.NET Core 项目中,请在 Program.cs 或 Startup.cs 文件中将其添加到依赖注入容器。可以使用包管理器控制台通过以下命令安装:Install-Package MediatR

请求和处理程序在 MediatR 中扮演什么角色?

在 MediatR 中,请求封装了操作的详细信息,而处理程序通过执行必要的业务逻辑来处理这些请求。这支持命令查询责任分离(CQRS)模式,提高了应用程序的可维护性。

通知和行为如何增强 MediatR?

MediatR 中的通知允许多个处理程序对单一消息做出反应,促进事件驱动的方法。行为作为中间件来处理诸如日志、验证和异常处理之类的跨领域问题。

在 .NET 应用程序中使用中介者模式有什么好处?

由 MediatR 实现的中介者模式减少了组件之间的直接依赖,促进了松散耦合。通过遵循清晰架构原则,这增强了 .NET 应用程序的可维护性和可扩展性。

如何在 .NET 应用程序中将 HTML 转换为 PDF?

IronPDF 允许在 .NET 应用程序中将 HTML 转换为 PDF。可以使用 RenderHtmlAsPdf 方法转换 HTML 字符串或使用 RenderUrlAsPdf 转换 URL,以确保在生成的 PDF 中保留布局。

IronPDF 提供了哪些用于 PDF 管理的高级功能?

IronPDF 提供高级 PDF 管理功能,如合并、拆分、编辑 PDF,并通过密码和权限对其进行保护。这些功能非常适合如生成报告、发票和其他文档等任务。

MediatR 如何支持 CQRS 模式?

MediatR 支持 CQRS 模式,通过将处理命令请求的逻辑与查询分离。这种分离允许每种操作类型独立优化和管理,提供更具扩展性和可维护性的代码。

在 .NET 项目中使用 IronPDF 有什么优势?

IronPDF 提供易于使用的 API,用于在 .NET 项目中创建、编辑和管理 PDF 文件。其将 HTML 转换为 PDF 时保留布局的能力使其成为生成报告和文档的强大工具。

Curtis Chau
技术作家

Curtis Chau 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。

除了开发之外,Curtis 对物联网 (IoT) 有浓厚的兴趣,探索将硬件和软件集成的新方法。在空闲时间,他喜欢玩游戏和构建 Discord 机器人,将他对技术的热爱与创造力相结合。