开篇先上一张中间件原理图,帮助大家对管道机制形成一个直观的认识
下面我们实现一个简单的管道机制,以此为例深入理解管道机制的原理
1. 首先定义一个委托,该委托接收一个上下文对象,返回值为Task,代码实现如下
public delegate Task RequestDelegate(HttpContext context);
2. 实现创建管道的类
首先解释一个名词——中间件(Middleware),中间件是被组装成一个应用程序管道来处理请求和响应的软件组件,
该例子中中间件的实现是一个Func<RequestDelegate, RequestDelegate>的委托
管道类的实现代码如下
public class ApplicationBuilder : IApplicationBuilder { private IList<Func<RequestDelegate, RequestDelegate>> middlewares = new List<Func<RequestDelegate, RequestDelegate>>(); public RequestDelegate Build() { RequestDelegate seed = context => Task.Run(() => {}); return middlewares.Reverse().Aggregate(seed, (next, current) => current(next));//管道机制的重难点 } public IApplicationBuilder Use(Func<RequestDelegate, RequestDelegate> middleware) { middlewares.Add(middleware); return this; } }
3. 创建管道
首先创建一个中间件,中间件的实现代码如下
Func<RequestDelegate, RequestDelegate> middleware = next => { return context => { //logic return next(context);//next }; };
实例化管道类,并添加一个或多个中间件,创建管道并执行
IApplicationBuilder app = new ApplicationBuilder(); app.Use(middleware);//添加中间件 app.Build()(context);//创建管道并运行