• 模拟.net core中间件执行顺序


    using System;
    using System.Collections.Generic;
    
    namespace ConsoleApp2
    {
        class Program
        {
            static void Main(string[] args)
            {
                App app = new App();
                app.Use(next => {
                    Console.WriteLine(1);
                    return act => {
                        Console.WriteLine("1-before");
                        //其它逻辑代码...
                        Console.WriteLine(act.Url);
                        next.Invoke(act);
                        //其它逻辑代码...
                        Console.WriteLine("1-after");
                    };
                });
                app.Use(next => {
                    Console.WriteLine(2);
                    return act => {
                        Console.WriteLine("2-before");
                        //其它逻辑代码...
                        next.Invoke(act);
                        //其它逻辑代码...
                        Console.WriteLine("2-after");
                    };
                });
                app.Use(next => {
                    Console.WriteLine(3);
                    return act => {
                        Console.WriteLine("3-before");
                        //其它逻辑代码...
                        next.Invoke(act);
                        //其它逻辑代码...
                        Console.WriteLine("3-after");
                    };
                });
    
                HttpContext httpContext = new HttpContext();
    
                Action<HttpContext> act = app.Builder();
                act.Invoke(httpContext);
    
                Console.ReadLine();
            }
        }
    
    
        public class App
        {
            List<Func<Action<HttpContext>, Action<HttpContext>>> list = new List<Func<Action<HttpContext>, Action<HttpContext>>>();
    
            public void Use(Func<Action<HttpContext>, Action<HttpContext>> func)
            {
                list.Add(func);
            }
    
            public Action<HttpContext> Builder()
            {
                //当集合为空时执行,相当于.net core 下的404
                Action<HttpContext> action = act => { Console.WriteLine("404"); };
                list.Reverse();
                foreach (Func<Action<HttpContext>, Action<HttpContext>> item in list)
                {
                    action = item.Invoke(action);
                }
                return action;
            }
        }
    
        public class HttpContext
        {
            public int Id { get; set; }
            public string Url { get; set; } = "http://www.baidu.com";
            public string Host { get; set; } = "www.baidu.com";
        }
    }

    执行结果:1->2->3  ->  3->2->1

  • 相关阅读:
    Flex 和JavaScript 交互(带参)
    dos创建快捷方式
    IE的onunload事件里调用DWR
    使用VS2008开发OPC客户端程序
    实时库GEHistorian的一些问题记录
    SQL SERVER中,把一个表中的数据导入到另一个表中
    SQLSERVER 触发器
    SqlServer数据复制出现的问题与处理
    了解Log.Debug 或 log4net
    VS2008应用程序部署时将Framework3.5打包到安装包中
  • 原文地址:https://www.cnblogs.com/slwangzi/p/13149675.html
Copyright © 2020-2023  润新知