前言

上次,我们介绍了使用MediatR的Behaviors功能,在业务层实现管道模式。(《为什么应该在业务层实现管道模式,而不用ASP.NET Core Middleware实现 | 2点原因和实现方式》)

但是,这种管道有个特点或者说缺点,不管你需不需要,所有请求都要经过管道处理,而且处理顺序必须一致。

下面,我们介绍一种更轻量的实现方式。

Brighter

Brighter一个命令处理器和调度程序实现,支持任务队列的轻量级类库。

它的使用方式和MediatR类似,同样可以实现业务逻辑和Controller进行隔离。

1.引用nuget包

创建Web API项目,并引用nuget包Paramore.Brighter.AspNetCore

2.定义请求数据

添加一个新类DemoCommand,实现IRequest接口:

public class DemoCommand : IRequest
{public Guid Id { get; set; }public string Name { get; set; }
}

3.实现请求处理程序

添加一个新类DemoCommandHandler,继承基类RequestHandler<TRequest>TRequest对应实现了IRequest接口的类:

public class DemoCommandHandler : RequestHandler<DemoCommand>
{public override DemoCommand Handle(DemoCommand command){Console.WriteLine("DemoQueryHandler执行");return base.Handle(command);}
}

4.实现API

Controller没有任何业务逻辑,仅将请求通过commandProcessor发送:

private readonly IAmACommandProcessor _commandProcessor;
public WeatherForecastController(IAmACommandProcessor commandProcessor)
{_commandProcessor = commandProcessor;
}[HttpPost]
public void Demo(DemoCommand command)
{_commandProcessor.Send(command);
}

5.添加Brighter配置

打开Startup.cs,在ConfigureServices方法中,添加如下代码:

services.AddBrighter().HandlersFromAssemblies(typeof(Startup).Assembly);

6.运行

运行程序,访问API地址,可以看到输出正常,说明请求已通过Brighter发送给请求处理程序处理。

实现独立管道

Brighter提供了一种被称为俄罗斯套娃的模型,可以将多个RequestHandler串联起来执行同一个请求,比如为DemoCommandHandler加上LogHandler(写日志)和ValidateHandler(检查请求参数合法性)。

这就相当于为每个请求处理程序提供了一条独立管道。

要实现俄罗斯套娃,我们必须创建一个Attribute来继承RequestLoggingAttribute:

public class FirstPipelineAttribute: RequestHandlerAttribute
{public FirstPipelineAttribute(int step, HandlerTiming timing): base(step, timing){ }public override Type GetHandlerType(){return typeof(FirstPipelineHandler<>);}
}public class FirstPipelineHandler<TRequest> : RequestHandler<TRequest> where TRequest: class, IRequest
{public override TRequest Handle(TRequest request){Console.WriteLine("FirstPipelineHandler执行");return base.Handle(request);}
}
  • step 定义在管道中的执行顺序

  • timing 在请求处理程序之前还是之后执行

  • GetHandlerType() 返回具体处理方法的实现,同样要继承自RequestHandler<TRequest>

然后在具体的Handle声明这些Attribute:

[FirstPipeline(1, HandlerTiming.Before)]
[SecondPipeline(2, HandlerTiming.Before, typeof(SecondPipelineHandler<>))]
[SecondPipeline(3, HandlerTiming.After, typeof(ThirdPipelineHandler<>))]
public override DemoCommand Handle(DemoCommand command)

可以看到,管道的处理顺序和step、timing的设置相同:

结论

通过本文,我们可以了解到,Brighter可以为每个请求实现独立的管道,这样可以更灵活地控制管道执行的内容和顺序。

想了解更多内容,请关注我的个人公众号”My IO“

