Swashbuckle 和 .Net Core Web API – Optional<T> 的展平架构

Swashbuckle and .Net Core Web API – Flatten schema for Optional<T>

我正在使用 Optional 和自定义转换器根据

在资源上实现 PATCH 和 Text.Json

让我们以 DTO 为例:

public class PatchGroupDTO
    {
        public Optional<string?> Name { get; init; }    
        public Optional<string?> NickName{ get; init; }    
    }

Swagger 然后显示 'Example Value'

{
  "name": {
    "value": "string"
  },
  "nickName": {
    "value": "string"
  }
}

和 'Schema':

PatchGroupDTO{
   name     StringOptional{...}
   nickName StringOptional{...}
}

如何实现 Swagger 显示 JSON 的正确输入格式?

{
  "name": "string",
  "nickName": "string"
}

PatchGroupDTO{
   name     string nullable:true
   nickName string nullable:true
}

是否可以总体上展平所有 Optional 类型?

通过使用 MapType 可以很容易地为 T 的特定实例展平 Optional,使用您的 Optional-type 的解决方案是:

services.AddSwaggerGen(c =>
    {
        c.SwaggerDoc("v1", new OpenApiInfo { Title = "Elwis.API", Version = "v1" });
        c.MapType<Optional<Guid?>>(() => new OpenApiSchema { Type = "string", Format = "uuid" });
        c.MapType<Optional<DateTime?>>(() => new OpenApiSchema { Type = "string", Format= "date-time" });
        c.MapType<Optional<string?>>(() => new OpenApiSchema { Type = "string" });
        c.MapType<Optional<bool?>>(() => new OpenApiSchema { Type = "boolean" });
        c.MapType<Optional<int?>>(() => new OpenApiSchema { Type = "integer" });

我的解决方案基于: .

如果您使用可空类型,您还必须映射可空类型,如文章中所述:Swashbuckle MapType<Type> doesn't work with parameters

这篇文章讨论了“扁平化所有可选类型”的一般问题:How to expose a custom generic type as a string in Swagger schema using Swashbuckle.AspNetCore

使用自定义 SchemaFilter 似乎是可行的,但我从未尝试过,建议通过映射程序中所需的具体实例来留下来。