using Microsoft.Extensions.DependencyInjection; using System; using System.Collections.Generic; using System.Threading.Tasks; namespace FastGithub { /// /// 表示中间件创建者 /// public class PipelineBuilder : IPipelineBuilder { private readonly InvokeDelegate completedHandler; private readonly List, InvokeDelegate>> middlewares = new(); /// /// 获取服务提供者 /// public IServiceProvider AppServices { get; } /// /// 中间件创建者 /// /// public PipelineBuilder(IServiceProvider appServices) : this(appServices, context => Task.CompletedTask) { } /// /// 中间件创建者 /// /// /// 完成执行内容处理者 public PipelineBuilder(IServiceProvider appServices, InvokeDelegate completedHandler) { this.AppServices = appServices; this.completedHandler = completedHandler; } /// /// 使用中间件 /// /// /// /// /// public IPipelineBuilder Use() where TMiddleware : class, IMiddleware { var middleware = this.AppServices.GetRequiredService(); return this.Use(middleware.InvokeAsync); } /// /// 使用中间件 /// /// /// /// /// public IPipelineBuilder Use(Func, Task> middleware) { return this.Use(next => context => middleware(context, () => next(context))); } /// /// 使用中间件 /// /// /// public IPipelineBuilder Use(Func, InvokeDelegate> middleware) { this.middlewares.Add(middleware); return this; } /// /// 创建所有中间件执行处理者 /// /// public InvokeDelegate Build() { var handler = this.completedHandler; for (var i = this.middlewares.Count - 1; i >= 0; i--) { handler = this.middlewares[i](handler); } return handler; } /// /// 使用默认配制创建新的PipelineBuilder /// /// public IPipelineBuilder New() { return new PipelineBuilder(this.AppServices, this.completedHandler); } } }