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();
}
}
posted @   trykle  阅读(115)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示