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