added api version generation configuration

master
Young 6 months ago
parent fb2f1ad072
commit 3105287588

@ -1,4 +1,6 @@
using System.Security.Claims;
using Asp.Versioning;
using Asp.Versioning.ApiExplorer;
using Infrastructure.Filters;
using Infrastructure.HttpUserContext;
using Infrastructure.Options;
@ -20,6 +22,12 @@ namespace Infrastructure.Extensions;
public static class ServiceCollectionExtensions
{
public static TOptions? GetOptions<TOptions>(this IConfiguration configuration, string sectionName)
where TOptions : OptionsBase
{
return configuration.GetSection(sectionName).Get<TOptions>();
}
/// <summary>
/// 配置redis连接服务,以及redis数据访问仓储
/// </summary>
@ -30,7 +38,7 @@ public static class ServiceCollectionExtensions
{
ArgumentNullException.ThrowIfNull(services);
ArgumentNullException.ThrowIfNull(configuration);
var redisOptions = configuration.GetSection(RedisOptions.SectionName).Get<RedisOptions>();
var redisOptions = configuration.GetOptions<RedisOptions>(RedisOptions.SectionName);
if (redisOptions is null || !redisOptions.IsEnable)
{
return services;
@ -73,7 +81,7 @@ public static class ServiceCollectionExtensions
{
ArgumentNullException.ThrowIfNull(services);
ArgumentNullException.ThrowIfNull(configuration);
var audienceOptions = configuration.GetSection(AudienceOptions.SectionName).Get<AudienceOptions>();
var audienceOptions = configuration.GetOptions<AudienceOptions>(AudienceOptions.SectionName);
if (audienceOptions is null || !audienceOptions.IsEnable)
{
return services;
@ -233,7 +241,7 @@ public static class ServiceCollectionExtensions
ArgumentNullException.ThrowIfNull(configuration);
var mongoDbOptions = configuration.GetSection(MongoDbOptions.SectionName).Get<MongoDbOptions>();
var mongoDbOptions = configuration.GetOptions<MongoDbOptions>(MongoDbOptions.SectionName);
if (mongoDbOptions is null || !mongoDbOptions.IsEnable)
{
return services;
@ -277,7 +285,7 @@ public static class ServiceCollectionExtensions
ArgumentNullException.ThrowIfNull(hostEnvironment);
var sqlSugarOptions = configuration.GetSection(SqlSugarOptions.SectionName).Get<SqlSugarOptions>();
var sqlSugarOptions = configuration.GetOptions<SqlSugarOptions>(SqlSugarOptions.SectionName);
if (sqlSugarOptions is null || !sqlSugarOptions.IsEnable)
{
return services;
@ -369,7 +377,7 @@ public static class ServiceCollectionExtensions
{
ArgumentNullException.ThrowIfNull(services);
var corsOptions = configuration.GetSection(CorsOptions.SectionName).Get<CorsOptions>();
var corsOptions = configuration.GetOptions<CorsOptions>(CorsOptions.SectionName);
if (corsOptions is null || !corsOptions.IsEnable)
{
return services;
@ -411,4 +419,48 @@ public static class ServiceCollectionExtensions
});
return services;
}
/// <summary>
/// 配置api版本
/// </summary>
/// <param name="services"></param>
/// <param name="configuration"></param>
/// <param name="configureApiVersioningBuilder"></param>
/// <param name="configureApiVersioningOptions"></param>
/// <param name="configureApiExplorerOptions"></param>
/// <returns></returns>
public static IServiceCollection AddDefaultApiVersioning(this IServiceCollection services,
IConfiguration configuration,
Action<IApiVersioningBuilder>? configureApiVersioningBuilder = null,
Action<ApiVersioningOptions>? configureApiVersioningOptions = null,
Action<ApiExplorerOptions>? configureApiExplorerOptions = null)
{
ArgumentNullException.ThrowIfNull(services);
ArgumentNullException.ThrowIfNull(configuration);
var versionOptions = configuration.GetOptions<VersionOptions>(VersionOptions.SectionName);
if (versionOptions is null || !versionOptions.IsEnable)
{
return services;
}
var builder = services.AddApiVersioning(options =>
{
options.DefaultApiVersion = new ApiVersion(1, 0);
options.AssumeDefaultVersionWhenUnspecified = true;
options.ReportApiVersions = true;
options.ApiVersionReader = ApiVersionReader.Combine(new UrlSegmentApiVersionReader(),
new HeaderApiVersionReader(versionOptions!.HeaderName),
new MediaTypeApiVersionReader(versionOptions!.ParameterName));
configureApiVersioningOptions?.Invoke(options);
}).AddApiExplorer(builder =>
{
builder.GroupNameFormat = "'v'VVV";
builder.SubstituteApiVersionInUrl = true;
configureApiExplorerOptions?.Invoke(builder);
});
configureApiVersioningBuilder?.Invoke(builder);
services.ConfigureOptions<ConfigureSwaggerOptions>();
return services;
}
}

@ -0,0 +1,42 @@
using Asp.Versioning.ApiExplorer;
using Microsoft.OpenApi.Models;
using Swashbuckle.AspNetCore.SwaggerGen;
namespace Infrastructure.Options;
public class ConfigureSwaggerOptions(
IApiVersionDescriptionProvider provider,
IConfiguration configuration)
: IConfigureNamedOptions<SwaggerGenOptions>
{
public void Configure(SwaggerGenOptions options)
{
var versionOptions = configuration.GetOptions<VersionOptions>(VersionOptions.SectionName);
foreach (var description in provider.ApiVersionDescriptions)
{
options.SwaggerDoc(description.GroupName, CreateVersionInfo(description, versionOptions!.SwaggerTitle));
}
}
public void Configure(string? name, SwaggerGenOptions options)
{
Configure(options);
}
private static OpenApiInfo CreateVersionInfo(ApiVersionDescription description, string title)
{
var info = new OpenApiInfo()
{
Title = title,
Version = description.ApiVersion.ToString()
};
if (description.IsDeprecated)
{
info.Description +=
" This API version has been deprecated. Please use one of the new APIs available from the explorer.";
}
return info;
}
}
Loading…
Cancel
Save