using System; using YYApi.Helpers; using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.DependencyInjection; using Microsoft.OpenApi.Models; using Swashbuckle.AspNetCore.SwaggerUI; using YYApi.Middlewares; namespace YYApi { /// /// 加入系统的扩展信息 /// public static class Extensions { //**********快捷添加************** /// /// 添加整个YYAPI,同时增加CORS规则 /// /// /// /// /// public static IServiceCollection AddYYApi(this IServiceCollection builder, string title, string description = null) { return builder.AddYYAuth().AddYYDoc(title, description).AddCors().AddYYUpload(); } /// /// 使用所有YYApi自定义中间件 /// /// /// /// /// /// public static IApplicationBuilder UseYYApi(this IApplicationBuilder builder, string title = "API文档", params SubmitMethod[] submitMethods) { return builder.UseYYException().UseYYDoc(title, submitMethods).UseMiddleware().UseCors(x => x.AllowAnyHeader().AllowAnyMethod().AllowAnyOrigin()).UseYYUpload(); } //*********组件快捷方式************* /// /// 添加自定义授权认证中间价 /// /// /// public static IServiceCollection AddYYAuth(this IServiceCollection builder) { return builder.AddScoped(); } /// /// 添加Base64上传组件 /// /// /// public static IServiceCollection AddYYUpload(this IServiceCollection builder) { return builder.AddSingleton(); } /// /// 添加Api文档服务 /// /// /// 文档标题 /// 文档描述 /// public static IServiceCollection AddYYDoc(this IServiceCollection builder, string title, string description = null) { return builder.AddSwaggerGen(x => { x.SwaggerDoc("api", new OpenApiInfo { Title = title, Description = description }); x.EnableAnnotations(); x.AddSecurityRequirement(new OpenApiSecurityRequirement { { new OpenApiSecurityScheme { Reference = new OpenApiReference {Type = ReferenceType.SecurityScheme, Id = "HeaderToken"} }, new[] {"readAccess", "writeAccess"} } }); x.AddSecurityDefinition("HeaderToken", new OpenApiSecurityScheme { Name = "Token", In = ParameterLocation.Header }); }); } /// /// 使用异常中间价扩展 /// /// /// public static IApplicationBuilder UseYYException(this IApplicationBuilder builder) { return builder.UseMiddleware(); } /// /// 配置上传组件必须 /// /// /// public static IApplicationBuilder UseYYUpload(this IApplicationBuilder builder) { return builder.UseStaticFiles(); } /// /// 使用文档UI /// /// /// 文档标题 /// 文档支持的提交方式(如果不指定,默认使用POST) /// public static IApplicationBuilder UseYYDoc(this IApplicationBuilder builder, string title, params SubmitMethod[] submitMethods) { return builder.UseSwagger(x => x.RouteTemplate = "docs/{documentName}.json").UseSwaggerUI(x => { x.RoutePrefix = "docs"; x.DocumentTitle = title; x.SwaggerEndpoint("/docs/api.json", name: title); x.EnableValidator(); if (submitMethods.Length > 0) { x.SupportedSubmitMethods(submitMethods); } else { x.SupportedSubmitMethods(SubmitMethod.Post); } x.DisplayRequestDuration(); }); } /// /// 同时使用Api文档和异常处理中间件 /// /// /// 文档标题 /// API提交方式定义 /// public static IApplicationBuilder UseYYDocEx(this IApplicationBuilder builder, string title = "API文档", params SubmitMethod[] submitMethods) { return builder.UseYYException().UseYYDoc(title, submitMethods); } /// /// 使用自定义认证中间件(依赖IDistributedCache) /// /// /// public static IApplicationBuilder UseYYAuth(this IApplicationBuilder builder) { return builder.UseMiddleware(); } } }