feat: 实现自动分组功能

This commit is contained in:
陈淳
2023-12-11 18:43:36 +08:00
parent 769a6a9c63
commit 01825ad87f
39 changed files with 83 additions and 3424 deletions

View File

@@ -9,18 +9,22 @@ namespace Yi.Framework.AspNetCore.Microsoft.AspNetCore.Builder
app.UseSwagger();
app.UseSwaggerUI(c =>
{
if (swaggerModels.Length == 0)
{
c.SwaggerEndpoint("/swagger/v1/swagger.json", "Yi.Framework");
}
else
{
foreach (var k in swaggerModels)
{
// 配置 Swagger UI 面板链接,添加的顺序,就是排序
c.SwaggerEndpoint("/swagger/default/swagger.json", "default");
c.SwaggerEndpoint("/swagger/rbac/swagger.json", "rbac");
c.SwaggerEndpoint(k.Url, k.Name);
}
}
//if (swaggerModels.Length == 0)
//{
// c.SwaggerEndpoint("/swagger/v1/swagger.json", "Yi.Framework");
//}
//else
//{
// foreach (var k in swaggerModels)
// {
// c.SwaggerEndpoint(k.Url, k.Name);
// }
//}
});
return app;

View File

@@ -1,6 +1,9 @@
using Microsoft.Extensions.DependencyInjection;
using Microsoft.AspNetCore.Mvc.Controllers;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using Microsoft.OpenApi.Models;
using Swashbuckle.AspNetCore.SwaggerGen;
using Volo.Abp.AspNetCore.Mvc;
namespace Yi.Framework.AspNetCore.Microsoft.Extensions.DependencyInjection
{
@@ -8,10 +11,38 @@ namespace Yi.Framework.AspNetCore.Microsoft.Extensions.DependencyInjection
{
public static IServiceCollection AddYiSwaggerGen<Program>(this IServiceCollection services, Action<SwaggerGenOptions>? action)
{
var serviceProvider = services.BuildServiceProvider();
var mvcOptions = serviceProvider.GetRequiredService<IOptions<AbpAspNetCoreMvcOptions>>();
var mvcSettings = mvcOptions.Value.ConventionalControllers.ConventionalControllerSettings.Where(x => x.RemoteServiceName != "default").DistinctBy(x => x.RemoteServiceName);
services.AddAbpSwaggerGen(
options =>
{
options.DocInclusionPredicate((docName, description) => true);
// 配置分组,还需要去重
foreach (var setting in mvcSettings)
{
options.SwaggerDoc(setting.RemoteServiceName, new OpenApiInfo { Title = setting.RemoteServiceName, Version = "v1" });
}
options.SwaggerDoc("default", new OpenApiInfo { Title = "default", Version = "v1" });
// 根据分组名称过滤 API 文档
options.DocInclusionPredicate((docName, apiDesc) =>
{
if (apiDesc.ActionDescriptor is ControllerActionDescriptor controllerActionDescriptor)
{
var settingOrNull = mvcSettings.Where(x => x.Assembly == controllerActionDescriptor.ControllerTypeInfo.Assembly).FirstOrDefault();
if (settingOrNull is not null)
{
return docName == settingOrNull.RemoteServiceName;
}
}
return docName == "default";
});
//options.DocInclusionPredicate((docName, description) => true);
options.CustomSchemaIds(type => type.FullName);
var basePath = Path.GetDirectoryName(typeof(Program).Assembly.Location);
if (basePath is not null)