zoukankan      html  css  js  c++  java
  • MediatR 框架在.Asp.net Core 中的应用

    1. 什么是MediatR 

       MediatR 是一个第三方的类库,主要解决将消息的发送和消息的处理进行分离.github地址 https://github.com/jbogard/MediatR/wiki

       MediatR 支持The Command and Query Responsibility Segregation (CQRS) pattern. 下面我们具体会提到.

       该框架的设计思想主要来源于软件设计模式的中介者模式(Mediator Pattern). 想了解更多的设计模式请google

    2.创建Web API 项目引入需要的NuGet包.

      

     3.在StartUp类的ConfigureService 方法添加如下代码, 并将MediatR 注入的容器:

       ok,到此为止我们可以在Asp.net core web api 中使用MediatR .

    4. 创建OrderController 为API , 并在构造函数中引用IMediator 对象.

     

    5.我们来实现三个API. (查询所有订单、根据订单号查询单个订单、新增订单)

       5.1 查询所有订单 .

             我们在根目录下新建一个Queries 文件夹,并创建GetAllOrderQuery类. 该类实现IRequest<out T> 这一步很重要 ,这个也很重要,下面作解释.

           

              我们在根目录下新建一个Handlers文件夹,并创建GetAllOrdersHandler 类,该类实现IRequestHandler<T, T> 接口,需要实现该接口的方法Handle , 第一个参数使我们上面定义的GetAllOrderQuery类型, 第二个参数是Handler 返回类型.

              创建GetAllOrders API, 并调用_mediator.Send() 方法,将GetAllOrderQuery 作为输入参数传进去.

             到此为止,如果我们在Swagger 上调用改方法,Mediator 会将消息自动转发到我们刚才定义的GetAllOrdersHandler 类的Handle 方法. 可以在某种程度上实现解耦.

       5.2 查询单个订单 .

             同样创建一个类GetOrderByIdQuery ,并将该类放到Queries 文件夹下. 该类并实现IRequest<T> 接口.

             我们同样在创建一个对应的Handler 类 ,并实现IRequestHandler<T,T> 接口

             创建GetSingleOrder API, 并调用_mediator.Send() 方法,将GetOrderByIdQuery作为输入参数传进去.

             Mediator 会将消息自动转发到我们刚才定义的GetOrderByIdHandler类的Handle 方法.

       5.3 创建一个新订单

             在项目根目录下创建Command 文件夹. 并创建CreateOrderCommand实现IRequest<T> 接口

       

             在Handler 文件夹下创建CreateOrderHandler ,并实现IRequestHandler 接口. 

             创建对应的API

             Mediator 会将消息自动转发到我们刚才定义的CreateOrderHandler 类的Handle 方法. 

    总结:

    到此三个API 完成,这里需要强调注意的几点是逻辑上分为三个文件夹Queries, Command ,Handler, Queries 用来定义一些GET方法关联的类,Command 用来定义一些POST,PUT,DELETE 方法关联的类.

    query和command 类,都对应相应的Handler .

    query和command 类必须实现IRequest接口,该接口的类型是输出值.

    Handler  必须实现IRequestHandler 接口,该接口的第一个参数是对应的query和command类,第二个参数Handle方法的返回值.

  • 相关阅读:
    关于解决Python中requests模块在PyCharm工具中导入问题
    arcgis javascript api 事件的监听及移除
    零基础掌握百度地图兴趣点获取POI爬虫(python语言爬取)(代码篇)
    python 爬取全量百度POI
    Webpack安装使用总结
    开源协议之间的区别
    npm指令后缀
    nrm的作用(及安装)
    Vuejs中关于computed、methods、watch的区别
    VUE参考---watch、computed和methods之间的对比
  • 原文地址:https://www.cnblogs.com/netcoder/p/13202062.html
Copyright © 2011-2022 走看看