为什么应该在业务层实现管道模式,而不用ASP.NET Core Middleware实现 | 2点原因和实现方式...

前言

ASP.NET Core的Middleware(中间件)就是使用了管道模式:

5a12fb0357789e3a384aafe1d6430d25.png

Request(请求)在管道中传递,依次经过管道中的每一个MiddleWare进行处理。

MiddleWare就像一层层的“滤网”,过滤所有的请求和响应。

这种模式的好处在于,分离关注点。比如验证用户、记录访问日志,可以将这些任务分解到不同MiddleWare中,互相解耦。

既然ASP.NET Core已经实现了管道模式,为什么还要在业务层实现一遍呢?

原因

我觉得可以分为2方面考虑:

  • 与顶级框架解耦,不能保证应用程序代码始终运行在ASP.NET Core下,如果将业务迁移到WPF,记录访问日志这类放在管道中的功能还是需要实现

  • 同时支持不同来源请求,请求可能来自于Web API,也可能来自于Windows Service定时调用,但业务层处理逻辑应保持一样

因此,ASP.NET Core框架应该只用于接收输入和返回输出,而在业务层实现管道模式。

定义API的最佳实践

在《定义API的最佳实践MediatR类库实现Controller方法,将业务逻辑和Controller进行隔离。

示例代码如下:

[HttpGet]
public async Task<string> Demo([FromQuery] DemoQuery request)
{return await _mediator.Send(request);
}public class DemoQuery : IRequest<string>
{public string Name { get; set; }
}public class DemoQueryHandler : IRequestHandler<DemoQuery, string>
{ public async Task<string> Handle(DemoQuery request, CancellationToken cancellationToken){Console.WriteLine("DemoQueryHandler执行");return request.Name;}
}

而MediatR不仅仅是一个简单的中介模式实现,它还提供了Behaviors的概念:

3311316315de2012951aff00456d2cd2.png

Behaviors非常类似于ASP.NET Core中的MiddleWare,可以让我们实现管道模式。

管道实现

要定义Behaviors,我们需要实现IPipelineBehavior接口,示例代码如下:

public class FirstPipelineBehavior<TRequest, TResponse>: IPipelineBehavior<TRequest, TResponse>
{public async Task<TResponse> Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate<TResponse> next){Console.WriteLine("FirstPipelineBehavior执行中");var response = await next();Console.WriteLine("FirstPipelineBehavior执行完成");return response;}
}

和MiddleWare类似,调用next()可以将请求向下传递。

接着在Startup.cs中注册管道:

services.AddMediatR(typeof(Startup));
services.AddTransient(typeof(IPipelineBehavior<,>), typeof(FirstPipelineBehavior<,>));
services.AddTransient(typeof(IPipelineBehavior<,>), typeof(SecondPipelineBehavior<,>));
services.AddTransient(typeof(IPipelineBehavior<,>), typeof(ThirdPipelineBehavior<,>));

访问API可以看到,管道可以在IRequestHandler执行之前和之后执行代码,并且处理顺序和注册顺序相同

05c9b90eb662a44be68467a802f7f4f9.png

结论

通过本文,我们了解到,通过MediatR提供的Behaviors功能,不依赖ASP.NET Core框架,可以在业务层实现管道模式。

如果你觉得这篇文章对你有所启发,请关注我的个人公众号”My IO“,记住我!

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

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

相关文章

McAfee:较之中国美国黑客才最令人害怕

据McAfee研究发现美国是最有可能的网络攻击来源&#xff0c;而不是人们印象中广泛认为的中国或者俄罗斯。 McAfee进行了这么一项研究&#xff0c;组织来自各个国家的600位IT安全主管进行讨论&#xff0c;为他们最关注的互联网安全问题定级和归类&#xff0c;大部分报告都是符合…

缓存在哪里_什么是MyBatis缓存技术

