zoukankan      html  css  js  c++  java
  • 用.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的管道模型的基本原理。

  • 相关阅读:
    Objective-C /iphone开发基础:分类(category,又称类别)
    Objective-C,复合类,Composition
    [置顶] Objective-C开发环境介绍以及Cocoa,以及第一个程序
    链表的创建与插入练习
    c++算法联系,冒泡排序,bubble sort,插入排序,insert sort,
    封装,capsulation,&&继承,Inheritance,&&多态,polymorphism
    inheritance,菱形继承, 虚继承,virtual
    c++中运算符重载,+,-,--,+=,-=,*,/,*=,/=,
    [置顶] 运算符重载,浅拷贝(logical copy) ,vs, 深拷贝(physical copy),三大件(bigthree problem)
    [置顶] c++类的继承(inheritance)
  • 原文地址:https://www.cnblogs.com/CoderAyu/p/8490122.html
Copyright © 2011-2022 走看看