[转]c# 中间件 的扩展模型(.net webapi/.net Core 的 MiddleWare 处理模型)

在学习 asp.net WebApi 或者asp.net Core 的时候,它们管道的处理模型跟 asp.net MVC/WebForm 的管道模型是不一样的。

asp.net WebApi 或者asp.net Core 他们使用了一种叫做“中间件”的处理模型,相对于传统管道模型,剔除了很多非必要的处理,扩展行增强,根据需求进行各种拓展,有类似装饰器、aop的效果。

然后笔者就想看着这样的一种模型我们是不是也可以设计出来呢,知道今天 才有时间鼓捣一下,实现了一个简单的 模型。代码量很少。

这里是仿 asp.net Core 的中间件写的一个中间件模型。直接给出代码如下:

 

中间件模型

public class MiddleWare<T>
{public List<Func<T, Func<Task>, Task>> MiddleWares = null;public MiddleWare(){MiddleWares = new List<Func<T, Func<Task>, Task>>();}public void Add(Func<T, Func<Task>, Task> middleWare){MiddleWares.Add(middleWare);}public async Task Execute(T t){//列表数据倒序,从最后一个注册的func一层一层往上包MiddleWares.Reverse();await MiddleWares[MiddleWares.Count - 1].Invoke(t, Execute(t,-1, MiddleWares.Count - 2, null));}private Func<Task> Execute(T t,int index ,int count,Func<Task> func){if(index< count){return Execute(t,++index,count, async () => await MiddleWares[index].Invoke(t, func));}return func;}
}

这个模型就一个类,很简单,就是 接收 func 存到列表,然后倒序对 func包装,最后执行。

测试的代码如下:

 
class Program
{static void Main(string[] args){MiddleWare<string> middleWare = new MiddleWare<string>();middleWare.Add(async (s, next) =>{Console.WriteLine("---------------异常处理层");try{await next.Invoke();}catch (Exception ex){Console.WriteLine($"----------异常:{ex.Message}\r\n{ex.StackTrace}");}Console.WriteLine("---------------异常处理层");});middleWare.Add(async (s, next) =>{Console.WriteLine("中间件第一层---开始");await next.Invoke();Console.WriteLine("中间件第一层---结束");});middleWare.Add(async (s, next) =>{Console.WriteLine(" 中间件第二层---开始");await next.Invoke();Console.WriteLine(" 中间件第二层---结束");});middleWare.Add(async (s, next) =>{Console.WriteLine(" 中间件第三层---开始");await next.Invoke();Console.WriteLine(" 中间件第三层---结束");});middleWare.Add(async (s, next) =>{await Task.Run(() => { Console.WriteLine(" 中间件第四层---开始"); });await next.Invoke();await Task.Run(() => { Console.WriteLine(" 中间件第四层---结束"); });});middleWare.Add(async (s, next) =>{await Task.Run(() => { Console.WriteLine($"核心部分------输入的内容是:{s}"); });});Task.WaitAll(middleWare.Execute("哈哈哈哈哈"));Console.ReadLine();}
}


效果如图所示:

 


---------------------
作者:mengtoumingren
来源:CSDN
原文:https://blog.csdn.net/mengtoumingren/article/details/78063718
版权声明:本文为作者原创文章,转载请附上博文链接!
内容解析By:CSDN,CNBLOG博客文章一键转载插件

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

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

相关文章

AIX 环境下遇到Device Busy问题

IBM AIX v5.3操作系统环境下在对网络或网卡进行操作过程中经常遇到"Device Busy"而终止操作例如:#rmdev -l ent1遇到如下返回信息Method error (/etc/methods/ucfgdevice):0514-062 Cant perform the requested function because the speciafield.device is busy. 解…

mykernel编译过程中问题解决

fatal error: linux/compiler-gcc5.h: No such file or directorycompilation terminated.解决方法:https://git.kernel.org/cgit/linux/kernel/git/stable/linux-stable.git/plain/include/linux/compiler-gcc5.h?id2c07053b8e1e0c22bb54dfbdf8e86a70f8bf00fc复制内容保存为c…

C#中的 Attribute 与 Python/TypeScript 中的装饰器是同个东西吗

前言最近成功把「前端带师」带入C#的坑&#xff08;实际是前端带师开始从cocos转unity游戏开发了&#xff09;某天&#xff0c;「前端带师」看到这段代码后问了个问题&#xff1a;[这个是装饰器]&#xff1f;[HttpGet] public Response Get() {return ... }我第一反应觉得不是&…

【ArcGIS Engine二次开发】入门基础(1):ArcGIS Engine简介及开发环境搭建

文章目录ArcGIS Engine概述ArcGIS Engine与ArcObjects的关系ArcGIS Engine下载及安装ArcGIS Engine概述 ArcGIS Engine简介 ArcGIS Engine是ESRI公司在2004年推出的用于开发C/S架构GIS应用软件的工具包&#xff0c;是将用于构建ArcGIS整套产品的组件库——ArcObjects的比分功…

微软Visual Studio 2019版本16.3 正式发布,支持 .NET Core 3.0

微软正式发布了Visual Studio 2019 16.3版本&#xff0c;主要更新内容如下&#xff1a; .NET Core 3.0 Visual Studio版本16.3包括对 .NET Core 3.0 的支持。 注意&#xff1a;如果使用的是.NET Core 3.0&#xff0c;则需要使用Visual Studio 16.3或更高版本。 .NET Core桌…

C语言试题120之输入两个正整数 m 和 n,求其最大公约数和最小公倍数

✅作者简介:大家好我是码莎拉蒂,CSDN博客专家🥇🥇🥇 📃个人主页:个人主页 🔥系列专栏:C语言试题200例 💬推荐一款模拟面试、刷题神器👉 点击跳转进入网站 1、题目 题目:输入两个正整数 m 和 n,求其最大公约数和最小公倍数 分析:利用辗除法 2 、温馨提示…

spring+springMvc+mybatis 调用oracle 存储过程

最近在项目中遇到在mybatis中调用oracle存储过程的问题&#xff0c;网上各种查询&#xff0c;最终解决了问题&#xff0c;在我们项目中我只需要oracle 的存储过程返回一个字符串用来存入数据库作为表数据的主键&#xff0c; 接下来整理代码&#xff1a; 首先构建存储过程getSeq…

OSChina 周一乱弹 ——致我们终将逝去的青春

2019独角兽企业重金招聘Python工程师标准>>> 我们的青春是这样的。 从幼儿园午睡开始&#xff0c; 做了一万遍的广播体操&#xff0c; 一条充满了“血”和“泪”的三八线 遍地开花的煎饼果子摊 五毛钱只能养活三天的小鸡 象征着财富和地位的弹珠 放学后 奔向世界 放…

【ArcGIS Engine二次开发】入门基础(2):ArcGIS开发方式(VBA、DLL、Add-in、Engine)对比

文章目录2.1 使用VBA进行桌面软件开发2.1.1 VBA开发方式2.1.1 VBA代码的安全性2.2 使用DLL进行桌面软件开发2.2.1 DLL开发方式2.2.2 DLL功能的应用部署2.3 使用Add-in进行桌面软件开发2.4 使用ArcGIS Engine构建独立应用程序对于桌面GIS应用来说&#xff0c;ArcGIS平台不仅提供…

使用.Net驱动Jetson Nano的OLED显示屏

背景最近几年&#xff0c;边缘计算的需求急剧爆发。人工智能、物联网和 5G 的演进给边缘计算带来了无限的可能性。因为工作原因&#xff0c;有幸在2019开始接触了英伟达 Jetson 家族的各种边缘计算设备&#xff1a;Nano&#xff0c;TX2&#xff0c;AGX&#xff0c;NX等&#xf…

工程测量不用愁,120个视频动画帮你忙,简单易学直观明了!

工程测量不用愁,120个视频动画帮你忙,简单易学直观明了!文末提供下载地址。

2016-2017-2学期《程序设计与数据结构》教学进程

2016-2017-2学期《程序设计与数据结构》教学进程 目录 考核方式课前准备教学进程 第00周学习任务和要求第01周学习任务和要求第02周学习任务和要求第03周学习任务和要求第04周学习任务和要求第05周学习任务和要求第06周学习任务和要求第07周学习任务和要求第08周学习任务和要求…

[转]Spring SpringMVC SpringBoot SpringCloud概念、关系及区别

&#xfeff;&#xfeff;一、正面解读&#xff1a; Spring主要是基于IOC反转Beans管理Bean类&#xff0c;主要依存于SSH框架&#xff08;StrutsSpringHibernate&#xff09;这个MVC框架&#xff0c;所以定位很明确&#xff0c;Struts主要负责表示层的显示&#xff0c;Spring利…

C语言试题121之输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。

✅作者简介:大家好我是码莎拉蒂,CSDN博客专家🥇🥇🥇 📃个人主页:个人主页 🔥系列专栏:C语言试题200例 💬推荐一款模拟面试、刷题神器👉 点击跳转进入网站 1、题目 题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。 分析:利用 w…

5.4 Spring AOP

2019独角兽企业重金招聘Python工程师标准>>> 5.4.1 从代理机制初探AOP 来看一个简单的例子&#xff0c;当需要在执行某些方法时留下日志信息&#xff0c;可能会这样写&#xff1a; import java.util.logging.*; public class HelloSpeaker{ pirvate Logger loggerL…

WPF 实现心电图曲线绘制

本文经原作者授权以原创方式二次分享&#xff0c;欢迎转载、分享。原文作者&#xff1a;流浪g原文地址&#xff1a;https://www.cnblogs.com/cong2312/p/16411637.html一、前言项目中之前涉及到胎儿心率图曲线的绘制&#xff0c;最近项目中还需要添加心电曲线和血样曲线的绘制功…

C语言试题110之利用条件运算符的嵌套来完成此题:学习成绩大于等于90分的同学用 A 表示,60到89 分之间的用 B 表示, 60 分以下的用 C 表示。

✅作者简介:大家好我是码莎拉蒂,CSDN博客专家🥇🥇🥇 📃个人主页:个人主页 🔥系列专栏:C语言试题200例 💬推荐一款模拟面试、刷题神器👉 点击跳转进入网站 1、题目 题目:C语言试题110之利用条件运算符的嵌套来完成此题:学习成绩大于等于90分的同学用 A 表…

【NOIp 2015】【DFS】斗地主

题面 自己网上去搜吧… 代码 #include <cstdio> #include <cstring> #include <algorithm> #define INF 10000000 #define maxn 40 using namespace std;int t,n,temp,a,zhang[maxn],ansINF;void dfs(int,int,int,int); void shunzi(int,int,int,int,int);vo…

[转]从入门到精通,Java学习路线导航

引言 最近也有很多人来向我"请教"&#xff0c;他们大都是一些刚入门的新手&#xff0c;还不了解这个行业&#xff0c;也不知道从何学起&#xff0c;开始的时候非常迷茫&#xff0c;实在是每天回复很多人也很麻烦&#xff0c;所以在这里统一作个回复吧。 Java学习路线…

如何让 Dapper 支持 DateOnly 类型

前言在上次的文章中&#xff0c;我们让 EF Core 6 支持了 DateOnly 类型。那么&#xff0c;Dapper 是否支持 DateOnly 类型呢&#xff1f;public class User {public int Id { get; set; }public string Name { get; set; }public DateOnly Birthday { get; set; } }using (var…