如何在 ASP.Net Core 中使用 MediatR

MediatR 是一個(gè) 中介者模式 的.NET開源實(shí)現(xiàn), 中介者模式 管控了一組對象之間的相互通訊并有效的減少了對象之間錯(cuò)綜復(fù)雜的相互依賴,在 中介者模式 中,一個(gè)對象不需要直接和另一個(gè)對象進(jìn)行通訊,而是通過 中介者 進(jìn)行轉(zhuǎn)達(dá),這篇文章將會(huì)討論如何在 ASP.Net Core 中使用 MediatR 。
安裝 MediatR
在 ASP.Net Core 中使用 MediatR 非常簡單,你只需要通過 Nuget 安裝如下兩個(gè)包即可。
MediatR
MediatR.Extensions.Microsoft.DependencyInjection
當(dāng)前最新的版本為 9.0.0,如下圖所示:

配置 MediatR
一旦上面的兩個(gè) Nuget 包安裝到項(xiàng)目之后,接下來就可以在 Startup 類中進(jìn)行 MediatR 的配置了,做法就是在 ConfigureServices() 方法中將 MediaR 注入到 IServiceCollection 容器中,如下代碼所示:
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddMediatR(typeof(Startup));
services.AddControllers();
}
使用 MediaR 處理 通知事件
MediatR 支持兩種消息模式。
Request / Response 模式
Notification 模式
這篇文章我們將會(huì)討論 Notification,接下來創(chuàng)建一個(gè)實(shí)現(xiàn) INotification 接口的類,如下代碼所示:
public class LogEvent : INotification
{
public string message;
public LogEvent(string message)
{
this.message = message;
}
}
為了能夠處理 LogEvent 事件,還需再創(chuàng)建一個(gè)實(shí)現(xiàn) INotificationHandler 接口的類,如下代碼所示:
public class FileNotificationHandler : INotificationHandler<LogEvent>
{
public Task Handle(LogEvent notification, CancellationToken cancellationToken)
{
string message = notification.message;
Log(message);
return Task.FromResult(0);
}
private void Log(string message)
{
//Write code here to log message(s) to a text file
Debug.WriteLine("Write code here to log message(s) to a text file");
}
}
public class DBNotificationHandler : INotificationHandler<LogEvent>
{
public Task Handle(LogEvent notification, CancellationToken cancellationToken)
{
string message = notification.message;
Log(message);
return Task.FromResult(0);
}
private void Log(string message)
{
//Write code here to log message(s) to the database
Debug.WriteLine("Write code here to log message(s) to the database");
}
}
依賴注入 IMediator
剛才我已經(jīng)為了 LogEvent 創(chuàng)建了兩個(gè)處理 handler 類,接下來就可以通過 依賴注入 的方式將其注入到 Controller 中,如下代碼所示:
[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
private readonly ILogger<WeatherForecastController> _logger;
private readonly IMediator _mediator;
public WeatherForecastController(IMediator mediator, ILogger<WeatherForecastController> logger)
{
this._mediator = mediator;
this._logger = logger;
}
}
最后我們可以在 Action 中通過 publish 發(fā)布消息,如下代碼所示:
[HttpGet]
public IEnumerable<WeatherForecast> Get()
{
_mediator.Publish(new LogEvent("Hello World"));
}
值得注意的是,執(zhí)行程序后將會(huì)調(diào)用上面的 publish 方法,繼而觸發(fā) DBNotificationHandler 和 FileNotificationHandler 的 Handle 方法,如下圖所示:

中介者模式 是一種行為式的設(shè)計(jì)模式,它可以有效地管控多個(gè)對象之間的交互方式并有效的減少交互雙方的依賴關(guān)系,剛好 MediatR 就是這樣一款成品的 中介者模式 的實(shí)現(xiàn),關(guān)于 MediatR 的 request/response 模式,我會(huì)在后面的文章中和大家細(xì)說。
譯文鏈接:https://www.infoworld.com/article/3393974/how-to-use-mediatr-in-aspnet-core.html
【推薦】.NET Core開發(fā)實(shí)戰(zhàn)視頻課程 ★★★
.NET Core實(shí)戰(zhàn)項(xiàng)目之CMS 第一章 入門篇-開篇及總體規(guī)劃
【.NET Core微服務(wù)實(shí)戰(zhàn)-統(tǒng)一身份認(rèn)證】開篇及目錄索引
Redis基本使用及百億數(shù)據(jù)量中的使用技巧分享(附視頻地址及觀看指南)
.NET Core中的一個(gè)接口多種實(shí)現(xiàn)的依賴注入與動(dòng)態(tài)選擇看這篇就夠了
10個(gè)小技巧助您寫出高性能的ASP.NET Core代碼
用abp vNext快速開發(fā)Quartz.NET定時(shí)任務(wù)管理界面
在ASP.NET Core中創(chuàng)建基于Quartz.NET托管服務(wù)輕松實(shí)現(xiàn)作業(yè)調(diào)度
現(xiàn)身說法:實(shí)際業(yè)務(wù)出發(fā)分析百億數(shù)據(jù)量下的多表查詢優(yōu)化
