使用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,一经查实,立即删除!

相关文章

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

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

[有奖励]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…

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

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

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

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

学习笔记之卸载远程目标进程中的DLL模块(转)

学习笔记之卸载远程目标进程中的DLL模块 (2007-07-23 23:51:02)转载▼学习笔记之卸载远程目标进程中的DLL模块2007/7/231.首先得把DLL模块中的线程结束使用CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD,0);创建系统线程的快照然后用Thread32First()和Thread32Next()遍历系统中所…

Wow,一个免费、不怕打的评论插件!

快速给网站添加评论功能大家好&#xff0c;我是鱼皮&#xff0c;前段时间我自己做的网站不是被 DDOS 攻击了么&#xff1f;然后我就即时地给大家分享了一下我是怎么临时 “化解” 这次 DDOS 攻击的。结果我今天一看&#xff0c;好家伙&#xff0c;这个视频竟然都已经 120 w 播放…

MSSQLSERVER启动不了,报SQL Server 无法生成 FRunCM 线程

为什么80%的码农都做不了架构师&#xff1f;>>> 在启动MSSQLSERVER服务时&#xff0c;提示启动不了&#xff0c;在事件查看器中发现报错&#xff1a;SQL Server 无法生成 FRunCM 线程 网上搜了一下说是&#xff1a;MSSQLSERVER的协议中VIA协议被启用了&#xff0c;…

hdu 2648 Shopping

原题链接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid2648 纯暴力的方法T_T。。。 如下: 1 #include<cstdio>2 #include<cstdlib>3 #include<string>4 #include<iostream>5 #include<algorithm>6 typedef char State[35];7 char *ta…

Windows导出所有计划任务方法

windows计划任务的命令为&#xff1a;schtasksSCHTASKS /parameter [arguments]描述:允许管理员创建、删除、查询、更改、运行和中止本地或远程系统上的计划任务。参数列表:/Create 创建新计划任务。/Delete 删除计划任务。/Query 显示所有计划任务。…

C# 使用多个异步方法

在一个异步方法中&#xff0c;可以调用一个或多个异步方法。如何编写代码&#xff0c;取决于一个异步方法的结果是否依靠于另一个异步方法。01 按顺序调用异步方法使用 await 关键字可以调用每个异步方法。在有些情况下&#xff0c;如果一个异步方法依赖另一个异步方法的结果&a…

Nova虚拟机启动提示libvirtError

OpenStack自动化安装基本折腾完毕&#xff0c;装一次大概也就10分钟&#xff0c;但是装完后今天我的虚拟机起不来&#xff0c;经过查找log发 现如下图提示&#xff1a; 已经到这里&#xff0c;说明已经过了nova-sheduler那一关&#xff0c;跟踪一下代码&#xff0c;也正是在调用…

ASP.NET Core使用功能开关控制路由访问

前言在前面的文章&#xff0c;我们介绍了使用Middleware有条件地允许访问路由&#xff08;《ASP.NET Core使用Middleware有条件地允许访问路由》&#xff09;。而对于一些试验性的功能&#xff0c;我们并不希望用密码去控制是否允许访问&#xff0c;而是想用一种开关的方式开放…

C#中的数组

欢迎您成为我的读者&#xff0c;希望这篇文章能给你一些帮助。前言前面的文章和大家一起看了C#中的异常&#xff0c;今天一起学习下C#中最基本的数据结构&#xff0c;数组的用法。数组实际上是由一个变量名称表示的一组同类型的数据元素。每个元素通过变量名称和一个或多个方括…

如何打卡后缀为3ds的文件

打开.3DS文件 3DS文件怎么打开&#xff1f; 用它吧&#xff1a;a3dsviewer&#xff0c;顾名思义&#xff0c;一个3D文件浏览工具&#xff0c;为用户提供一个快速和简单的3DS文件浏览器很容易。 这里是一些主要特点的“a3dsviewer”&#xff1a; 将3DS文件的POVRay格式。 输出的…

ASP.NET Core使用功能开关控制路由访问(续)

前言在前面的文章&#xff0c;我们介绍了使用功能开关控制路由访问。但其实我们使用了2个条件做的判断&#xff1a;var isDebugEndpoint context.Request.Path.Value.Contains("/test"); var debugEndpoint await _featureManager.IsEnabledAsync("ForbiddenD…

如何使用CDR智能填充工具

使用智能填充工具可以为任意的闭合区域填充颜色并设置轮廓。与其他填充工具不同&#xff0c;智能填充工具仅填充对象&#xff0c;它检测到区域的边缘并创建一个闭合路径&#xff0c;因此可以填充区域。例如&#xff0c;智能填充工具可以检测多个对象相交产生的闭合区域&#xf…

java对象引用出错_“Java有值传递和引用传递”为什么错了?

前言初学Java的时候&#xff0c;老师在课堂上说“Java有值传递和引用传递”&#xff0c;但网上“Java只有值传递”的呼声很高。本人在查找资料的过程中&#xff0c;在这两个说法之间反复横跳。经过本人的整理后&#xff0c;其实还真的是Java只有值传递。什么是值传递&#xff1…

程序员生存之道-教你如何在丛林中捕获食物

文章目录 &#x1f4a5; 序言&#x1f423; 躺&#x1f95d; 从零到一还是从零到100&#xff1f;&#x1f344; 螺丝钉文化&#x1f354; 价值分析&#x1f353; 长期主义者&#xff1f;&#x1f96c; 何为顺其自然&#xff1f;&#x1f308; 总结 &#x1f4a5; 序言 嗨&#…

微软发文庆祝 .NET 诞生 20 周年纪念日!

技术编辑&#xff1a;MissD丨发自 思否编辑部公众号&#xff1a;SegmentFault刚刚过去的“情人节”里&#xff0c;.NET 团队为庆祝 .NET 社区诞生 20 周年而举办了一场盛大的活动。没错&#xff01;.NET 于 2002 年 2 月 13 日与 Visual-Studio 一起推出&#xff0c;本月终于迎…