MediatR 在 .NET Core 中的詳細(xì)用法和深入講解
MediatR 是 .NET 中的一種實(shí)現(xiàn) 中介者模式(Mediator Pattern) 的庫(kù)。它允許您將應(yīng)用程序中的請(qǐng)求和響應(yīng)解耦,使各個(gè)組件通過(guò)一個(gè)中介者進(jìn)行通信,避免了直接依賴,從而使得代碼更加松耦合,易于擴(kuò)展和維護(hù)。
MediatR 被廣泛應(yīng)用于 ASP.NET Core 應(yīng)用程序中,尤其是在處理復(fù)雜業(yè)務(wù)邏輯和請(qǐng)求響應(yīng)時(shí)。本篇文章將深入講解 MediatR 的安裝、配置、使用場(chǎng)景、代碼示例以及一些高級(jí)功能。
1. MediatR 的安裝與配置
在使用 MediatR 前,首先需要安裝其 NuGet 包。MediatR 的核心庫(kù)以及用于與 ASP.NET Core 集成的擴(kuò)展庫(kù)可以通過(guò) NuGet 安裝。
1.1 安裝 NuGet 包
通過(guò) NuGet 包管理器安裝 MediatR:
Install-Package MediatR
Install-Package MediatR.Extensions.Microsoft.DependencyInjection
或者通過(guò) .NET CLI 安裝:
dotnet add package MediatR
dotnet add package MediatR.Extensions.Microsoft.DependencyInjection
1.2 配置 MediatR
在 ASP.NET Core 應(yīng)用程序中配置 MediatR。通常你會(huì)在 Program.cs 文件中配置 MediatR 服務(wù)。
using MediatR;
using Microsoft.Extensions.DependencyInjection;
using System.Reflection;
var builder = WebApplication.CreateBuilder(args);
// 注冊(cè) MediatR 服務(wù)
builder.Services.AddMediatR(Assembly.GetExecutingAssembly());
var app = builder.Build();
app.MapGet("/", () => "Hello World!");
app.Run();
AddMediatR() 會(huì)掃描指定的程序集,在本例中是 Assembly.GetExecutingAssembly(),自動(dòng)注冊(cè)應(yīng)用中定義的請(qǐng)求和處理程序。
2. 請(qǐng)求與處理程序的基本用法
MediatR 使用 請(qǐng)求/響應(yīng)模式,即客戶端通過(guò)請(qǐng)求發(fā)送數(shù)據(jù),并由處理程序處理后返回響應(yīng)。請(qǐng)求通常是實(shí)現(xiàn) IRequest<TResponse> 接口的類,TResponse 是請(qǐng)求的響應(yīng)類型。處理程序需要實(shí)現(xiàn) IRequestHandler<TRequest, TResponse> 接口來(lái)處理請(qǐng)求。
2.1 創(chuàng)建請(qǐng)求類
請(qǐng)求類實(shí)現(xiàn) IRequest<TResponse> 接口,表示希望返回某種類型的響應(yīng)。
public class MyRequest : IRequest<string>
{
public string Name { get; set; }
}
MyRequest 是一個(gè)請(qǐng)求類,它有一個(gè) Name 屬性,并且返回一個(gè) string 類型的響應(yīng)。
2.2 創(chuàng)建處理程序
處理程序是實(shí)現(xiàn)了 IRequestHandler<TRequest, TResponse> 接口的類。處理程序中會(huì)定義如何處理請(qǐng)求,并生成響應(yīng)。
using MediatR;
using System.Threading;
using System.Threading.Tasks;
public class MyRequestHandler : IRequestHandler<MyRequest, string>
{
public Task<string> Handle(MyRequest request, CancellationToken cancellationToken)
{
// 在這里處理請(qǐng)求的業(yè)務(wù)邏輯
return Task.FromResult($"Hello, {request.Name}!");
}
}
MyRequestHandler 處理 MyRequest 請(qǐng)求,并返回一個(gè)字符串響應(yīng),格式為 "Hello, [Name]!"。
2.3 發(fā)送請(qǐng)求
請(qǐng)求通過(guò) IMediator 接口發(fā)送,IMediator 是 MediatR 中的核心組件。你可以將它注入到控制器或者服務(wù)中,然后通過(guò)調(diào)用 Send 方法發(fā)送請(qǐng)求。
using MediatR;
using Microsoft.AspNetCore.Mvc;
using System.Threading.Tasks;
[ApiController]
[Route("api/[controller]")]
public class MyController : ControllerBase
{
private readonly IMediator _mediator;
public MyController(IMediator mediator)
{
_mediator = mediator;
}
[HttpGet]
public async Task<IActionResult> Get([FromQuery] string name)
{
var request = new MyRequest { Name = name };
var response = await _mediator.Send(request); // 發(fā)送請(qǐng)求并獲取響應(yīng)
return Ok(response); // 返回響應(yīng)
}
}
在 MyController 控制器中,我們通過(guò)構(gòu)造函數(shù)注入了 IMediator,并在 Get 方法中發(fā)送了 MyRequest 請(qǐng)求。響應(yīng)會(huì)被返回給客戶端。
3. 使用通知(Notification)與通知處理程序
除了請(qǐng)求/響應(yīng)模式,MediatR 還支持 通知模式,通知類似于事件,它允許多個(gè)處理程序同時(shí)處理同一條通知。
3.1 創(chuàng)建通知類
通知類實(shí)現(xiàn) INotification 接口,通常不返回響應(yīng)數(shù)據(jù)。通知用于傳播事件或某種狀態(tài)變化。
public class MyNotification : INotification
{
public string Message { get; set; }
}
MyNotification 是一個(gè)簡(jiǎn)單的通知類,包含一個(gè) Message 屬性。
3.2 創(chuàng)建通知處理程序
通知處理程序是實(shí)現(xiàn)了 INotificationHandler<TNotification> 接口的類。一個(gè)通知可以由多個(gè)處理程序處理。
public class MyNotificationHandler : INotificationHandler<MyNotification>
{
public Task Handle(MyNotification notification, CancellationToken cancellationToken)
{
// 處理通知的邏輯
Console.WriteLine($"Notification received: {notification.Message}");
return Task.CompletedTask;
}
}
在 MyNotificationHandler 中,我們處理了 MyNotification 通知,簡(jiǎn)單地將通知內(nèi)容輸出到控制臺(tái)。
3.3 發(fā)布通知
與請(qǐng)求發(fā)送類似,發(fā)布通知也通過(guò) IMediator 完成。通知通過(guò) Publish 方法發(fā)布。
[HttpPost]
public async Task<IActionResult> Post([FromBody] string message)
{
var notification = new MyNotification { Message = message };
await _mediator.Publish(notification); // 發(fā)布通知
return Ok();
}
當(dāng)收到 POST 請(qǐng)求時(shí),我們創(chuàng)建并發(fā)布 MyNotification 通知,所有注冊(cè)的處理程序都會(huì)處理該通知。
4. 管道行為(Pipeline Behavior)
MediatR 支持 管道行為(Pipeline Behavior),它允許你在請(qǐng)求和響應(yīng)的生命周期中插入自定義邏輯。例如,你可以在請(qǐng)求之前或之后添加日志記錄、驗(yàn)證、緩存等操作。
4.1 創(chuàng)建管道行為
管道行為實(shí)現(xiàn) IPipelineBehavior<TRequest, TResponse> 接口,允許你控制請(qǐng)求的處理過(guò)程。
using MediatR;
using System;
using System.Threading;
using System.Threading.Tasks;
public class LoggingBehavior<TRequest, TResponse> : IPipelineBehavior<TRequest, TResponse>
{
public async Task<TResponse> Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate<TResponse> next)
{
// 在請(qǐng)求之前執(zhí)行的邏輯
Console.WriteLine($"Handling {typeof(TRequest).Name}");
// 調(diào)用下一個(gè)請(qǐng)求處理程序
var response = await next();
// 在響應(yīng)之后執(zhí)行的邏輯
Console.WriteLine($"Handled {typeof(TResponse).Name}");
return response;
}
}
在 LoggingBehavior 中,我們?cè)谡?qǐng)求處理之前和之后分別記錄了日志。
4.2 注冊(cè)管道行為
在 Program.cs 文件中,使用依賴注入注冊(cè)管道行為。
builder.Services.AddTransient(typeof(IPipelineBehavior<,>), typeof(LoggingBehavior<,>));
這使得每個(gè)請(qǐng)求都會(huì)經(jīng)過(guò)管道行為處理。
5. 異常處理
MediatR 本身沒(méi)有內(nèi)置的異常處理機(jī)制,但你可以通過(guò)管道行為來(lái)處理異常。以下是一個(gè)簡(jiǎn)單的異常處理示例:
public class ExceptionHandlingBehavior<TRequest, TResponse> : IPipelineBehavior<TRequest, TResponse>
{
public async Task<TResponse> Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate<TResponse> next)
{
try
{
return await next();
}
catch (Exception ex)
{
// 記錄異常或進(jìn)行其他處理
Console.WriteLine($"An error occurred: {ex.Message}");
throw;
}
}
}
然后,在 Program.cs 中注冊(cè)此異常處理行為:
builder.Services.AddTransient(typeof(IPipelineBehavior<,>), typeof(ExceptionHandlingBehavior<,>));
6. 總結(jié)
MediatR 是一個(gè)強(qiáng)大的庫(kù),幫助你實(shí)現(xiàn)松耦合、易擴(kuò)展的請(qǐng)求/響應(yīng)模式和通知模式。它在大多數(shù)應(yīng)用場(chǎng)景中都非常有用,尤其是當(dāng)你的應(yīng)用程序邏輯比較復(fù)雜時(shí)。通過(guò) MediatR,你可以更好地組織你的代碼,使得不同的組件之間解耦,提高可維護(hù)性。
主要功能包括:
- 請(qǐng)求/響應(yīng)模式:通過(guò)請(qǐng)求類和處理程序來(lái)實(shí)現(xiàn)操作邏輯。
- 通知模式:發(fā)布通知,多個(gè)處理程序同時(shí)處理同一條通知。
- 管道行為:在請(qǐng)求生命周期中插入自定義邏輯,如日志記錄、異常處理等。
- 輕松集成:通過(guò)簡(jiǎn)單的依賴注入和配置,MediatR 可以輕松集成到 ASP.NET Core 應(yīng)用中。
MediatR 通過(guò)實(shí)現(xiàn)中介者模式,不僅提高了代碼的解耦性,還使得復(fù)雜的操作變得更加清晰和可擴(kuò)展。

浙公網(wǎng)安備 33010602011771號(hào)