如何在 ASP.Net Core 中使用 MediatR

MediatR 是一个 中介者模式 的.NET开源实现, 中介者模式 管控了一组对象之间的相互通讯并有效的减少了对象之间错综复杂的相互依赖,在 中介者模式 中,一个对象不需要直接和另一个对象进行通讯,而是通过 中介者 进行转达,这篇文章将会讨论如何在 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,接下来创建一个实现 INotification 接口的类,如下代码所示:


    public class LogEvent : INotification
    {
        public string message;
        public LogEvent(string message)
        {
            this.message = message;
        }
    }

为了能够处理 LogEvent 事件,还需再创建一个实现 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

刚才我已经为了 LogEvent 创建了两个处理 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 发布消息,如下代码所示:


        [HttpGet]
        public IEnumerable<WeatherForecast> Get()
        {
            _mediator.Publish(new LogEvent("Hello World"));
        }

值得注意的是,执行程序后将会调用上面的 publish 方法,继而触发 DBNotificationHandler 和 FileNotificationHandler 的 Handle 方法,如下图所示:

中介者模式 是一种行为式的设计模式,它可以有效地管控多个对象之间的交互方式并有效的减少交互双方的依赖关系,刚好 MediatR 就是这样一款成品的 中介者模式 的实现,关于 MediatR 的 request/response 模式,我会在后面的文章中和大家细说。

译文链接:https://www.infoworld.com/article/3393974/how-to-use-mediatr-in-aspnet-core.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值