using System;
using YYApi.Helpers;
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.OpenApi.Models;
using Swashbuckle.AspNetCore.SwaggerUI;
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(x => x.AddDefaultPolicy(po => po.AllowAnyHeader().AllowAnyMethod().AllowAnyOrigin()));
}
///
/// 使用所有YYApi自定义中间件
///
///
///
///
///
public static IApplicationBuilder UseYYApi(this IApplicationBuilder builder, string title = "API文档",
params SubmitMethod[] submitMethods)
{
return builder.UseYYException().UseYYDoc(title, submitMethods).UseMiddleware();
}
//*********组件快捷方式*************
///
/// 添加自定义授权认证中间价
///
///
///
public static IServiceCollection AddYYAuth(this IServiceCollection builder)
{
return builder.AddScoped();
}
///
/// 添加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();
}
///
/// 使用文档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();
}
}
}