zoukankan      html  css  js  c++  java
  • 模拟.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

  • 相关阅读:
    Hamler 0.2 正式发布
    Xamarin.Forms 解决ListView高度问题
    Xamarin.Forms中DependencyService的使用
    Xamarin.Forms Android 底部导航栏
    修改UITabBar样式 TintColor 和 Selected Tab Images in Xamarin.Forms iOS
    Xamarin.iOS中使用MvvmLight框架
    Xamarin.iOS 代码中添加约束练习
    Xamarin.Android 手势密码
    UWP 手势密码实现
    Xamarin.iOS 手势密码
  • 原文地址:https://www.cnblogs.com/slwangzi/p/13149675.html
Copyright © 2011-2022 走看看