时间: 2020-09-5|tag:24次围观|0 条评论

在我的上几篇文章中降到了asp.net core的管道模型,为了更清楚地理解asp.net core的管道,再网上学习了.Net Core控制台应用程序对其的模拟,以加深映像,同时,供大家学习参考。

首先,新建一控制台应用程序。注意是.Net Core的控制台应用程序。

用.Net Core控制台模拟一个ASP.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();        }

我们查看一下运行结果:

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

这就是ASP.net core的管道模型的基本原理。

文章转载于:https://www.cnblogs.com/CoderAyu/p/8490122.html

原著是一个有趣的人,若有侵权,请通知删除

本博客所有文章如无特别注明均为原创。
复制或转载请以超链接形式注明转自起风了,原文地址《用.Net Core控制台模拟一个ASP.Net Core的管道模型
   

还没有人抢沙发呢~