.NET 8 中如何利用 MediatR 實(shí)現(xiàn)高效消息傳遞
前言
MediatR 是 .NET 下的一個實(shí)現(xiàn)消息傳遞的庫,輕量級、簡潔高效,用于實(shí)現(xiàn)進(jìn)程內(nèi)的消息傳遞機(jī)制。它基于中介者設(shè)計(jì)模式,支持請求/響應(yīng)、命令、查詢、通知和事件等多種消息傳遞模式。通過泛型支持,MediatR 可以智能地調(diào)度不同類型的消息,非常適合用于領(lǐng)域事件處理。
在本文中,將通過一個簡單的示例來介紹如何使用 MediatR 庫在 .NET 8 項(xiàng)目中處理命令。我們將定義一個命令、一個處理器以及一個用于發(fā)送命令的服務(wù),演示如何發(fā)送一個命令并處理它。
準(zhǔn)備工作
1、創(chuàng)建項(xiàng)目
創(chuàng)建一個新的 .NET 8 WebAPI 標(biāo)準(zhǔn)項(xiàng)目,選擇啟用 OpenAPI 支持和使用控制器;
dotnet new webapi -n ManageCore.MediatrDemo cd ManageCore.MediatrDemo
2、添加 MediatR 包
使用以下命令添加 MediatR 包到項(xiàng)目中。
dotnet add package MediatR

實(shí)現(xiàn)示例
1、注冊 MediatR
在 Program.cs 文件中,我們需要注冊 MediatR 服務(wù)。
// Add services to the container.
builder.Services.AddMediatR(mr =>{
mr.RegisterServicesFromAssembly(typeof(Program).Assembly);
});2、創(chuàng)建通知類
在項(xiàng)目中定義了一個簡單的通知類 InfoDemo,它是 INotification 接口的實(shí)現(xiàn)。
using MediatR;
namespace ManageCore.MediatrDemo
{
public record InfoDemo(string Msg) : INotification;
}首先聲明了一個名為 InfoDemo 的記錄類型(record type)。
記錄類型是一種特殊的類,主要用于表示不可變的數(shù)據(jù)類型,并提供了默認(rèn)的實(shí)現(xiàn)來簡化對象的創(chuàng)建和比較。
public record InfoDemo(string Msg):這里定義了一個名為InfoDemo的記錄類型,它接受一個字符串類型的構(gòu)造函數(shù)參數(shù)Msg。這個參數(shù)將會成為InfoDemo類的一個只讀屬性。: INotification:這里指定了InfoDemo類實(shí)現(xiàn)了INotification接口。在MediatR中,INotification接口用于標(biāo)記一個類型作為通知(Notification)處理,這意味著這個類型將用于發(fā)送通知而不需要等待響應(yīng)。
注意:這段代碼定義了一個名為 InfoDemo 的通知類,它包含一個只讀屬性 Msg,用于攜帶消息文本。這個類可以被用來發(fā)送通知,而不期待任何響應(yīng)或結(jié)果。在實(shí)際應(yīng)用中,你可能會使用 MediatR 的IMediator 接口來發(fā)送這種通知,并由其他組件來處理這些通知。
3、創(chuàng)建處理器類
創(chuàng)建一個通知處理器類 InfoDemoHandler ,用于處理通知并返回響應(yīng)。
它是 INotificationHandler<InfoDemo> 接口的實(shí)現(xiàn)。
它接受一個 ILogger<InfoDemoHandler> 類型的構(gòu)造函數(shù)參數(shù) _logger,并實(shí)現(xiàn)了 INotificationHandler<InfoDemo> 接口。INotificationHandler<T> 接口是 MediatR 提供的接口,用于處理 T 類型的通知。
using MediatR;
namespace ManageCore.MediatrDemo
{
/// <summary>
/// 通知處理器類
/// </summary>
/// <param name="_logger"></param>
public class InfoDemoHandler(ILogger<InfoDemoHandler> _logger) : INotificationHandler<InfoDemo>
{
/// <summary>
///
/// </summary>
/// <param name="notification"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public Task Handle(InfoDemo notification, CancellationToken cancellationToken)
{
_logger.LogInformation($"InfoDemoHandler Received: {notification}. {DateTimeOffset.Now}");
return Task.CompletedTask;
}
}
}這段代碼實(shí)現(xiàn)了 INotificationHandler<InfoDemo> 接口,并在 Handle 方法中處理 InfoDemo 類型的通知。
當(dāng) MediatR 接收到 InfoDemo 類型的通知時,它會調(diào)用 InfoDemoHandler 的 Handle 方法來處理該通知。
4、創(chuàng)建控制器類
定義一個名為 MediatorDemoController 的 ASP.NET Core 控制器,使用 MediatR 發(fā)布通知。
using MediatR;
using Microsoft.AspNetCore.Mvc;
namespace ManageCore.MediatrDemo.Controllers
{
[ApiController]
[Route("[controller]")]
public class MediatorDemoController : ControllerBase
{
private readonly IMediator mediator;
private readonly ILogger<MediatorDemoController> _logger;
/// <summary>
///初始化
/// </summary>
/// <param name="mediator"></param>
/// <param name="logger"></param>
public MediatorDemoController(IMediator mediator, ILogger<MediatorDemoController> logger)
{
this.mediator = mediator;
_logger = logger;
}
/// <summary>
/// MediatorDemo 方法
/// </summary>
/// <returns></returns>
[HttpGet(Name = "MediatorDemoMethod")]
public string MediatorDemoMethod()
{
var information = new InfoDemo("Mediator 控制器消息 ");
mediator.Publish(information);
_logger.LogInformation($"{DateTimeOffset.Now} : MediatorDemoController Send: {information}.");
return $"Ok";
}
}
}說明:這段代碼定義了一個名為MediatorDemoController 的控制器類,它使用 MediatR 發(fā)布了一個名為InfoDemo的通知。當(dāng)調(diào)用MediatorDemoMethod方法時,它會創(chuàng)建一個InfoDemo類型的通知實(shí)例,通過mediator發(fā)布該通知,并記錄一條日志。
運(yùn)行示例
1、啟動 ASP.NET Core 應(yīng)用程序
啟動應(yīng)用程序后MediatorDemoController控制器將被注冊,并且構(gòu)造函數(shù)將被調(diào)用來注入IMediator和ILogger<MediatorDemoController>依賴項(xiàng)。
2、訪問控制器方法
通過訪問 /MediatorDemo的 GET 請求來調(diào)用MediatorDemoMethod方法。
3、創(chuàng)建并發(fā)布通知
在MediatorDemoMethod 方法中,創(chuàng)建一個InfoDemo 類型的通知實(shí)例,并通過mediator.Publish(information) 發(fā)布該通知。
4、處理通知
當(dāng)通知被發(fā)布時,所有實(shí)現(xiàn)了INotificationHandler<InfoDemo>接口的處理器都會被調(diào)用來處理通知。
InfoDemoHandler 處理器會接收到通知,并通過日志記錄器記錄一條日志,顯示接收到的通知及其時間戳。
5、記錄日志
在控制器中,通過_logger.LogInformation記錄一條日志,顯示發(fā)送的通知及其時間戳。
6、返回響應(yīng)
控制器方法返回"Ok"字符串,表示執(zhí)行成功。
7、預(yù)期結(jié)果

