• 中介者模式的实现-MediatR


    简介

    微软官方的开源项目eShopOnContainers中,用到了一个实现中介者模式的类库:MediatR。
    他是一个低调的类库,致力于解决一个简单的问题:解耦进程内消息的发送与处理。
    中介者模式的定义为:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互应用,从而使其耦合松散,而且可以独立地改变他们之间的交互。
    开源地址:https://github.com/jbogard/MediatR

    MediatR支持两种模式:

    • 请求/响应模式:
      请求/响应模式,也可以叫做命令模式,主要适用于命令和查询场景。一个请求只能被一个处理者捕获,如果存在多个处理者,那么只有最后一个处理者会被激活。
    • 发布模式:
      一般用于发布一个事件,通知订阅者某件事情已经发生,对此事感兴趣的订阅者可以采取行动了。一般是一个发布者,多个订阅者。无返回参数。

    基本使用

    1、NuGet添加引用包
    MediatR
    MediatR.Extensions.Microsoft.DependencyInjection(如果处理类需要依赖注入,引用此包)
    2、注入相关服务

    services.AddMediatR(System.Reflection.Assembly.GetExecutingAssembly());//把自定义的消息类,处理消息类注入到服务中
    

    请求/响应模式:

    定义消息类型

    IRequest:有返回值单播消息
    IRequest 无返回值单播消息

    public class Ping : IRequest<string>  { 
      public string Title { get; set; }   
      public string Content { get; set; } }
    

    创建消息处理类

    IRequestHandler<Ping, string>: Ping消息类,string是返回类型
    RequestHandler<Ping,string>:如果是同步处理,可继承此类
    AsyncRequestHandler<Ping,string>:如果是异步处理,可继承此类(测试没找到这个类)

    public class PingHandler : IRequestHandler<Ping, string>
    {
      public Task<string> Handle(Ping request, CancellationToken cancellationToken)
       {
        Console.WriteLine("PingHandler Doing..." + request.Title);
        return Task.FromResult("ok");
       }
    }
    

    发送请求:

     public IActionResult Index([FromServices] IMediator mediat)
            {
               Task<string> task = mediat.Send(new Ping { Title = "testTitle" });
                string result = task.Result;
                return View();
            }
    

    发布模式

    INotification:消息类继承此接口
    INotificationHandler:消息处理类继承此接口

        public class NotifiMessage : INotification
        {
            public string Title { get; set; }
        }
        public class NotifiHandler1 : INotificationHandler<NotifiMessage>
        {
            public async Task Handle(NotifiMessage notification, CancellationToken cancellationToken)
            {
                await Task.Delay(3000);
                Console.WriteLine($"{notification.Title}1,{Thread.CurrentThread.ManagedThreadId}");
            }
        }
        public class NotifiHandler2 : INotificationHandler<NotifiMessage>
        {
            public async Task Handle(NotifiMessage notification, CancellationToken cancellationToken)
            {
                await Task.Delay(3000);
                Console.WriteLine($"{notification.Title}2,{Thread.CurrentThread.ManagedThreadId}");
            }
        }
    

    发布消息:

    await mediator.Publish(new Hello() {MsgId = 300});
    

    参考:
    http://www.csharpkit.com/en/2018-04-19_78780.html
    https://www.jianshu.com/p/583bcba352ec(待)

  • 相关阅读:
    洛谷P4548 [CTSC2006]歌唱王国(概率生成函数)
    洛谷P3643 [APIO2016]划艇(组合数学)
    洛谷T46780 ZJL 的妹子序列(生成函数)
    洛谷P4220 [WC2018]通道(边分治+虚树)
    洛谷P4931 情侣?给我烧了!(加强版)(组合数学)
    洛谷P4451 [国家集训队]整数的lqp拆分(生成函数)
    thinkphp5.0 页面缓存
    thinkphp5.0 cache数据缓存机制
    laravel 视图调用方法并传递参数
    laravel 安装配置前准备
  • 原文地址:https://www.cnblogs.com/fanfan-90/p/14237052.html
Copyright © 2020-2023  润新知