MyBatis缓存引言在一个Web项目中&#xff0c;查询数据库中的操作算是一个非常常用的操作&#xff0c;但是有些数据会被经常性的查询&#xff0c;而每一次都去数据库中查询这些重复的数据&#xff0c;会很消耗数据库的资源&#xff0c;同时使得查询效率也很低&#xff0c;而 MyB…

无法打开物理文件 操作系统错误 5:拒绝访问 SQL Sever

今天分离附加数据库&#xff0c;分离出去然后再附加&#xff0c;没有问题。但是一把.mdf文件拷到其它文件夹下就出错&#xff0c;错误如下&#xff1a; 无法打开物理文件 "E:\db\homework.mdf"。操作系统错误 5:"5(拒绝访问。)"。 (Microsoft SQL Server&…

WPF开发登录窗口之——窗口布局

WPF开发者QQ群&#xff1a; 340500857 | 微信群 -> 进入公众号主页 加入组织01—代码如下一、创建项目&#xff0c;命名为LoginWindow&#xff0c;然后创建以下目录结构&#xff1a;二、导入图片三、创建资源字典。一共创建四个&#xff1a;ButtonStyle、WindowStyle、Text…

这个偏僻的小山村竟出了12位博士28位硕士,高产“学霸”背后原因曝光......

全世界只有3.14 % 的人关注了爆炸吧知识考上大学留名祖宗祠堂今早&#xff0c;超模君刷微博的时候&#xff0c;有一则新闻吓得我虎躯一震——一个总共才2000多人小山村&#xff0c;竟然出了12位博士28位硕士。而且考上大学的孩子&#xff0c;他们的名字直接刻进祖宗祠堂。(微博…

Android应用程序消息处理机制(Looper、Handler)分析(5)

ActivityThread类的这个mH成员变量是什么时候创建的呢&#xff1f;我们前面在分析应用程序的消息循环时&#xff0c;说到当应用程序进程启动之后&#xff0c;就会加载ActivityThread类的main函数里面&#xff0c;在这个main函数里面&#xff0c;在通过Looper类进入消息循环之前…

现在银行etl还要做拉链表吗_hive 拉链表 实现全量数据 增量更新

背景&#xff1a;数据表字段有IP&#xff0c;IP省份&#xff0c;IP城市&#xff0c;最新访问时间&#xff0c;假如目前一共有100W的IP我第一次初始化的时候完成初始化表插入&#xff0c;然后每天都有5W左右的IP活跃&#xff0c;然后我要更新这5W个IP的记录到初始化的表&#xf…

牛顿新定律:凭本事得到的,凭什么要还?

后记事后&#xff0c;超模君提出用上帝开过光的真苹果来换回自己的苹果手机&#xff0c;但是惨遭牛顿君拒绝&#xff0c;理由是苹果手机更能激发他的创作灵感……面对这种鬼话&#xff0c;超模君敢怒不敢言。更惨的是&#xff0c;上帝说苹果手机不报销……艾萨克牛顿&#xff0…

NOI导刊模拟2—电话网络 解题报告

题目大意&#xff1a;给出一个图&#xff0c;顶点为1到n和一个值k&#xff0c;求出包含顶点1到顶点n的通路的子图中&#xff0c;第k1大的边最短为多少&#xff1f;&#xff08;若存在一条从1到n路径边数小于等于k&#xff0c;则返回0&#xff0c;若不存在通路&#xff0c;返回-…

好书推荐 -《国富论》-15-09

好书推荐-《国富论》-15-09.md—/Users/zjh/Documents书籍 《国富论》-亚当斯密-陕西师范大学出版社 推荐理由 《国》是一本非常通俗易懂的经济书籍&#xff0c;用简单的语言讲解从个体&#xff0c;到小型市场&#xff0c;再到国家和政府的经济结构和规律。虽然亚当斯密的一些观…

04Prism WPF 入门实战 - Module

1.概要源码及PPT地址&#xff1a;https://github.com/JusterZhu/wemail视频地址&#xff1a;https://www.bilibili.com/video/BV1KQ4y1C7tg?sharesourcecopywebModule&#xff0c;具有特定功能&#xff0c;且独立存在则称为成为模块。下图为Prism体系中的关系结构图。在Prism体…

