.NET 8 中利用 MediatR 實現高效訊息傳遞

小码编匠發表於2024-08-14

前言

MediatR 是 .NET 下的一個實現訊息傳遞的庫,輕量級、簡潔高效,用於實現程序內的訊息傳遞機制。它基於中介者設計模式,支援請求/響應、命令、查詢、通知和事件等多種訊息傳遞模式。透過泛型支援,MediatR 可以智慧地排程不同型別的訊息,非常適合用於領域事件處理。

在本文中,將透過一個簡單的示例來介紹如何使用 MediatR 庫在 .NET 8 專案中處理命令。我們將定義一個命令、一個處理器以及一個用於傳送命令的服務,演示如何傳送一個命令並處理它。

準備工作

1、建立專案

建立一個新的 .NET 8 WebAPI 標準專案,選擇啟用 OpenAPI 支援和使用控制器;

dotnet new webapi -n ManageCore.MediatrDemo 
cd ManageCore.MediatrDemo

2、新增 MediatR 包

使用以下命令新增 MediatR 包到專案中。

dotnet add package MediatR

實現示例

1、註冊 MediatR

Program.cs 檔案中,我們需要註冊 MediatR 服務。

// Add services to the container.  
builder.Services.AddMediatR(mr =>{
   mr.RegisterServicesFromAssembly(typeof(Program).Assembly);
});

2、建立通知類

在專案中定義了一個簡單的通知類 InfoDemo,它是 INotification 介面的實現。

using MediatR;

namespace ManageCore.MediatrDemo
{
    public record InfoDemo(string Msg) : INotification;
}

首先宣告瞭一個名為 InfoDemo 的記錄型別(record type)。

記錄型別是一種特殊的類,主要用於表示不可變的資料型別,並提供了預設的實現來簡化物件的建立和比較。

  • public record InfoDemo(string Msg):這裡定義了一個名為 InfoDemo 的記錄型別,它接受一個字串型別的建構函式引數 Msg。這個引數將會成為 InfoDemo 類的一個只讀屬性。
  • : INotification:這裡指定了 InfoDemo 類實現了 INotification 介面。在 MediatR 中,INotification 介面用於標記一個型別作為通知(Notification)處理,這意味著這個型別將用於傳送通知而不需要等待響應。

注意:這段程式碼定義了一個名為 InfoDemo 的通知類,它包含一個只讀屬性 Msg,用於攜帶訊息文字。這個類可以被用來傳送通知,而不期待任何響應或結果。在實際應用中,你可能會使用 MediatRIMediator 介面來傳送這種通知,並由其他元件來處理這些通知。

3、建立處理器類

建立一個通知處理器類 InfoDemoHandler ,用於處理通知並返回響應。

它是 INotificationHandler<InfoDemo> 介面的實現。

它接受一個 ILogger<InfoDemoHandler> 型別的建構函式引數 _logger,並實現了 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;
        }
    }
}

這段程式碼實現了 INotificationHandler<InfoDemo> 介面,並在 Handle 方法中處理 InfoDemo 型別的通知。

MediatR 接收到 InfoDemo 型別的通知時,它會呼叫 InfoDemoHandlerHandle 方法來處理該通知。

4、建立控制器類

定義一個名為 MediatorDemoController 的 ASP.NET Core 控制器,使用 MediatR 釋出通知。

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 釋出了一個名為InfoDemo的通知。當呼叫MediatorDemoMethod方法時,它會建立一個InfoDemo型別的通知例項,透過mediator釋出該通知,並記錄一條日誌。

執行示例

1、啟動 ASP.NET Core 應用程式

啟動應用程式後MediatorDemoController控制器將被註冊,並且建構函式將被呼叫來注入IMediatorILogger<MediatorDemoController>依賴項。

2、訪問控制器方法

透過訪問 /MediatorDemo的 GET 請求來呼叫MediatorDemoMethod方法。

3、建立併發布通知

MediatorDemoMethod 方法中,建立一個InfoDemo 型別的通知例項,並透過mediator.Publish(information) 釋出該通知。

4、處理通知

當通知被髮布時,所有實現了INotificationHandler<InfoDemo>介面的處理器都會被呼叫來處理通知。

InfoDemoHandler 處理器會接收到通知,並透過日誌記錄器記錄一條日誌,顯示接收到的通知及其時間戳。

5、記錄日誌

在控制器中,透過_logger.LogInformation記錄一條日誌,顯示傳送的通知及其時間戳。

6、返回響應

控制器方法返回"Ok"字串,表示執行成功。

7、預期結果

總結

透過這個簡單的示例,可以在 .NET 8 應用程式中使用 MediatR 庫來發布和處理通知,實現程序內的訊息傳遞。這種方法有助於解耦元件,並使得應用程式更加模組化和可維護。示例不僅說明了如何使用 MediatR 來處理通知,還說明了如何實現通知處理模式。透過定義通知和處理器,我們可以將應用程式的不同部分解耦,使得程式碼更加清晰和易於維護。

最後

如果你覺得這篇文章對你有幫助,不妨點個贊支援一下!你的支援是我繼續分享知識的動力。如果有任何疑問或需要進一步的幫助,歡迎隨時留言。也可以加入微信公眾號 [DotNet技術匠] 社群,與其他熱愛技術的同行一起交流心得,共同成長!

相關文章