• 模拟.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

  • 相关阅读:
    ShoreWall不错的Linux防火墙 规格严格
    数据挖掘 规格严格
    GLIBC 规格严格
    Solr/Lucene Wiki 规格严格
    Zope??? 规格严格
    用Apache htpasswd管理SVN帐户
    假装
    拼包函数及网络封包的异常处理(含代码)
    云计算
    云计算
  • 原文地址:https://www.cnblogs.com/slwangzi/p/13149675.html
Copyright © 2020-2023  润新知