用.Net Core控制檯模擬一個ASP.Net Core的管道模型
阿新 • • 發佈:2019-02-13
在我的上幾篇文章中降到了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的管道模型的基本原理。