From d7edbf9fb76bd9a4d2f984b4dbe68e13442de80e Mon Sep 17 00:00:00 2001 From: maliming Date: Thu, 27 May 2021 14:31:15 +0800 Subject: [PATCH] Refactor RequestLocalizationOptionsProvider. Resolve #9158 --- .../AbpApplicationBuilderExtensions.cs | 7 +- .../AbpRequestLocalizationMiddleware.cs | 3 +- ...ltAbpRequestLocalizationOptionsProvider.cs | 94 +++++++------------ .../IAbpRequestLocalizationOptionsProvider.cs | 5 +- 4 files changed, 39 insertions(+), 70 deletions(-) diff --git a/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/Builder/AbpApplicationBuilderExtensions.cs b/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/Builder/AbpApplicationBuilderExtensions.cs index a409355ef0..3716c0ad2e 100644 --- a/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/Builder/AbpApplicationBuilderExtensions.cs +++ b/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/Builder/AbpApplicationBuilderExtensions.cs @@ -58,13 +58,8 @@ namespace Microsoft.AspNetCore.Builder .UseMiddleware(); } - public static IApplicationBuilder UseAbpRequestLocalization(this IApplicationBuilder app, - Action optionsAction = null) + public static IApplicationBuilder UseAbpRequestLocalization(this IApplicationBuilder app) { - app.ApplicationServices - .GetRequiredService() - .InitLocalizationOptions(optionsAction); - return app.UseMiddleware(); } diff --git a/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/RequestLocalization/AbpRequestLocalizationMiddleware.cs b/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/RequestLocalization/AbpRequestLocalizationMiddleware.cs index 06f3922b22..7af3779a21 100644 --- a/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/RequestLocalization/AbpRequestLocalizationMiddleware.cs +++ b/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/RequestLocalization/AbpRequestLocalizationMiddleware.cs @@ -23,9 +23,10 @@ namespace Microsoft.AspNetCore.RequestLocalization public async Task InvokeAsync(HttpContext context, RequestDelegate next) { + var requestLocalizationOptions = await _requestLocalizationOptionsProvider.GetLocalizationOptionsAsync(); var middleware = new RequestLocalizationMiddleware( next, - new OptionsWrapper(await _requestLocalizationOptionsProvider.GetLocalizationOptionsAsync()), + new OptionsWrapper(requestLocalizationOptions), _loggerFactory ); diff --git a/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/RequestLocalization/DefaultAbpRequestLocalizationOptionsProvider.cs b/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/RequestLocalization/DefaultAbpRequestLocalizationOptionsProvider.cs index 226c0a9f6c..ba1ee68e99 100644 --- a/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/RequestLocalization/DefaultAbpRequestLocalizationOptionsProvider.cs +++ b/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/RequestLocalization/DefaultAbpRequestLocalizationOptionsProvider.cs @@ -1,8 +1,6 @@ -using System; using System.Collections.Generic; using System.Globalization; using System.Linq; -using System.Threading; using System.Threading.Tasks; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Localization; @@ -11,90 +9,68 @@ using Microsoft.Extensions.Options; using Volo.Abp.DependencyInjection; using Volo.Abp.Localization; using Volo.Abp.Settings; -using Volo.Abp.Threading; namespace Microsoft.AspNetCore.RequestLocalization { - public class DefaultAbpRequestLocalizationOptionsProvider : IAbpRequestLocalizationOptionsProvider, ISingletonDependency + public class DefaultAbpRequestLocalizationOptionsProvider : IAbpRequestLocalizationOptionsProvider, ITransientDependency { - private readonly IServiceScopeFactory _serviceProviderFactory; - private readonly SemaphoreSlim _syncSemaphore; - private Action _optionsAction; - private RequestLocalizationOptions _requestLocalizationOptions; + protected readonly IServiceScopeFactory ServiceProviderFactory; public DefaultAbpRequestLocalizationOptionsProvider(IServiceScopeFactory serviceProviderFactory) { - _serviceProviderFactory = serviceProviderFactory; - _syncSemaphore = new SemaphoreSlim(1, 1); - } - - public void InitLocalizationOptions(Action optionsAction = null) - { - _optionsAction = optionsAction; + ServiceProviderFactory = serviceProviderFactory; } public async Task GetLocalizationOptionsAsync() { - if (_requestLocalizationOptions == null) + using (var serviceScope = ServiceProviderFactory.CreateScope()) { - using (await _syncSemaphore.LockAsync()) - { - if (_requestLocalizationOptions == null) - { - using (var serviceScope = _serviceProviderFactory.CreateScope()) - { - var languageProvider = serviceScope.ServiceProvider.GetRequiredService(); - var settingProvider = serviceScope.ServiceProvider.GetRequiredService(); + var languageProvider = serviceScope.ServiceProvider.GetRequiredService(); + var settingProvider = serviceScope.ServiceProvider.GetRequiredService(); - var languages = await languageProvider.GetLanguagesAsync(); - var defaultLanguage = await settingProvider.GetOrNullAsync(LocalizationSettingNames.DefaultLanguage); + var languages = await languageProvider.GetLanguagesAsync(); + var defaultLanguage = await settingProvider.GetOrNullAsync(LocalizationSettingNames.DefaultLanguage); - var options = !languages.Any() - ? new RequestLocalizationOptions() - : new RequestLocalizationOptions - { - DefaultRequestCulture = DefaultGetRequestCulture(defaultLanguage, languages), - - SupportedCultures = languages - .Select(l => l.CultureName) - .Distinct() - .Select(c => new CultureInfo(c)) - .ToArray(), + var options = !languages.Any() + ? new RequestLocalizationOptions() + : new RequestLocalizationOptions + { + DefaultRequestCulture = await GetDefaultRequestCultureAsync(defaultLanguage, languages), - SupportedUICultures = languages - .Select(l => l.UiCultureName) - .Distinct() - .Select(c => new CultureInfo(c)) - .ToArray() - }; + SupportedCultures = languages + .Select(l => l.CultureName) + .Distinct() + .Select(c => new CultureInfo(c)) + .ToArray(), - foreach (var configurator in serviceScope.ServiceProvider - .GetRequiredService>() - .Value.RequestLocalizationOptionConfigurators) - { - await configurator(serviceScope.ServiceProvider, options); - } + SupportedUICultures = languages + .Select(l => l.UiCultureName) + .Distinct() + .Select(c => new CultureInfo(c)) + .ToArray() + }; - _optionsAction?.Invoke(options); - _requestLocalizationOptions = options; - } - } + foreach (var configurator in serviceScope.ServiceProvider + .GetRequiredService>() + .Value.RequestLocalizationOptionConfigurators) + { + await configurator(serviceScope.ServiceProvider, options); } - } - return _requestLocalizationOptions; + return options; + } } - private static RequestCulture DefaultGetRequestCulture(string defaultLanguage, IReadOnlyList languages) + protected virtual Task GetDefaultRequestCultureAsync(string defaultLanguage, IReadOnlyList languages) { if (defaultLanguage == null) { - var firstLanguage = languages.First(); - return new RequestCulture(firstLanguage.CultureName, firstLanguage.UiCultureName); + var firstLanguage = languages[0]; + return Task.FromResult(new RequestCulture(firstLanguage.CultureName, firstLanguage.UiCultureName)); } var (cultureName, uiCultureName) = LocalizationSettingHelper.ParseLanguageSetting(defaultLanguage); - return new RequestCulture(cultureName, uiCultureName); + return Task.FromResult(new RequestCulture(cultureName, uiCultureName)); } } } diff --git a/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/RequestLocalization/IAbpRequestLocalizationOptionsProvider.cs b/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/RequestLocalization/IAbpRequestLocalizationOptionsProvider.cs index aea718b7cb..ddca07b82f 100644 --- a/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/RequestLocalization/IAbpRequestLocalizationOptionsProvider.cs +++ b/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/RequestLocalization/IAbpRequestLocalizationOptionsProvider.cs @@ -1,13 +1,10 @@ -using System; -using System.Threading.Tasks; +using System.Threading.Tasks; using Microsoft.AspNetCore.Builder; namespace Microsoft.AspNetCore.RequestLocalization { public interface IAbpRequestLocalizationOptionsProvider { - void InitLocalizationOptions(Action optionsAction = null); - Task GetLocalizationOptionsAsync(); } }