C# 从ASP.NET Core 5.0 API解决方案生成多个招摇过市规范

C# 从ASP.NET Core 5.0 API解决方案生成多个招摇过市规范,c#,asp.net-core,swagger,swagger-ui,C#,Asp.net Core,Swagger,Swagger Ui,我目前正在ASP.NET Core 5.0中设置一个解决方案,其中我有多个包含API控制器的类库项目。这种分离的原因是,解决方案可以访问我雇主数字基础设施中的不同系统。该解决方案包含一个实际的API项目,用于组合所有这些模块 我正在使用Swagger和SwaggerUI为API项目中的codegen生成文档和规范,它可以按预期工作。在此API项目中,Swagger的配置如下: Startup.cs: public void配置服务(IServiceCollection服务) { Register

我目前正在ASP.NET Core 5.0中设置一个解决方案,其中我有多个包含API控制器的类库项目。这种分离的原因是,解决方案可以访问我雇主数字基础设施中的不同系统。该解决方案包含一个实际的API项目,用于组合所有这些模块

我正在使用Swagger和SwaggerUI为API项目中的codegen生成文档和规范,它可以按预期工作。在此API项目中,Swagger的配置如下:

Startup.cs:

public void配置服务(IServiceCollection服务)
{
RegisterServicesFromModules(this.Configuration,GetModules());
//API版本控制
{
services.addapVersioning(versioningOptions=>
{
versioningOptions.ReportApiVersions=true;
添加(新版本ByNamespaceConvention());
});
services.AddVersionedApiExplorer(VersionExploreProptions=>
{
versionExplorerOptions.GroupNameFormat=“'v'VVV”;
VersionExplorerProptions.SubstituteApprovisionInUrl=true;
});
}
//开放式API
{
services.AddTransient();
services.AddTransient();
services.addswagggen();
}
}
(代码段顶部的
RegisterServicesFromModules()
方法是一个自定义的扩展方法,它调用其他模块的DI容器并注册其中定义的服务)

ConfigureSwaggerUIOptions.cs:

公共类配置SwaggerUIOptions:IConfigureOptions
{
专用只读IApiVersionDescriptionProvider\u APIPProvider;
私有只读字符串_appName;
/// 
///初始化类的新实例。
/// 
///API提供程序。
公共配置SwaggerUIOptions(IApiVersionDescriptionProvider apiProvider)
{
_apiProvider=apiProvider;
_appName=Assembly.GetExecutionGassembly().GetName()?.Name??string.Empty;
}
/// 
公共void配置(虚张声势选项)
{
选项=选项??抛出新的ArgumentNullException(选项的名称);
options.RoutePrefix=“docs”;
options.DocumentTitle=$“\'{this.\u appName}\'documentation”;
options.DocExpansion(DocExpansion.List);
选项。DefaultModelExpandDepth(0);
foreach(此.u apiProvider.ApiVersionDescriptions中的var apiVersionDescription)
{
options.SwaggerEndpoint($“/swagger/{apiVersionDescription.GroupName}/swagger.json”,apiVersionDescription.GroupName);
}
}
}
最后,配置swagger genoptions.cs:

public类配置SwaggerGenOptions:IConfigureOptions
{
专用只读IApiVersionDescriptionProvider\u APIPProvider;
私有只读字符串_appName;
/// 
///初始化类的新实例。
/// 
///API版本描述。
公共配置SwaggerGenOptions(IApiVersionDescriptionProvider apiProvider)
{
_apiProvider=apiProvider??抛出新的ArgumentNullException(nameof(apiProvider));
_appName=Assembly.GetExecutionGassembly().GetName()?.Name??string.Empty;
}
/// 
公共void配置(招摇过市选项)
{
选项=选项??抛出新的ArgumentNullException(选项的名称);
foreach(此.u apiProvider.ApiVersionDescriptions中的var apiVersionDescription)
{
options.SwaggerDoc(apiVersionDescription.GroupName,this.createInfoforapivision(apiVersionDescription));
如果(!string.IsNullOrWhiteSpace(this.\u appName))
{
includexmlcoments(Path.Combine(AppContext.BaseDirectory,$“{this._appName}.xml”);
}
options.OperationFilter();
}
}
私有OpenApiInfo CreateInfoForApiVersion(ApiVersionDescription ApiVersionDescription)
{
var info=new openapinfo()
{
Title=这个。\u appName,
Version=apiVersionDescription.ApiVersion.ToString(),
Description=$“针对\'{this.\u appName}\'的OpenAPI文档”,
Contact=new OpenApiContact(){Name=”“,Email=”“},
};
if(apiVersionDescription.IsDeprecated)
{
info.Description+=“此API版本已被弃用。”;
}
退货信息;
}
}
上述文件成功地在指定的URL处生成了一个swagger.json文件和文档接口。但是,正如我所说的,这将生成整个API的总体文档。但是,一些要与API通信的应用程序只需要访问一个模块,而不需要为整个API生成调用

为了实现这一点,我尝试在每个模块的不同URL处分别生成多个swagger.json文件,其中只包含关于特定模块的信息。正如我所说,每个单独的模块都包含自己的DI容器,该容器由
RegisterServicesFromModules
扩展方法调用。因此,对于特定模块,DI将如下所示:

DmsApiModule.cs:

公共类DmsApiModule:IModule,IModuleInjector
{
/// 
public void ConfigureServices(IServiceCollection服务集合、IConfiguration配置)
{
RegisterServicesFromModules(配置,GetModules()