跳過到頁腳內容
.NET幫助

Mediatr C#(對於開發者的運行原理)

MediatR 是一個流行的 .NET 庫,實現了中介者模式,使對象可以通過中介者進行通信,而不是直接通信。 這種方法在需要保持組件之間低耦合的應用程序中特別有用。 在本文中,我們將仔細研究 C# 開發中的 MediatR,並提供如何將其整合到您的 Web 應用程序項目中的實用示例和指導。 我們還將探討用於 .NET 應用程序中 PDF 功能集成的 IronPDF 庫,以便在 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<int> 介面,表明此請求期望一個整數回應,這可能代表創建用戶的 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) 向 MediatR 發送 CreateUserCommand。 然後,MediatR 找到此命令的相應處理程序並執行它。 結果在同一過程中返回並用於生成響應。

超越基本請求:通知和行為

MediatR 還支持通知和行為。 通知是多個處理程序可以訂閱並處理的消息,允許在應用程序內部採用更事件驅動的方法。 另一方面,行為類似於 MediatR 請求的中間件,允許您實現橫切關注點,如日誌記錄、驗證或事務管理。

IronPDF 函式庫介紹

Mediatr C# (開發人員如何使用它): 圖 3 - IronPDF

IronPDF 是為 .NET 開發者設計的 C# 庫,需要一種簡單的方法來在應用程序中創建、編輯和處理 PDF 文件而不涉及大量編寫。 開發者可以通過簡單地將網頁或 HTML 代碼直接轉換為 PDF 格式,即可生成 PDF,而不需要進行封裝或接觸複雜 API 支援。 IronPDF 不僅限於創建 PDF; 它還提供編輯 PDF 的功能,如添加文本、圖像和頁面,甚至在 PDF 文件中填寫和編輯表單。 開發者可以全面地處理 PDF,包括合併、拆分以及使用密碼和權限保護 PDF 文件。

IronPDF 專門用於轉換HTML 到 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");
    }
}
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 熱衷於創建直觀且美觀的用戶界面,喜歡使用現代框架並打造結構良好、視覺吸引人的手冊。

除了開發之外,Curtis 對物聯網 (IoT) 有著濃厚的興趣,探索將硬體和軟體結合的創新方式。在閒暇時間,他喜愛遊戲並構建 Discord 機器人,結合科技與創意的樂趣。