1. 程式人生 > >用.Net Core控制檯模擬一個ASP.Net Core的管道模型

用.Net Core控制檯模擬一個ASP.Net Core的管道模型

在我的上幾篇文章中降到了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的管道模型的基本原理。