在學習 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博客文章一鍵轉載插件