欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

.NET 8 中如何利用 MediatR 實(shí)現(xiàn)高效消息傳遞

 更新時(shí)間:2024年08月14日 16:18:53   作者:小碼編匠  
這篇文章主要介紹了.NET 8 中利用 MediatR 實(shí)現(xiàn)高效消息傳遞,示例不僅說(shuō)明了如何使用MediatR?來(lái)處理通知,還說(shuō)明了如何實(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)注入IMediatorILogger<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)文章

最新評(píng)論