[轉]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.pswp.cn/news/285523.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/285523.shtml
英文地址,請注明出處:http://en.pswp.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…