Mediatr C#(對於開發者的運行原理)
MediatR 是一個流行的 .NET 程式庫,實現了調停者模式,讓物件通過調停者進行溝通,而不是直接溝通。 此方法在希望保持元件之間低耦合程度的應用程式中特別有用。 在本文中,我們將詳細探討在 C# 開發環境中的 MediatR,並提供實用的例子和如何將其整合到您的網站應用專案中的指導。 我們還將探討IronPDF library for PDF functionalities in .NET applications,以便在 ASP.NET Core 專案中整合 PDF 功能。
調停者模式與 MediatR 的介紹

調停者模式是一種軟體設計模式,透過減少直接依賴來促進物件之間的互動,促進鬆散耦合。 MediatR 提供了一個不複雜的調停者實現,專注於簡單和效率地促進物件溝通。
MediatR 程式庫的核心概念是請求和多個處理器。 在請求點,一個物件封裝操作或行動的詳細資訊,等待 MediatR 機制的處理。 每個請求都有一個對應的處理器或處理方法,其中包含執行請求的業務邏輯。這種結構對於實現指令查詢責任分離(CQRS)模式特別有用,在這種模式下,讀寫操作的分離可以導致更易於維護和擴展的軟體架構。
使用套件管理器控制台在 .NET Core 專案中安裝 MediatR
要在 ASP.NET Core 專案中開始使用 MediatR,首先需要安裝 MediatR 套件。 這可以在 Visual Studio 的套件管理器控制台中通過以下命令來完成:
Install-Package MediatR

安裝套件後,需將 MediatR 新增到 ASP.NET Core 的依賴注入容器中。 這通常在您的網站應用專案的 Program.cs 或 Startup.cs 文件中完成,具體取決於您使用的 ASP.NET Core 版本。 以下是在具有 Minimal 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()
在 Program 類中,var builder = WebApplication.CreateBuilder(args); 初始化了網站應用,為 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
在本例中,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
在應用程式中使用 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
在此控制器中,Create 動作方法透過調用 _mediator.Send(command) 將 CreateUserCommand 發送給 MediatR。 然後 MediatR 尋找此命令的適當處理器並執行它。 結果會被返回並在同一過程中用來生成回應。
超越基本請求:通知和行為
MediatR 也支持通知和行為。 通知是讓多個處理處可以訂閱和處理的訊息,允許您的應用程式內進行更多事件驅動的方法。 另一方面,行為類似於 MediatR 請求的中介軟體,允許您實現跨切面問題,如日誌、驗證或交易管理。
IronPDF程式庫的介紹

IronPDF 是為 .NET 開發人員設計的 C# 程式庫,提供了一種直接在應用程式中建立、編輯和處理 PDF 文件的簡單方式,而不需要擔心寫入問題。 開發人員可以通過直接將網頁或HTML 程式碼轉換為 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
程式碼範例
在這個例子中,假設 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>
{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>
{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(htmlContent As String)
' Insert your License Key here if required
License.LicenseKey = "License-Key"
' Initialize the HtmlToPdf renderer
Dim renderer As 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>
{htmlContent}
</body>
</html>"
' Convert the HTML string to a PDF document
Dim pdfDocument = renderer.RenderHtmlAsPdf(htmlTemplate)
pdfDocument.SaveAs("MediaInformation.pdf")
End Sub
End Class
Module Program
Sub Main(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 Module
在這段程式碼片段中,htmlContent 是一個變數,應包含您的媒體資訊以及 HTML 格式。 這可能包括文字、圖像、影片連結或其他任何 HTML 相容的內容。 IronPDF 將把這個 HTML 內容轉換為 PDF 文件,保留 HTML 指定的佈局和格式。

結論

根據本文中概述的步驟,您現在應該已經掌握了如何將 MediatR 整合到您的專案中,從基本的指令和查詢處理到利用更高級的功能,如通知和行為。 隨著您的應用程式的成長和演變,MediatR 提供了可以幫助保持程式碼庫清晰、易維護和可擴展的工具和模式。
在結束時,值得注意的是,探索和整合不同的程式庫和工具,如 IronPDF,能夠進一步增強您的 .NET 專案。 IronPDF 提供進階 PDF 功能的免費試用。 對於需要進階 PDF 功能的專案,IronPDF 的授權從 $999 開始,為尋求擴展應用程式功能的 .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 的能力使其成為生成報告和文件的強大工具。




