前言
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
,用於攜帶訊息文字。這個類可以被用來發送通知,而不期待任何響應或結果。在實際應用中,你可能會使用 MediatR
的 IMediator
介面來發送這種通知,並由其他元件來處理這些通知。
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
型別的通知時,它會呼叫 InfoDemoHandler
的 Handle
方法來處理該通知。
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
控制器將被註冊,並且建構函式將被呼叫來注入 IMediator
和 ILogger<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
來處理通知,還說明了如何實現通知處理模式。透過定義通知和處理器,我們可以將應用程式的不同部分解耦,使得程式碼更加清晰和易於維護。