在我的上几篇文章中降到了asp.net core的管道模型,为了更清楚地理解asp.net core的管道,再网上学习了.Net Core控制台应用程序对其的模拟,以加深映像,同时,供大家学习参考。
首先,新建一控制台应用程序。注意是.Net Core的控制台应用程序。
然后新建一个Context类,以模拟ASP.net core中的context类,然后再Context类中添加一个Write方法。
using System; using System.Collections.Generic; using System.Text; using System.Threading.Tasks.Dataflow; namespace MyPipleLine { public class Context { public void Write(string msg) { Console.WriteLine(msg); } } }
然后新建一个RequestDelegate类,类中声明一个Requestdelegate的委托。
using System; using System.Collections.Generic; using System.Text; using System.Threading.Tasks; namespace MyPipleLine { public delegate Task RequestDelegate(Context context); }
该RequestDelegate接收一个Context类型的值,返回的是Task类型。
然后,回到Pragrame.cs类中,
添加一个List,该List中保存了各个(中间件)。
public static List<Func<RequestDelegate, RequestDelegate>> _list = new List<Func<RequestDelegate, RequestDelegate>>();
添加一个Use方法。
public static void Use(Func<RequestDelegate, RequestDelegate> middleWare) { _list.Add(middleWare); }
再ASP.NET Core应用程序中,我们经常再Startup.cs中的Config中使用app.Use()方法,这里的Use()就是模仿该app.Use()的方法。我们知道,Use()的方法有一种是添加一个传入类型是RequestDelegate 传出也是RequestDelegate的委托。 该委托,就是我们常常被称为的中间件。
然后回到Main方法中。
static void Main(string[] args) { Use(next => //往Use中添加一个传入类型为RequestDelegate,传出类型也为RequestDelegate的lambda表达式, { return context => { context.Write("1"); //该委托中执行了context的中的方法。 return next.Invoke(context); //并继续执行下一个 }; }); Use(next => { return context => //同上 { context.Write("2"); return next.Invoke(context); }; }); _list.Reverse(); //把_list中的内容颠倒一下顺序,因为如果不颠倒下,后先执行最后加入的中间件,后执行最先加入中间件。 RequestDelegate end = (context) => { context.Write("end"); return Task.CompletedTask; }; foreach (var middleware in _list) { end = middleware.Invoke(end); //把_list中的各个中间件“附加”到end委托上。 } end.Invoke(new Context()); //调用end委托 Console.ReadLine(); }
我们查看一下运行结果:
这就是ASP.net core的管道模型的基本原理。