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

/ 默认分类 / 没有评论 / 129 浏览
        <link rel="stylesheet" href="http://csdnimg.cn/release/phoenix/production/htmledit_views-920a74d4ec.css">
        <div class="htmledit_views">
            

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

本文由 iBlogs 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为: 2019/10/07 03:41