如何解决泛型的 Swashbuckle/Swagger -UI 模型命名问题?

问题描述 投票:0回答:2

我想清理我的 webapi 的 swagger ui 中的模型名称。

问题是,当我在端点上定义响应类型时,并且该类型是通用的,它的命名方式是,如果使用像 NSwag 这样的 swagger-gen 工具,模型会得到最糟糕的名称, (因为它们基于 swagger,所以我想定义模型的命名方式)。

这是响应属性:

[ProducesResponseType(typeof(BulkUpsertResponse<AccountingCode>), StatusCodes.Status200OK)]

这是最终的名称:

Company.IntegrationApi.Api.Models.Responses.BulkUpsertResponse1[[Company.IntegrationApi.Api.Models.AccountingParameters.AccountingCode, Company.IntegrationApi.Api, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]

NSwag 的目标是:

BulkUpsertResponse_1OfOfAccountingCodeAndApiAnd_0AndCulture_neutralAndPublicKeyToken_null 

我想要的名字是:

BulkUpsertResponse<AccountingCode>

我试图找到一个属性或标签来定义名称,但将泛型变成“硬类型”是不可行的,因为它有数百种用途。

如何准确指定名称,或者可以使用哪些解决方法来解决我的问题?

c# generics swagger-ui swashbuckle swashbuckle.aspnetcore
2个回答
1
投票

添加 Swashbuckle.Swagger NuGet 包。 然后在你的 init 方法中使用

CustomSchemaIds(i => i.FriendlyId(true));

参见下面的示例:D

using Swashbuckle.Swagger;
///then in configure services..

services.AddSwaggerGen(c =>
                {
                    c.SwaggerDoc("v1", new OpenApiInfo
                    {
                        Version = "v1",
                        Title = "Your API",
                        Description = "Interfaces available for API",
                    });
                    c.CustomSchemaIds(x => x.FullName);
                    c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
                    {
                        Description = "JWT Authorization header using the Bearer scheme. Example: \"Authorization: Bearer {token}\"",
                        Name = "Authorization",
                        In = ParameterLocation.Header,
                        Type = SecuritySchemeType.ApiKey,
                        Scheme = "Bearer"
                    });
                    var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
                    var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
                    c.IncludeXmlComments(xmlPath);
                    c.CustomSchemaIds(i => i.FriendlyId(true));


                });

0
投票

这对我有用,因为当前的 Swagger 中似乎不再存在 Friendship 方法:

c.CustomSchemaIds(i => i.FriendlyId(true));
(与daveBM的答案相同)

然后这个:

public static string FriendlyId(this Type type, bool fullyQualified = false)
    {
        var typeName = fullyQualified
            ? type.FullNameSansTypeArguments().Replace("+", ".")
            : type.Name;

        if (!type.GetTypeInfo().IsGenericType)
        {
            return typeName;
        }

        var genericArgumentIds = type.GetGenericArguments()
            .Select(t => t.FriendlyId(fullyQualified))
            .ToArray();

        return new StringBuilder(typeName)
            .Replace(string.Format("`{0}", genericArgumentIds.Count()), string.Empty)
            .Append(string.Format("[{0}]", string.Join(",", genericArgumentIds).TrimEnd(',')))
            .ToString();
    }
© www.soinside.com 2019 - 2024. All rights reserved.