From 31052875880857f6bbece1c470978a59335d8cd0 Mon Sep 17 00:00:00 2001 From: Young Date: Sun, 27 Oct 2024 19:49:24 +0800 Subject: [PATCH] added api version generation configuration --- .../Extensions/ServiceCollectionExtensions.cs | 62 +++++++++++++++++-- .../Options/ConfigureSwaggerOptions.cs | 42 +++++++++++++ 2 files changed, 99 insertions(+), 5 deletions(-) create mode 100644 src/Infrastructure/Options/ConfigureSwaggerOptions.cs diff --git a/src/Infrastructure/Extensions/ServiceCollectionExtensions.cs b/src/Infrastructure/Extensions/ServiceCollectionExtensions.cs index 692e526..94bcc1e 100644 --- a/src/Infrastructure/Extensions/ServiceCollectionExtensions.cs +++ b/src/Infrastructure/Extensions/ServiceCollectionExtensions.cs @@ -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(this IConfiguration configuration, string sectionName) + where TOptions : OptionsBase + { + return configuration.GetSection(sectionName).Get(); + } + /// /// 配置redis连接服务,以及redis数据访问仓储 /// @@ -30,7 +38,7 @@ public static class ServiceCollectionExtensions { ArgumentNullException.ThrowIfNull(services); ArgumentNullException.ThrowIfNull(configuration); - var redisOptions = configuration.GetSection(RedisOptions.SectionName).Get(); + var redisOptions = configuration.GetOptions(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(); + var audienceOptions = configuration.GetOptions(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(); + var mongoDbOptions = configuration.GetOptions(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(); + var sqlSugarOptions = configuration.GetOptions(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(); + var corsOptions = configuration.GetOptions(CorsOptions.SectionName); if (corsOptions is null || !corsOptions.IsEnable) { return services; @@ -411,4 +419,48 @@ public static class ServiceCollectionExtensions }); return services; } + + /// + /// 配置api版本 + /// + /// + /// + /// + /// + /// + /// + public static IServiceCollection AddDefaultApiVersioning(this IServiceCollection services, + IConfiguration configuration, + Action? configureApiVersioningBuilder = null, + Action? configureApiVersioningOptions = null, + Action? configureApiExplorerOptions = null) + { + ArgumentNullException.ThrowIfNull(services); + ArgumentNullException.ThrowIfNull(configuration); + + var versionOptions = configuration.GetOptions(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(); + return services; + } } \ No newline at end of file diff --git a/src/Infrastructure/Options/ConfigureSwaggerOptions.cs b/src/Infrastructure/Options/ConfigureSwaggerOptions.cs new file mode 100644 index 0000000..6999c67 --- /dev/null +++ b/src/Infrastructure/Options/ConfigureSwaggerOptions.cs @@ -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 +{ + public void Configure(SwaggerGenOptions options) + { + var versionOptions = configuration.GetOptions(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; + } +} \ No newline at end of file