使用Brighter实现轻量型独立管道

前言

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

d3e0cccdb01e76726d68f62085fe70b9.png

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

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

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(检查请求参数合法性)。

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

2dec14e4559ab55ff6ae45ee570417ec.png

要实现俄罗斯套娃,我们必须创建一个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的设置相同:

9bb5691669c3e38069a19cdb591a445d.png

结论

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/291370.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Adobe Air 写文件如何换行

在用Air打log的时候发现,在字符串后面加"\n"并不能实现换行.百度一下才知道windows的换行是"\r\n".Mac OS 和 Linux换行符是"\n". 不同操作系统的换行符可能不一样.File有个静态属性File.lineEnding.用这个就可以了 下面是这个属性的官方帮助文档…

CentOS6最小化安装默认启动的服务说明

centos6.2最小化安装后执行chkconfig --list,显示所有服务&#xff0c;如下图&#xff1a;下边分别进行说明&#xff1a;auditd&#xff1a;审核守护进程当 auditd 运行的时候&#xff0c;审核信息会被发送到一个用户配置日志文件中&#xff08;默认的文件是 /var/log/audit/au…

网页中插入javascript的几种方法

网页中插入javascript的方法常见的有两种&#xff1a; 一、直接使用html标记 JavaScript 可以出现在 html的任意地方。使用标记<script>…</script>&#xff0c;你可以在 HTML 文档的任意地方插入 JavaScript&#xff0c;甚至在<HTML>之前插入也不成问题。不…

LeetCode之Max Consecutive Ones

1、题目 Given a binary array, find the maximum number of consecutive 1s in this array. Example 1: Input: [1,1,0,1,1,1] Output: 3 Explanation: The first two digits or the last three digits are consecutive 1s.The maximum number of consecutive 1s is 3.Note: T…

java exception 行号_java日志记录错误的文件_方法_行号_报错信息

1、java日志记录错误的文件、方法、行号、报错信息StackTraceElement s e.getStackTrace()[0];1.1、记录保存的文件s.getFileName()1.2、记录保存的方法s.getMethodName()1.3、记录报错的行号 s.getLineNumber()1.4、记录报错的信息(不全面) e.getMessage()1.5、互利报错的类名…

[有奖励]GeneralUpdate开源项目招募开发者

[有奖励]GeneralUpdate开源项目招募开发者希望看到这篇文章的小伙伴&#xff0c;能看完这篇文章顺便帮忙给项目点一下“star”、转发、“在看”。先在这里谢谢各位了。github仓库地址&#xff1a;https://github.com/WELL-E/AutoUpdatergitee仓库地址&#xff1a;https://gitee…

C/C++ 读取16进制文件

1.为什么有这种需求 因为有些情况需要避免出现乱码。不管什么编码都是二进制的&#xff0c;这样表示为16进制就可以啦。 2.如何读取16进制文件 最近编程用这一问题&#xff0c;网上查了一下&#xff0c;感觉还是自己写吧。 16进制数据一般是:text0x340xb5...&#xff0c;就是0x…

【转】shell pipe与输入输出重定向的区别

http://www.cnblogs.com/chengmo/archive/2010/10/21/1856577.html转载于:https://www.cnblogs.com/qrlozte/p/4465120.html

LeetCode之Remove Duplicates from Sorted Array

1、题目 Given a sorted array, remove the duplicates in place such that each element appear only once and return the new length. Do not allocate extra space for another array, you must do this in place with constant memory. For example, Given input array nu…

Upgrade Oracle GI 11.2.0.4_to_12.1.0.2

12.1.0.2已经发布一段时间了&#xff0c;随着用户的增多&#xff0c;目前12C的版本稳定性&#xff0c;以及各个方面的功能性&#xff0c;得到大家的认可。很多用户&#xff0c;需要将数据库从低版本升级到12C&#xff0c;本文就升级过程&#xff0c;做了详细的记录。&#xff0…

基于PaddleOCR实现AI发票识别的Asp.net Core应用

简要介绍用户批量上传需要识别的照片,上传成功后,系统会启动Hangfire后台Job开始调用PaddleOCR服务返回结果,这个过程有点类似微服务的架构模型。PaddleOCRPaddleOCR是百度AI团队开源的一个项目&#xff0c;应该是目前所有免费开源OCR项目中识别效果最好的,具体可以通过PaddleO…

java socket 路由_JAVA简单的Socket网络编程!CS

好久没写socket代码了&#xff0c;也忘了八九成了……话不多说&#xff01;直接上代码吧&#xff01;Server服务package test1;import java.io.*;import java.net.*;public class MyServer {public static void main(String[] args) throws IOException{ServerSocket server n…

linux dd 命令详解

1 磁盘管理1.1 dd1.1.1 功能说明读取&#xff0c;转换并输出数据。1.1.2 语法dd [bs<字节数>][cbs<字节数>][conv<关键字>][count<区块数>][ibs<字节数>][if<文件>][obs<字节数>][of<文件>][seek<区块数>][skip<区块…

LeetCode之Remove Duplicates from Sorted Array II

1、题目 Follow up for "Remove Duplicates": What if duplicates are allowed at most twice? For example, Given sorted array nums [1,1,1,2,2,3], Your function should return length 5, with the first five elements of nums being 1, 1, 2, 2 and 3. It …

Struts2 OGNL

OGNL(Object-Graph Navigation Language)的概念&#xff1a; OGNL是Object-Graph Navigation Language的缩写&#xff0c;全称为对象图导航语言&#xff0c;是一种功能强大的表达式语言&#xff0c;它通过简单一致的语法&#xff0c;可以任意存取对象的属性或者调用对象的方法&…

Android获取有线和无线(wifi)的IP地址

/*** 获取IP* * param context* return*/public static String getIP(Context context) {String ip "0.0.0.0";ConnectivityManager connectivityManager (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);NetworkInfo info connec…

如何实现线程池的 QueueUserWorkItem 方法的延续?

咨询区 PedroC88如果我将 Job 通过 QueueUserWorkItem 方法丢到线程池的话&#xff0c;请问我如何让程序在该 Job 完成后继续执行&#xff0c;我知道可以添加一些逻辑代码来完成此项功能&#xff0c;但我想知道有没有类似 Thread.Join() 或者怎么提取到被赋于 job 的线程 &…

LeetCode之Remove Duplicates from Sorted List

1、题目 Given a sorted linked list, delete all duplicates such that each element appear only once. For example, Given 1->1->2, return 1->2. Given 1->1->2->3->3, return 1->2->3. 1->2->2->2 return 1->2 1->2->3->…

常用的搜索引擎dork (不断更新)

为什么80%的码农都做不了架构师&#xff1f;>>> pan.baidu.com xiaomi.rar 转载于:https://my.oschina.net/ecnu/blog/265731

Bzoj2656 [Zjoi2012]数列(sequence)

Time Limit: 2 Sec Memory Limit: 128 MBSubmit: 1448 Solved: 762[Submit][Status][Discuss]Description 小白和小蓝在一起上数学课&#xff0c;下课后老师留了一道作业&#xff0c;求下面这个数列的通项公式&#xff1a; 小白作为一个数学爱好者&#xff0c;很快就计算出了…