Swashbuckle 6(Swagger)中的Web模型与ASP.NET Core Web API

vbopmzt1  于 2023-11-18  发布在  .NET
关注(0)|答案(3)|浏览(121)

我使用Swashbuckle 6(Swagger)和ASP.NET Core Web API。我的模型有DTO作为后缀,例如,

public class TestDTO {
    public int Code { get; set; }
    public string Message { get; set; }
}

字符串
如何在生成的文档中将其重命名为“Test”?我尝试添加一个带名称的DataContract属性,但没有帮助。

[HttpGet]
public IActionResult Get() {
  //... create List<TestDTO>
  return Ok(list);
}

7vux5j2d

7vux5j2d1#

将其删除.类似于这里的答案:Swashbuckle重命名模型中的数据类型
唯一的区别是属性现在被称为CustomSchemaIds而不是SchemaId:

options.CustomSchemaIds(schemaIdStrategy);

字符串
而不是查看DataContract属性,我只是让它删除“DTO”:

private static string schemaIdStrategy(Type currentClass) {
    string returnedValue = currentClass.Name;
    if (returnedValue.EndsWith("DTO"))
        returnedValue = returnedValue.Replace("DTO", string.Empty);
    return returnedValue;
}

lb3vh1jj

lb3vh1jj2#

来自@ultravelocity的答案对我不太起作用。错误就像“'Response' 1' is already used”。我不知道确切的原因是什么,但我猜这是关于继承/泛型的(因为我返回了一个分页的响应)。
基于@ultravelocity的问题和答案,我为.net 5开发了一个可能的解决方案(可能也适用于asp.net核心2.c/3.d),它可以解决这个问题。
步骤:
1.像@ultravelocity一样添加customSchemaId-Strategy

a.CustomSchemaIds(schemaIdStrategy);

字符串
1.添加自定义策略功能

private static string schemaIdStrategy(Type currentClass)
{
    string customSuffix = "Response";
    var tmpDisplayName = currentClass.ShortDisplayName().Replace("<", "").Replace(">", "");
    var removedSuffix = tmpDisplayName.EndsWith(customSuffix) ? tmpDisplayName.Substring(0, tmpDisplayName.Length - customSuffix.Length) : tmpDisplayName;
    return removedSuffix;
}

lqfhib0f

lqfhib0f3#

如果任何人只对更改默认模式id感兴趣,他们可以使用以下实现:

private static string DefaultSchemaIdSelector(Type modelType)
{
    if (!modelType.IsConstructedGenericType) return modelType.Name.Replace("[]", "Array");

    var prefix = modelType.GetGenericArguments()
        .Select(genericArg => DefaultSchemaIdSelector(genericArg))
        .Aggregate((previous, current) => previous + current);

    return prefix + modelType.Name.Split('`').First();
}

字符串
然后像这样在其上继续构建

options.CustomSchemaIds(type => DefaultSchemaIdSelector(type).Replace("DTO", string.Empty));

相关问题