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