https://www.cnblogs.com/tanmingchao/p/9681975.html
本文转自
[1.MediatR 是什么?
![](http://img.e-com-net.com/image/info10/1772fa97018643ff9b39364d8af2e040.gif)
](javascript:void(0); "复制代码")
微软官方eshopOnContainer开源项目中使用到了该工具,[mediatR 是一种中介工具,解耦了消息处理器和消息之间耦合的类库,支持跨平台 .net Standard和.net framework
https://github.com/jbogard/MediatR/wiki 这里是原文地址。其作者就是Automapper的作者。
功能要是简述的话就俩方面:request/response 请求响应
pub/sub 发布订阅
![](http://img.e-com-net.com/image/info10/55d4e2c923b84bfbb2cec2da1960dcbe.gif)
](javascript:void(0); "复制代码")
2.****使用
nuget: install-package MediatRMediatR没有其他的依赖项,您需要配置一个工厂委托,用来实例化所有处理程序、管道的行为,和前/后处理器。
[3.Autofac完整的IOC注入示例:
![](http://img.e-com-net.com/image/info10/a28f4fa1195f43cf97347ea72a1661ad.gif)
](javascript:void(0); "复制代码")
// uncomment to enable polymorphic dispatching of requests, but note that // this will conflict with generic pipeline behaviors // builder.RegisterSource(new ContravariantRegistrationSource()); // mediator itself[
builder
.RegisterType()
.As()
.InstancePerLifetimeScope(); // request handlers
builder
.Register(ctx => { var c = ctx.Resolve (); return t => c.TryResolve(t, out var o) ? o : null;
})
.InstancePerLifetimeScope(); // notification handlers
builder
.Register(ctx => { var c = ctx.Resolve (); return t => (IEnumerable
![](http://img.e-com-net.com/image/info10/eac80211e34d4b96895edcf605ac8f67.gif)
](javascript:void(0); "复制代码")
[4.ASP.NET CORE 使用 IOC注入:
![](http://img.e-com-net.com/image/info10/4beb45335414475ebca7f2ee13e8f315.gif)
](javascript:void(0); "复制代码")
引用 MediatR nuget:install-package MediatR[引用IOC扩展 nuget:installpackage MediatR.Extensions.Microsoft.DependencyInjection
使用方式:
services.AddMediatR(typeof(MyHandler));
或
services.AddMediatR(typeof(Startup).GetTypeInfo().Assembly);
目的是为了扫描Handler的实现对象并添加到IOC的容器中
![](http://img.e-com-net.com/image/info10/d6ed19f58e60499ca3f37ed31cc51f2a.gif)
](javascript:void(0); "复制代码")
5.参考示例
[5.1 请求响应(request/response),三步:
![](http://img.e-com-net.com/image/info10/b51f24bb63714894b5f714d8adff8899.gif)
](javascript:void(0); "复制代码")
步骤一:创建一个消息对象,需要实现IRequest,或IRequest<>接口,表明该对象是处理器的一个对象 public class Ping : IRequest[{ } 步骤二:创建一个处理器对象 public class PingHandler : IRequestHandler
{ public Task Handle(Ping request, CancellationToken cancellationToken) { return Task.FromResult("Pong"); } } 步骤三:最后,通过mediator发送一个消息 var response = await mediator.Send(new Ping()); Debug.WriteLine(response); // "Pong"
![](http://img.e-com-net.com/image/info10/4d413e6535eb468b922fb56316484252.gif)
](javascript:void(0); "复制代码")
说明:如果某些情况下,如果你的消息发送不需要返回响应结果的话,可以使用AsyncRequestHandler
参考实现:
public class OneWay : IRequest { } public class OneWayHandlerWithBaseClass : AsyncRequestHandler{ protected override Task Handle(OneWay request, CancellationToken cancellationToken) { // Twiddle thumbs } }
或者需要异步实现可以使用 RequestHandler
参考实现:
public class SyncHandler : RequestHandler{ protected override string Handle(Ping request) { return "Pong"; } }
[5.1.1 Request的类型说明,比较幼稚了,,
![](http://img.e-com-net.com/image/info10/2ab6daf2ac5a4af0aaa959324b0c97b6.gif)
](javascript:void(0); "复制代码")
IRequest[有返回值 IRequest 无返回值
IRequestHandler
该对象的实现对象返回一个 Task 对象 AsyncRequestHandler
该对象的子对象(继承)返回一个 Task 对象 RequestHandler
该对象的子对象(继承) 无返回值 IRequestHandler
该对象的实现对象返回一个 Task 对象 RequestHandler
该对象的子对象(继承)返回一个 U 对象
![](http://img.e-com-net.com/image/info10/8910200ccf3a414492a8933356fb8924.gif)
](javascript:void(0); "复制代码")
[5.2 Publishing,依旧三步走
![](http://img.e-com-net.com/image/info10/42ae4a8cee5548bb96c7887ceb6039e4.gif)
](javascript:void(0); "复制代码")
步骤一:创建一个用于通知的消息对象,实现INotification接口 public class Ping : INotification { }[步骤二:创建通知的处理器对象 public class Pong1 : INotificationHandler
{ public Task Handle(Ping notification, CancellationToken cancellationToken) { Debug.WriteLine("Pong 1"); return Task.CompletedTask; } }
public class Pong2 : INotificationHandler
{ public Task Handle(Ping notification, CancellationToken cancellationToken) { Debug.WriteLine("Pong 2"); return Task.CompletedTask; } } 三步骤:最终使用mediator发布你的消息 await mediator.Publish(new Ping());
![](http://img.e-com-net.com/image/info10/8101282e6f1c413899660695718ee4ca.gif)
](javascript:void(0); "复制代码")
5.3 其他:见github作者wiki参考示例
分类: .NET
标签: .NET, MediatR, 开发记录