在Swagger中自动生成对SwaggerDoc的调用

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllers(); //this replaces these services.AddMvcCore().AddApiExplorer();
        ...
        services.AddSwaggerGen(options =>
        {
            // make this automatic ???
            options.SwaggerDoc("v1",new Info { Version = "v1",Title = "v1 API",Description = "v1 API Description" });
            options.SwaggerDoc("v2",new Info { Version = "v2",Title = "v2 API",Description = "v2 API Description" });
            ...
            options.DocInclusionPredicate((version,desc) =>
            {
                var versions = desc.CustomAttributes().OfType<ApiVersionAttribute>().SelectMany(attr => attr.Versions).ToArray();
                var maps = desc.CustomAttributes().OfType<MapToApiVersionAttribute>().SelectMany(attr => attr.Versions).ToArray();
                return versions.Any(v => $"v{v.ToString()}" == version) && (!maps.Any() || maps.Any(v => $"v{v.ToString()}" == version));
            });
        });
    }

此代码按预期工作。但是,可以使对SwaggerDoc的调用自动化,以使代码更加通用吗?在DocInclusionPredicate参数的desc中,可以收集版本。

sasuke1028 回答:在Swagger中自动生成对SwaggerDoc的调用

在您使用ApiVersionAttribute时,我假设您正在使用Microsoft.AspNetCore.Mvc.Versioning nuget包。程序包提供了名为IApiVersionDescriptionProvider的服务。该服务提供所有检测到的API版本的枚举。然后,您可以将它们自动添加为swagger-doc。

services.AddSwaggerGen(options =>
{
    // you can use the IApiVersionDescriptionProvider
    var provider = services.BuildServiceProvider()
        .GetRequiredService<IApiVersionDescriptionProvider>();

    foreach (var description in provider.ApiVersionDescriptions)
    {
        var info = new Info
        {
            Title = $"My API {description.ApiVersion}",Version = description.ApiVersion.ToString(),Contact = new Contact
            {
                Email = "info@mydomain.com",Name = "Foo Bar",Url = "https://thecatapi.com/"
            }
        };

        options.SwaggerDoc(description.GroupName,info);
    }

    // instead of manually adding your versions
    //options.SwaggerDoc("v1",new Info { Version = "v1",Title = "v1 API",Description = "v1 API Description" });
    //options.SwaggerDoc("v2",new Info { Version = "v2",Title = "v2 API",Description = "v2 API Description" });
    options.DocInclusionPredicate((version,desc) =>
    {
        var versions = desc.CustomAttributes().OfType<ApiVersionAttribute>().SelectMany(attr => attr.Versions).ToArray();
        var maps = desc.CustomAttributes().OfType<MapToApiVersionAttribute>().SelectMany(attr => attr.Versions).ToArray();
        return versions.Any(v => $"v{v.ToString()}" == version) && (!maps.Any() || maps.Any(v => $"v{v.ToString()}" == version));
    });
});
本文链接:https://www.f2er.com/3144619.html

大家都在问