这是用例和返回结果
输出的结果是对称的
当我第一眼看着这个操作时满脑子不解:
- 一个方法是怎么扳成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();
}
}