如何通过NSwag将字符串字段模拟为枚举类型展示在Swagger中?
实现方案
要让字符串类型的Position字段在Swagger界面中表现得如同枚举类型,你可以通过NSwag的自定义Schema处理器动态修改Swagger文档的元数据,无需修改原模型的字段类型。以下是具体实现步骤:
1. 编写获取数据库中允许值的服务
先实现一个服务,用于从数据库加载Position的所有允许取值:
public interface IPositionConfigService { List<string> GetAllowedPositions(); } public class PositionConfigService : IPositionConfigService { // 替换为实际的数据库查询逻辑 public List<string> GetAllowedPositions() { // 示例:从数据库读取配置的固定值 return new List<string> { "Student", "Teacher" }; } }
2. 实现NSwag的Schema处理器
创建自定义的ISchemaProcessor,在Swagger文档生成时修改Person类的Position字段元数据:
using NSwag.Generation.Processors; using NSwag.Generation.Processors.Contexts; public class PositionSchemaProcessor : ISchemaProcessor { private readonly IPositionConfigService _positionConfigService; public PositionSchemaProcessor(IPositionConfigService positionConfigService) { _positionConfigService = positionConfigService; } public void Process(SchemaProcessorContext context) { // 仅处理Person类型的Schema if (context.Type != typeof(Person)) return; // 找到Position属性对应的Schema配置 if (context.Schema.Properties.TryGetValue(nameof(Person.Position), out var positionProperty)) { var allowedPositions = _positionConfigService.GetAllowedPositions(); // 设置允许的枚举值 positionProperty.Enum.Clear(); foreach (var position in allowedPositions) { positionProperty.Enum.Add(position); } // 保持字段类型为string,同时添加描述说明 positionProperty.Type = NJsonSchema.JsonObjectType.String; positionProperty.Description = $"允许取值:{string.Join(", ", allowedPositions)}"; } } }
3. 注册服务与Schema处理器
在项目的启动配置中(如.NET 6+的Program.cs),注册服务并将自定义处理器添加到NSwag的文档生成配置中:
var builder = WebApplication.CreateBuilder(args); // 注册获取Position配置的服务 builder.Services.AddScoped<IPositionConfigService, PositionConfigService>(); // 添加NSwag文档生成,并注册自定义Schema处理器 builder.Services.AddOpenApiDocument(settings => { var serviceProvider = builder.Services.BuildServiceProvider(); settings.SchemaProcessors.Add(new PositionSchemaProcessor( serviceProvider.GetRequiredService<IPositionConfigService>() )); }); var app = builder.Build(); // 启用Swagger UI app.UseOpenApi(); app.UseSwaggerUi3(); app.Run();
效果说明
完成配置后,Swagger界面中Person模型的Position字段会显示为下拉选择框,列出数据库中配置的所有允许值,和枚举类型的表现完全一致。同时后端仍保持Position为字符串类型,不影响原有业务逻辑的处理。
内容的提问来源于stack exchange,提问作者Peter Poulsen
相关产品推荐
相关产品推荐