使用Brighter实现轻量型独立管道相关推荐

  1. 基于轻量型Web服务器Raspkate的RESTful API的实现

    在上一篇文章<Raspkate - 基于.NET的可运行于树莓派的轻量型Web服务器>中,我们已经了解了Raspkate这一轻量型Web服务器,今天,我们再一起了解下如何基于Raspkat ...

  2. Raspkate - 基于.NET的可运行于树莓派的轻量型Web服务器

    最近在业余时间玩玩树莓派,刚开始的时候在树莓派里写一些基于wiringPi库的C语言程序来控制树莓派的GPIO引脚,从而控制LED发光二极管的闪烁,后来觉得,是不是可以使用HTML5+jQuery等流 ...

  3. 【轻量型卷积网络】ResNeXt网络解析

    [轻量型卷积网络]ResNeXt网络解析 文章目录 [轻量型卷积网络]ResNeXt网络解析 1. 介绍 2. 模型 2.1 组卷积 2.2 ResNeXt-block 2.3 为什么 group = ...

  4. 百度:YOLOX和NanoDet都没我优秀!轻量型实时目标检测模型PP-PicoDet开源

    作者丨happy    编辑丨极市平台 导读 百度提出新型移动端实时检测模型PP-PicoDet.本文对anchor-free策略在轻量型检测器中的应用进行了探索:对骨干结构进行了增强并设计了一种轻量 ...

  5. 【移动端最强架构】LCNet吊打现有主流轻量型网络(附代码实现)

    点击上方,选择星标或置顶,不定期资源大放送! 阅读大概需要5分钟 Follow小博主,每天更新前沿干货 [导读]之前详细介绍了轻量级网络架构的开源项目,详情请看深度学习中的轻量级网络架构总结与代码实现 ...

  6. 轻量型模型比肩千亿大模型,新一代中文语言模型孟子,刷新CLUE纪录!

    转自:机器之心 近日,澜舟科技 - 创新工场团队与上海交通大学.北京理工大学等单位联合研发的中文语言模型-孟子轻量型模型,超越腾讯.搜狗等公司,在中文语言理解评测 CLUE 榜单上登顶第一,刷新业界记 ...

  7. 轻量型「孟子」模型比肩千亿大模型!AI大牛周明率队刷新CLUE新纪录

    AI 科技评论报道 编辑 | 陈大鑫 近日,澜舟科技-创新工场团队与上海交通大学.北京理工大学等单位联合研发的中文语言模型-孟子轻量型模型,超越腾讯.搜狗等公司,在中文语言理解评测CLUE榜单上登顶第 ...

  8. 【深度学习】百度:YOLOX和NanoDet都没我优秀!轻量型实时目标检测模型PP-PicoDet开源...

    作者丨happy 编辑丨极市平台 导读 百度提出新型移动端实时检测模型PP-PicoDet.本文对anchor-free策略在轻量型检测器中的应用进行了探索:对骨干结构进行了增强并设计了一种轻量Nec ...

  9. 【深度学习】Transformer 向轻量型迈进!微软与中科院提出两路并行的 Mobile-Former...

    作者丨happy 编辑丨极市平台 导读 本文创造性的将MobileNet与Transformer进行了两路并行设计,穿插着全局与特征的双向融合,同时利用卷积与Transformer两者的优势达到&qu ...

最新文章

  1. grunt使用watch和livereload的Gruntfile.js的配置
  2. 第二阶段_第五小节_C#基础3
  3. cache_purge php
  4. 使用 UML 进行业务建模:理解业务用例与系统用例的相似和不同之处
  5. OpenCV--罗德里格斯(Rodrigues)变换
  6. DPDK-UIO 驱动认识
  7. MapGISnbsp;K9nbsp;SP3amp;nb…
  8. scratch编程超好玩的解密游戏
  9. 申请德国农工大学计算机案例,德州农工大学本科案例
  10. OSChina 周三乱弹 —— who's your 大爷
  11. vue中引用高德地图根据经纬度计算两地距离
  12. picker使用以及注意事项
  13. 微信小程序做图片压缩
  14. 笨方法学python 34-38
  15. 提取ROS .bag文件中的图片
  16. Python 多进程并行编程实践: multiprocessing 模块
  17. 对可编程控制器的专有协议进行模糊处理找到影响物理控制相关的漏洞
  18. 【杂篇】书单(技术、文学、历史、经济、方法论等等)
  19. 课程设计:迷宫问题的求解
  20. Photoshop:6.14世界献血海报设计分享poster design(内附psd)

热门文章

  1. memcache的学习路线图
  2. android:versionCode和android:versionName 用途
  3. Leetcode: Palindrome Partition I II
  4. web前端url传递值 js加密解密
  5. 关于tcmalloc\malloc和new
  6. IntelliJ IDEA——数据库集成工具(Database)的使用
  7. jquery对json的各种遍历
  8. segnet 编译与测试
  9. jquery weui 中alert弹出框在ios中跳动问题
  10. POJ1269 Intersecting Lines 计算几何 C语言