用.Net Core控制台模拟一个ASP.Net Core的管道模型

时间:2022-05-11
本文章向大家介绍用.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的管道模型的基本原理。