C# 自定义生成的模型名称-招摇过市用户界面

C# 自定义生成的模型名称-招摇过市用户界面,c#,swagger,swagger-ui,swashbuckle,swagger-codegen,C#,Swagger,Swagger Ui,Swashbuckle,Swagger Codegen,我试图调整在自动生成的招摇定义中使用的模型的“displayName” 这只会影响Swagger名称,这意味着代码中的名称空间将保持不变,而当从Swagger UI查看模型时,您将看到一个自定义名称 目前,从代码返回的模型名是一个名称空间,看起来像这样:b.c.d.e.f,我想在代码中添加一个属性,并“屏蔽”Swagger文档的名称,这样当生成文档/Swagger定义时,它将显示为CustomSwaggerName 我有一些API(C#)使用的工具包括swashback(首选)和SwaggerG

我试图调整在自动生成的招摇定义中使用的模型的“displayName”

这只会影响Swagger名称,这意味着代码中的名称空间将保持不变,而当从Swagger UI查看模型时,您将看到一个自定义名称

目前,从代码返回的模型名是一个名称空间,看起来像这样:
b.c.d.e.f
,我想在代码中添加一个属性,并“屏蔽”Swagger文档的名称,这样当生成文档/Swagger定义时,它将显示为
CustomSwaggerName

我有一些API(C#)使用的工具包括
swashback
(首选)和
SwaggerGen
,但现在,如果可能的话,我只想让它在这两种工具中工作

我尝试过使用看起来正确的属性:

[ResponseType(typeof(Company)),DisplayName("NewCompany")]
[SwaggerResponse(200,"NewCompany",typeof(object))]
没有运气。我还浏览了git回购协议,希望能找到一些东西

这张图片应该有助于进一步解释我想要实现的目标。


我知道这似乎是一个奇怪的用例,但这是为我们的AWS API网关自动化编写的工具,它将使用招摇定义进行一些比较。

答案是:使用IDocumentFilter:

private class ApplyDocumentFilter_ChangeCompany : IDocumentFilter
{
    public void Apply(SwaggerDocument swaggerDoc, SchemaRegistry schemaRegistry, IApiExplorer apiExplorer)
    {
        if (swaggerDoc.definitions != null)
        {
            swaggerDoc.definitions.Add("Company123", swaggerDoc.definitions["Company"]);
        }
        if (swaggerDoc.paths != null)
        {
            swaggerDoc.paths["/api/Company"].get.responses["200"].schema.@ref = "#/definitions/Company123";
        }
    }
}
代码如下:

以下是最终结果: (占.net核心的帐户:)
我会将类的display属性与自定义的招摇过市模式相结合:

[DisplayName("NewCompany")]
public class Company
{
}
然后在启动时:

services.AddSwaggerGen(c =>
{                     
    c.CustomSchemaIds(x => x.GetCustomAttributes<DisplayNameAttribute>().SingleOrDefault().DisplayName);
});
services.AddSwaggerGen(c=>
{                     
c、 CustomSchemaAIDS(x=>x.GetCustomAttributes().SingleOrDefault().DisplayName);
});

另请参见

无法在.NET Core 3.1中实现此功能,但是
c.CustomSchemaAIDS(x=>x.GetCustomAttributes(false).OfType().FirstOrDefault()?.DisplayName??x.Name)
似乎可以实现(请注意,如果缺少属性,名称将返回到此处的类名)。