虚拟机(VMware Workstation)中,把连接网络的模式由“NAT模式”,改成“自动桥接模式”,网速大大的提升...

安装虚拟机&#xff0c;默认情况下&#xff0c;联网的模式是NAT&#xff0c;即跟主机是转发共用网络资源的&#xff0c;这样就非常慢&#xff0c;时常网页都打不开&#xff0c;现把它改成桥接模式&#xff0c;让它独立成为一台物理机&#xff0c;网速有大大的改善&#xff0c;设…

如何保持纯洁男女关系……

1 倒也没毛病▼2 差点以为是狗子&#xff01;&#xff01;▼3 大哥&#xff1a;我裤子没破&#xff01;▼4 女朋友梦到了啥&#xff1f;&#xff1f;▼5 忍不住了&#xff0c;嘻嘻嘻...&#xff08;via.小风车车&#xff09;▼6 亲爸爸&#xff01;&#xff01;▼7 哈哈哈…

【转】一个关于fork()的笔试题,考了好几遍,终于找到答案了

笔试至少3次见到这个题&#xff0c;都是瞎编的&#xff0c;今天群里有人问&#xff0c;然后有人放出了这个地址&#xff1a;http://coolshell.cn/articles/7965.html&#xff0c;让我恍然大明白&#xff0c;豁然好脾气。 感谢这位陈皓同学&#xff08;名字很熟&#xff0c;不记…

android自定义金额输入键盘_Android 自定义输入支付密码的软键盘实例代码

Android 自定义输入支付密码的软键盘有项目需求需要做一个密码锁功能&#xff0c;还有自己的软键盘&#xff0c;类似与支付宝那种&#xff0c;这里是整理的资料&#xff0c;大家可以看下&#xff0c;如有错误&#xff0c;欢迎留言指正需求&#xff1a;要实现类似支付宝的输入支…

IE6 IE8下背景图片不显示问题

更改background:url()no-repeat; 去掉no-repeat即可解决问题&#xff01;转载于:https://www.cnblogs.com/dream-w/p/4781644.html

C# 选中 DataGridView 控件中的行时显示不同的颜色

可以利用 DataGridView 控件的 SelectionMode、ReadOnly 和 SelectionBackColor 属性实现当选中DataGridView控件中的行时显示不同的颜色。SelectionMode属性用于设置如何选择 DataGridView 的单元格。语法如下:public DataGridViewSelectionMode SelectionMode{get;set;}属性值…

Objective-C( Foundation框架 一 常见的结构体)

常见的结构体 &#xff08;NSPoint&#xff0c;CGPoint&#xff09;、&#xff08;NSRange&#xff0c;CGRange&#xff09;、&#xff08;NSSize&#xff0c;CGSize&#xff09; 苹果官方推荐使用CG开头的结构体 NSRange是Foundation框架中常见的结构体它的定义如下&#xff1…

32岁武汉硕士毕业4年后重新高考,考上本硕需再读8年:“不是一时冲动”

全世界只有3.14 % 的人关注了爆炸吧知识9月5日&#xff0c;程传坤收到了湖北中医药大学的录取通知书。7月8日下午5时10分&#xff0c;32岁的程传坤走出湖北省武汉市新洲一中考点&#xff0c;一脸轻松&#xff0c;拿着准考证特意在新洲一中门前留影。这是他硕士毕业4年后再战高考…

打开本地文件_可以跨软件搜索文件?结构式检索你一定要学会!

面对电脑中日积月累的大量结构式&#xff0c;如何能快速找到自己想要的文件&#xff0c;有时真是一个让人头疼的问题。KingDraw PC版内置的结构式检索功能&#xff0c;可以帮助我们轻松解决这个难题。KingDraw PC版中&#xff0c;我们有两种途径可以检索结构式——右键菜单中检…