總結(jié)
通過這個簡單的示例,可以在 .NET 8 應(yīng)用程序中使用 MediatR 庫來發(fā)布和處理通知,實(shí)現(xiàn)進(jìn)程內(nèi)的消息傳遞。這種方法有助于解耦組件,并使得應(yīng)用程序更加模塊化和可維護(hù)。示例不僅說明了如何使用MediatR 來處理通知,還說明了如何實(shí)現(xiàn)通知處理模式。通過定義通知和處理器,我們可以將應(yīng)用程序的不同部分解耦,使得代碼更加清晰和易于維護(hù)。
到此這篇關(guān)于.NET 8 中利用 MediatR 實(shí)現(xiàn)高效消息傳遞的文章就介紹到這了,更多相關(guān).NET 8 MediatR消息傳遞內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
理解ASP.NET Core 中間件(Middleware)
這篇文章主要介紹了ASP.NET Core 中間件(Middleware),中間件是一種裝配到應(yīng)用管道以處理請求和響應(yīng)的軟件。文中講解相關(guān)知識非常詳細(xì),感興趣的朋友可以一起來看一看2021-09-09
ASP.NET中URL Rewrite的具體實(shí)現(xiàn)方法
這篇文章介紹了ASP.NET中URL Rewrite的具體實(shí)現(xiàn)方法,有需要的朋友可以參考一下2013-11-11
ASP.NET Core環(huán)境設(shè)置教程(2)
這篇文章主要為大家詳細(xì)介紹了Asp.net Core環(huán)境設(shè)置教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-06-06
asp.net gridview實(shí)現(xiàn)全選,反選與刪除記錄的操作代碼
asp.net gridview實(shí)現(xiàn)全選,反選與刪除記錄的操作代碼,需要的朋友可以參考下。2011-07-07
asp.net中使用自定義控件的方式實(shí)現(xiàn)一個分頁控件的代碼
在web開發(fā)中,常常需要顯示一些數(shù)據(jù),而為了方便排版及瀏覽,我們只需要顯示所有記錄中的一部分。一般情況下,我們采用分頁來實(shí)現(xiàn)這個需求2012-10-10
ASP.NET通用權(quán)限驗(yàn)證的實(shí)現(xiàn)代碼思路
這篇文章主要介紹了ASP.NET通用權(quán)限驗(yàn)證的實(shí)現(xiàn)代碼思路,需要的朋友可以參考下2015-12-12

