aspnetcore 中间件执行顺序

发布时间 2023-07-10 18:32:41作者: trykle

这是用例和返回结果
输出的结果是对称的

当我第一眼看着这个操作时满脑子不解:

  • 一个方法是怎么扳成2截来使用的
  • 要是我来做肯定让用户传2个委托

完整实现代码

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();
  }
}