如何在 ASP.Net Core 中使用 MediatR
本文轉(zhuǎn)載自微信公眾號「碼農(nóng)讀書」,作者碼農(nóng)讀書。轉(zhuǎn)載本文請聯(lián)系碼農(nóng)讀書公眾號。
MediatR 是一個 中介者模式 的.NET開源實現(xiàn), 中介者模式 管控了一組對象之間的相互通訊并有效的減少了對象之間錯綜復(fù)雜的相互依賴,在 中介者模式 中,一個對象不需要直接和另一個對象進行通訊,而是通過 中介者 進行轉(zhuǎn)達,這篇文章將會討論如何在 ASP.Net Core 中使用 MediatR 。
安裝 MediatR
在 ASP.Net Core 中使用 MediatR 非常簡單,你只需要通過 Nuget 安裝如下兩個包即可。
- MediatR
- MediatR.Extensions.Microsoft.DependencyInjection
當前最新的版本為 9.0.0,如下圖所示:
配置 MediatR
一旦上面的兩個 Nuget 包安裝到項目之后,接下來就可以在 Startup 類中進行 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 模式,我會在后面的文章中和大家細說。
譯文鏈接:https://www.infoworld.com/article/3393974/how-to-use-mediatr-in-aspnet-core.html