如何优雅地从builder.Configuration加载Swagger配置对象?
优化.NET Core多Swagger端点配置方案
核心目标
将6个Swagger端点的Contact、License等元数据从Program.cs硬编码迁移至appsettings.json,简化臃肿的配置代码,同时保留多端点独立的需求。
步骤1:在appsettings.json中定义多端点配置
添加统一配置节点,集中管理所有端点的元数据:
"SwaggerEndpoints": [ { "Name": "service1", "Title": "服务1 API文档", "Version": "v1", "Contact": { "Name": "服务1联系人", "Email": "service1@example.com", "Url": "https://example.com/service1" }, "License": { "Name": "MIT许可证", "Url": "https://opensource.org/licenses/MIT" } }, { "Name": "service2", "Title": "服务2 API文档", "Version": "v1", "Contact": { "Name": "服务2联系人", "Email": "service2@example.com", "Url": "https://example.com/service2" }, "License": { "Name": "Apache 2.0许可证", "Url": "https://www.apache.org/licenses/LICENSE-2.0" } } // 其余4个服务配置按相同格式添加 ]
步骤2:创建强类型配置模型
复用Swashbuckle内置的OpenApiContact和OpenApiLicense类,创建与配置结构匹配的模型:
public class SwaggerEndpointSettings { public string Name { get; set; } public string Title { get; set; } public string Version { get; set; } public OpenApiContact Contact { get; set; } public OpenApiLicense License { get; set; } }
步骤3:在Program.cs中批量加载配置
通过.NET配置绑定读取所有端点信息,循环生成Swagger文档配置,彻底消除重复硬编码:
// 读取配置数组 var swaggerEndpoints = builder.Configuration.GetSection("SwaggerEndpoints") .Get<List<SwaggerEndpointSettings>>(); // 配置Swagger builder.Services.AddSwaggerGen(options => { if (swaggerEndpoints != null) { foreach (var endpoint in swaggerEndpoints) { options.SwaggerDoc(endpoint.Name, new OpenApiInfo { Title = endpoint.Title, Version = endpoint.Version, Contact = endpoint.Contact, License = endpoint.License // 可按需扩展Description、TermsOfService等字段,只需在配置文件中对应添加 }); } } // 保留原有Swagger其他配置(如注释读取、安全方案定义等) });
方案优势
- 配置集中化:所有端点元数据统一在appsettings.json管理,修改无需改动代码
- 代码简洁化:仅需循环逻辑即可完成所有端点配置,避免大量重复的
SwaggerDoc硬编码 - 类型安全:强类型绑定避免手动读取配置的繁琐,同时保证配置数据的正确性
内容的提问来源于stack exchange,提问作者Wim ten Brink
相关产品推荐
相关产品推荐

