aspnetcore 中间件执行顺序
下方的用例模拟了aspnetcore中间件的使用场景
输出的结果是对称的,最先注册的委托上半部分最先执行,下半部分最后执行
当我第一眼看着这个操作时满脑子不解:
- 一个方法是怎么扳成2截来使用的
- 要是我来做肯定让用户传2个委托
完整实现代码
核心的操作在于CreateNext
的乾坤大罗移,将多个委托揉搓成了一个委托,并在最后一步触发
class Program { static List<Action<Action>> middlewareList = new List<Action<Action>>(); static void Use(Action<Action> middleware) { middlewareList.Add(middleware); } static void Run(Action<Action> middleware) { middlewareList.Add(middleware); Action<Action> next = null; for (int i = middlewareList.Count - 1; i >= 0; i--) { var currentMiddleware = middlewareList[i]; next = CreateNext(currentMiddleware, next); } next.Invoke(() => { }); } static Action<Action> CreateNext(Action<Action> currentMiddleware, Action<Action> next) { return (Action continuation) => { currentMiddleware.Invoke(() => { next?.Invoke(continuation); }); }; } static void Main(string[] args) { Use((next) => { Console.WriteLine("-1 BEGIN"); next.Invoke(); Console.WriteLine("-1 END"); }); Use((next) => { Console.WriteLine("--2 BEGIN"); next.Invoke(); Console.WriteLine("--2 END"); }); Use((next) => { Console.WriteLine("---3 BEGIN"); next.Invoke(); Console.WriteLine("---3 END"); }); Run(ctx => { Console.WriteLine("----RUN"); }); Console.ReadLine(); } }
分类:
Asp.Net Core
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步