[转]c# 中间件 的扩展模型(.net webapi/.net Core 的 MiddleWare 处理模型)
在學(xué)習(xí) asp.net WebApi 或者asp.net Core 的時(shí)候,它們管道的處理模型跟 asp.net MVC/WebForm 的管道模型是不一樣的。
asp.net WebApi 或者asp.net Core?他們使用了一種叫做“中間件”的處理模型,相對(duì)于傳統(tǒng)管道模型,剔除了很多非必要的處理,擴(kuò)展行增強(qiáng),根據(jù)需求進(jìn)行各種拓展,有類(lèi)似裝飾器、aop的效果。
然后筆者就想看著這樣的一種模型我們是不是也可以設(shè)計(jì)出來(lái)呢,知道今天 才有時(shí)間鼓搗一下,實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的 模型。代碼量很少。
這里是仿 asp.net Core 的中間件寫(xiě)的一個(gè)中間件模型。直接給出代碼如下:
?
中間件模型
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){//列表數(shù)據(jù)倒序,從最后一個(gè)注冊(cè)的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;} }這個(gè)模型就一個(gè)類(lèi),很簡(jiǎn)單,就是 接收 func 存到列表,然后倒序?qū)?func包裝,最后執(zhí)行。
測(cè)試的代碼如下:
? 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("中間件第一層---開(kāi)始");await next.Invoke();Console.WriteLine("中間件第一層---結(jié)束");});middleWare.Add(async (s, next) =>{Console.WriteLine(" 中間件第二層---開(kāi)始");await next.Invoke();Console.WriteLine(" 中間件第二層---結(jié)束");});middleWare.Add(async (s, next) =>{Console.WriteLine(" 中間件第三層---開(kāi)始");await next.Invoke();Console.WriteLine(" 中間件第三層---結(jié)束");});middleWare.Add(async (s, next) =>{await Task.Run(() => { Console.WriteLine(" 中間件第四層---開(kāi)始"); });await next.Invoke();await Task.Run(() => { Console.WriteLine(" 中間件第四層---結(jié)束"); });});middleWare.Add(async (s, next) =>{await Task.Run(() => { Console.WriteLine($"核心部分------輸入的內(nèi)容是:{s}"); });});Task.WaitAll(middleWare.Execute("哈哈哈哈哈"));Console.ReadLine();} }
效果如圖所示:
?
---------------------
作者:mengtoumingren
來(lái)源:CSDN
原文:https://blog.csdn.net/mengtoumingren/article/details/78063718
版權(quán)聲明:本文為作者原創(chuàng)文章,轉(zhuǎn)載請(qǐng)附上博文鏈接!
內(nèi)容解析By:CSDN,CNBLOG博客文章一鍵轉(zhuǎn)載插件
總結(jié)
以上是生活随笔為你收集整理的[转]c# 中间件 的扩展模型(.net webapi/.net Core 的 MiddleWare 处理模型)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 2019年中国教育信息化行业研究报告
- 下一篇: 微软Visual Studio 2019