Verzování - verisoftCZ/verisoft-framework GitHub Wiki

#Verzování

Controllery vždy verzujeme a to za pomoci Asp.Versioning NuGet. Pokud verzujeme závislost, lze ji injectnout pomocí atributu [FromKeyedServices(version)].

using Asp.Versioning;

namespace Verisoft.DemoApi.Host.Controllers.V1;

[ApiController]
[ApiVersion("1.0")]
[Route("v{v:apiVersion}/[controller]")]
public class DemoController([FromKeyedServices("v1")] IDemoService demoService)
{
    // ... endpoints
}

Registrace verzovaných service a repository probíhá pomocí extension metod např. TryAddKeyedScoped

private static void RegisterServices(IServiceCollection serviceCollection)
{
    serviceCollection.TryAddKeyedScoped<IDemoService, Application.Services.V1.DemoService>("v1");
    serviceCollection.TryAddKeyedScoped<IDemoService, Application.Services.V2.DemoService>("v2");
}

Registrace verzování do aplikace - použití v Program.cs

var apiVersioningBuilder = builder.Services.AddApiVersioning(options =>
{
    options.ReportApiVersions = true;
    options.AssumeDefaultVersionWhenUnspecified = true;
    options.DefaultApiVersion = new ApiVersion(1, 0);
    options.ApiVersionReader = ApiVersionReader.Combine(new UrlSegmentApiVersionReader());
});

apiVersioningBuilder.AddApiExplorer(options =>
{
    options.GroupNameFormat = "'v'V";
    options.SubstituteApiVersionInUrl = true;
});
builder.Services.AddSwaggerGen(options =>
{
    options.SwaggerDoc("v1", new OpenApiInfo
    {
        Version = "v1",
        // ... other OpenApiInfo
    });
    options.OperationFilter<SwaggerDefaultValues>();
    // ... other filters and options
});
app.UseSwaggerUI(options =>
{
    var descriptions = app.DescribeApiVersions();
    foreach (var description in descriptions)
    {
        options.SwaggerEndpoint($"/swagger/{description.GroupName}/swagger.json", description.GroupName.ToUpperInvariant());
    }
    // ... other options
});

Preferované je přidat verzování pomocí metody Verisoft.Core.AspNet.OpenApi.AddVerisoftOpenApiSpecification() s možností parametrizovat jednotlivé options

serviceCollection.AddVerisoftOpenApiSpecification(
    apiVersioningOptions: options =>
    {
        options.DefaultApiVersion = new ApiVersion(2, 0);
    },
    apiExplorerOptions: options =>
    {
        options.GroupNameFormat = "'v'V";
    },
    swaggerOptions: options =>
    {
        options.SchemaFilter<NullableObjectSchemaFilter>("Verisoft");
    },
    apiInfo: info =>
    {
        info.Title = "Verisoft Demo.API";
        info.Description = "Verisoft demo API for showcase purposes";
        info.Contact = new OpenApiContact { Name = "Jack Szabo", Email = "[email protected]" };
        info.License = new OpenApiLicense { Name = "MIT", Url = new Uri(MitLicenceUrl) };
    });

nebo metodu Verisoft.Core.AspNet.OpenApi.AddVerisoftApiVersioning(), která má jen parametry pro apiVersioningOptions a apiExplorerOptions

⚠️ **GitHub.com Fallback** ⚠️