.NET 8 中如何利用 MediatR 實(shí)現(xiàn)高效消息傳遞
前言
MediatR 是 .NET 下的一個(gè)實(shí)現(xiàn)消息傳遞的庫(kù),輕量級(jí)、簡(jiǎn)潔高效,用于實(shí)現(xiàn)進(jìn)程內(nèi)的消息傳遞機(jī)制。它基于中介者設(shè)計(jì)模式,支持請(qǐng)求/響應(yīng)、命令、查詢、通知和事件等多種消息傳遞模式。通過(guò)泛型支持,MediatR 可以智能地調(diào)度不同類型的消息,非常適合用于領(lǐng)域事件處理。
在本文中,將通過(guò)一個(gè)簡(jiǎn)單的示例來(lái)介紹如何使用 MediatR 庫(kù)在 .NET 8 項(xiàng)目中處理命令。我們將定義一個(gè)命令、一個(gè)處理器以及一個(gè)用于發(fā)送命令的服務(wù),演示如何發(fā)送一個(gè)命令并處理它。
準(zhǔn)備工作
1、創(chuàng)建項(xiàng)目
創(chuàng)建一個(gè)新的 .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、注冊(cè) MediatR
在 Program.cs
文件中,我們需要注冊(cè) MediatR 服務(wù)。
// Add services to the container. builder.Services.AddMediatR(mr =>{ mr.RegisterServicesFromAssembly(typeof(Program).Assembly); });
2、創(chuàng)建通知類
在項(xiàng)目中定義了一個(gè)簡(jiǎn)單的通知類 InfoDemo
,它是 INotification
接口的實(shí)現(xiàn)。
using MediatR; namespace ManageCore.MediatrDemo { public record InfoDemo(string Msg) : INotification; }
首先聲明了一個(gè)名為 InfoDemo
的記錄類型(record type)。
記錄類型是一種特殊的類,主要用于表示不可變的數(shù)據(jù)類型,并提供了默認(rèn)的實(shí)現(xiàn)來(lái)簡(jiǎn)化對(duì)象的創(chuàng)建和比較。
public record InfoDemo(string Msg)
:這里定義了一個(gè)名為InfoDemo
的記錄類型,它接受一個(gè)字符串類型的構(gòu)造函數(shù)參數(shù)Msg
。這個(gè)參數(shù)將會(huì)成為InfoDemo
類的一個(gè)只讀屬性。: INotification
:這里指定了InfoDemo
類實(shí)現(xiàn)了INotification
接口。在MediatR
中,INotification
接口用于標(biāo)記一個(gè)類型作為通知(Notification)處理,這意味著這個(gè)類型將用于發(fā)送通知而不需要等待響應(yīng)。
注意:這段代碼定義了一個(gè)名為 InfoDemo
的通知類,它包含一個(gè)只讀屬性 Msg
,用于攜帶消息文本。這個(gè)類可以被用來(lái)發(fā)送通知,而不期待任何響應(yīng)或結(jié)果。在實(shí)際應(yīng)用中,你可能會(huì)使用 MediatR
的IMediator
接口來(lái)發(fā)送這種通知,并由其他組件來(lái)處理這些通知。
3、創(chuàng)建處理器類
創(chuàng)建一個(gè)通知處理器類 InfoDemoHandler
,用于處理通知并返回響應(yīng)。
它是 INotificationHandler<InfoDemo>
接口的實(shí)現(xiàn)。
它接受一個(gè) 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
類型的通知時(shí),它會(huì)調(diào)用 InfoDemoHandler
的 Handle
方法來(lái)處理該通知。
4、創(chuàng)建控制器類
定義一個(gè)名為 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"; } } }
說(shuō)明:這段代碼定義了一個(gè)名為MediatorDemoController
的控制器類,它使用 MediatR
發(fā)布了一個(gè)名為InfoDemo
的通知。當(dāng)調(diào)用MediatorDemoMethod
方法時(shí),它會(huì)創(chuàng)建一個(gè)InfoDemo
類型的通知實(shí)例,通過(guò)mediator
發(fā)布該通知,并記錄一條日志。
運(yùn)行示例
1、啟動(dòng) ASP.NET Core 應(yīng)用程序
啟動(dòng)應(yīng)用程序后MediatorDemoController
控制器將被注冊(cè),并且構(gòu)造函數(shù)將被調(diào)用來(lái)注入IMediator
和ILogger<MediatorDemoController>
依賴項(xiàng)。
2、訪問(wèn)控制器方法
通過(guò)訪問(wèn) /MediatorDemo
的 GET 請(qǐng)求來(lái)調(diào)用MediatorDemoMethod
方法。
3、創(chuàng)建并發(fā)布通知
在MediatorDemoMethod
方法中,創(chuàng)建一個(gè)InfoDemo
類型的通知實(shí)例,并通過(guò)mediator.Publish(information)
發(fā)布該通知。
4、處理通知
當(dāng)通知被發(fā)布時(shí),所有實(shí)現(xiàn)了INotificationHandler<InfoDemo>
接口的處理器都會(huì)被調(diào)用來(lái)處理通知。
InfoDemoHandler
處理器會(huì)接收到通知,并通過(guò)日志記錄器記錄一條日志,顯示接收到的通知及其時(shí)間戳。
5、記錄日志
在控制器中,通過(guò)_logger.LogInformation
記錄一條日志,顯示發(fā)送的通知及其時(shí)間戳。
6、返回響應(yīng)
控制器方法返回"Ok"
字符串,表示執(zhí)行成功。
7、預(yù)期結(jié)果
總結(jié)
通過(guò)這個(gè)簡(jiǎn)單的示例,可以在 .NET 8 應(yīng)用程序中使用 MediatR
庫(kù)來(lái)發(fā)布和處理通知,實(shí)現(xiàn)進(jìn)程內(nèi)的消息傳遞。這種方法有助于解耦組件,并使得應(yīng)用程序更加模塊化和可維護(hù)。示例不僅說(shuō)明了如何使用MediatR
來(lái)處理通知,還說(shuō)明了如何實(shí)現(xiàn)通知處理模式。通過(guò)定義通知和處理器,我們可以將應(yīng)用程序的不同部分解耦,使得代碼更加清晰和易于維護(hù)。
到此這篇關(guān)于.NET 8 中利用 MediatR 實(shí)現(xiàn)高效消息傳遞的文章就介紹到這了,更多相關(guān).NET 8 MediatR消息傳遞內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
.NET的DateTime函數(shù)獲取上個(gè)月的起始和截止時(shí)間的方法
這篇文章主要介紹了NET的DateTime函數(shù)獲取上個(gè)月的起始和截止時(shí)間的方法,可廣泛使用于報(bào)表中的時(shí)間自動(dòng)選擇功能,是非常實(shí)用的技巧,需要的朋友可以參考下2015-01-01asp.net上傳Excel文件并讀取數(shù)據(jù)的實(shí)現(xiàn)方法
這篇文章主要給大家介紹了關(guān)于asp.net上傳Excel文件并讀取數(shù)據(jù)的實(shí)現(xiàn)方法,文中通過(guò)示例代碼以及圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03asp.net Oracle數(shù)據(jù)庫(kù)訪問(wèn)操作類
asp.net Oracle數(shù)據(jù)庫(kù)訪問(wèn)操作類,需要的朋友可以參考一下2013-03-03解決asp.net Sharepoint無(wú)法連接發(fā)布自定義字符串處理程序,不能進(jìn)行輸出緩存處理的方法
解決Sharepoint無(wú)法連接發(fā)布自定義字符串處理程序,不能進(jìn)行輸出緩存處理的方法2010-03-03ASP.net(C#)從其他網(wǎng)站抓取內(nèi)容并截取有用信息的實(shí)現(xiàn)代碼
ASP.net(C#)從其他網(wǎng)站抓取內(nèi)容并截取有用信息的實(shí)現(xiàn)代碼,需要的朋友可以參考下。2011-09-09VS2015 搭建Asp.net core開(kāi)發(fā)環(huán)境的方法
最近想在vs2015體驗(yàn)下.net core,折騰了兩天終于把環(huán)境弄好了。下面這篇文章就給大家分享下我的搭建過(guò)程,有需要的朋友們可以參考學(xué)習(xí),下面來(lái)一起看看吧。2016-12-12GridView_RowUpdating取不到新值的解決方法
GridView_RowUpdating取不到新值的解決方法,需要的朋友可以參考一下2013-05-05ASP.NET 站點(diǎn)地圖(sitemap)簡(jiǎn)明教程
畢業(yè)設(shè)計(jì)折騰了近一個(gè)月的時(shí)間,也將近完工階段。下個(gè)禮拜六是論文答辯時(shí)間,所以今天晚上就抽空想去弄一下站點(diǎn)地圖。不怕大俠們笑話,我在以前還真沒(méi)弄過(guò)這些。以前開(kāi)發(fā)過(guò)幾個(gè)項(xiàng)目都是系統(tǒng)類,也就沒(méi)怎么涉及了2012-04-04asp.net下用Aspose.Words for .NET動(dòng)態(tài)生成word文檔中的數(shù)據(jù)表格的方法
導(dǎo)出word 文檔,要求這個(gè)文檔的格式不是固定的,用戶可以隨便的調(diào)整,導(dǎo)出內(nèi)容中的數(shù)據(jù)表格列是動(dòng)態(tài)的,例如要求導(dǎo)出姓名和性別,你就要導(dǎo)出這兩列的數(shù)據(jù),而且這個(gè)文檔不是導(dǎo)出來(lái)之后再調(diào)整而是導(dǎo)出來(lái)后已經(jīng)是調(diào)整過(guò)了的。2010-04-04