如何在 ASP.Net Core 中使用 MediatR

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

配置 MediatR
一旦上面的兩個 Nuget 包安裝到項目之后,接下來就可以在 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 模式
這篇文章我們將會討論 Notification,接下來創(chuàng)建一個實現(xiàn) INotification 接口的類,如下代碼所示:
public class LogEvent : INotification
{
public string message;
public LogEvent(string message)
{
this.message = message;
}
}
為了能夠處理 LogEvent 事件,還需再創(chuàng)建一個實現(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)建了兩個處理 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í)行程序后將會調(diào)用上面的 publish 方法,繼而觸發(fā) DBNotificationHandler 和 FileNotificationHandler 的 Handle 方法,如下圖所示:

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