From 97dc9c0a1ba1d9dfeb2f5ef13175f314ddfcdaf2 Mon Sep 17 00:00:00 2001 From: maliming Date: Thu, 5 Sep 2019 09:49:42 +0800 Subject: [PATCH] Delayed initialization of the language. --- .../AbpApplicationBuilderExtensions.cs | 49 +----------- .../AbpRequestLocalizationMiddleware.cs | 26 +++++++ ...ltAbpRequestLocalizationOptionsProvider.cs | 76 +++++++++++++++++++ .../IAbpRequestLocalizationOptionsProvider.cs | 12 +++ 4 files changed, 117 insertions(+), 46 deletions(-) create mode 100644 framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/RequestLocalization/AbpRequestLocalizationMiddleware.cs create mode 100644 framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/RequestLocalization/DefaultAbpRequestLocalizationOptionsProvider.cs create mode 100644 framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/RequestLocalization/IAbpRequestLocalizationOptionsProvider.cs 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 c139c49ba1..ffb4a9d5cc 100644 --- a/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/Builder/AbpApplicationBuilderExtensions.cs +++ b/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/Builder/AbpApplicationBuilderExtensions.cs @@ -4,6 +4,7 @@ using System.Globalization; using System.Linq; using JetBrains.Annotations; using Microsoft.AspNetCore.Localization; +using Microsoft.AspNetCore.RequestLocalization; using Microsoft.Extensions.DependencyInjection; using Volo.Abp; using Volo.Abp.AspNetCore.Auditing; @@ -50,40 +51,8 @@ namespace Microsoft.AspNetCore.Builder public static IApplicationBuilder UseAbpRequestLocalization(this IApplicationBuilder app, Action optionsAction = null) { - IReadOnlyList languages; - string defaultLanguage; - - using (var scope = app.ApplicationServices.CreateScope()) - { - var languageProvider = scope.ServiceProvider.GetRequiredService(); - languages = AsyncHelper.RunSync(() => languageProvider.GetLanguagesAsync()); - - var settingProvider = scope.ServiceProvider.GetRequiredService(); - defaultLanguage = AsyncHelper.RunSync(() => 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(), - - SupportedUICultures = languages - .Select(l => l.UiCultureName) - .Distinct() - .Select(c => new CultureInfo(c)) - .ToArray() - }; - - optionsAction?.Invoke(options); - - return app.UseRequestLocalization(options); + app.ApplicationServices.GetRequiredService().InitLocalizationOptions(optionsAction); + return app.UseMiddleware(); } public static IApplicationBuilder UseAbpExceptionHandling(this IApplicationBuilder app) @@ -96,17 +65,5 @@ namespace Microsoft.AspNetCore.Builder app.Properties[ExceptionHandlingMiddlewareMarker] = true; return app.UseMiddleware(); } - - private static RequestCulture DefaultGetRequestCulture(string defaultLanguage, IReadOnlyList languages) - { - if (defaultLanguage == null) - { - var firstLanguage = languages.First(); - return new RequestCulture(firstLanguage.CultureName, firstLanguage.UiCultureName); - } - - var (cultureName, uiCultureName) = LocalizationSettingHelper.ParseLanguageSetting(defaultLanguage); - return new RequestCulture(cultureName, uiCultureName); - } } } diff --git a/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/RequestLocalization/AbpRequestLocalizationMiddleware.cs b/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/RequestLocalization/AbpRequestLocalizationMiddleware.cs new file mode 100644 index 0000000000..21fa6d96f3 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/RequestLocalization/AbpRequestLocalizationMiddleware.cs @@ -0,0 +1,26 @@ +using System.Threading.Tasks; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Localization; +using Microsoft.Extensions.Options; +using Volo.Abp.DependencyInjection; + +namespace Microsoft.AspNetCore.RequestLocalization +{ + public class AbpRequestLocalizationMiddleware : IMiddleware, ITransientDependency + { + private readonly IAbpRequestLocalizationOptionsProvider _requestLocalizationOptionsProvider; + + public AbpRequestLocalizationMiddleware( + IAbpRequestLocalizationOptionsProvider requestLocalizationOptionsProvider) + { + _requestLocalizationOptionsProvider = requestLocalizationOptionsProvider; + } + + public async Task InvokeAsync(HttpContext context, RequestDelegate next) + { + var options = Options.Create(_requestLocalizationOptionsProvider.GetLocalizationOptions()); + var middleware = new RequestLocalizationMiddleware(next, options); + await middleware.Invoke(context); + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/RequestLocalization/DefaultAbpRequestLocalizationOptionsProvider.cs b/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/RequestLocalization/DefaultAbpRequestLocalizationOptionsProvider.cs new file mode 100644 index 0000000000..dcc31a0048 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/RequestLocalization/DefaultAbpRequestLocalizationOptionsProvider.cs @@ -0,0 +1,76 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Localization; +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 + { + private readonly ILanguageProvider _languageProvider; + private readonly ISettingProvider _settingProvider; + private Lazy _lazyRequestLocalizationOptions; + + public DefaultAbpRequestLocalizationOptionsProvider(ILanguageProvider languageProvider, + ISettingProvider settingProvider) + { + _languageProvider = languageProvider; + _settingProvider = settingProvider; + } + + public void InitLocalizationOptions(Action optionsAction = null) + { + _lazyRequestLocalizationOptions = new Lazy(() => + { + var languages = AsyncHelper.RunSync(_languageProvider.GetLanguagesAsync); + var defaultLanguage = AsyncHelper.RunSync(() => + _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(), + + SupportedUICultures = languages + .Select(l => l.UiCultureName) + .Distinct() + .Select(c => new CultureInfo(c)) + .ToArray() + }; + + optionsAction?.Invoke(options); + return options; + }, true); + } + + public RequestLocalizationOptions GetLocalizationOptions() + { + return _lazyRequestLocalizationOptions.Value; + } + + private static RequestCulture DefaultGetRequestCulture(string defaultLanguage, IReadOnlyList languages) + { + if (defaultLanguage == null) + { + var firstLanguage = languages.First(); + return new RequestCulture(firstLanguage.CultureName, firstLanguage.UiCultureName); + } + + var (cultureName, uiCultureName) = LocalizationSettingHelper.ParseLanguageSetting(defaultLanguage); + return new RequestCulture(cultureName, uiCultureName); + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/RequestLocalization/IAbpRequestLocalizationOptionsProvider.cs b/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/RequestLocalization/IAbpRequestLocalizationOptionsProvider.cs new file mode 100644 index 0000000000..5179bb48ee --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/RequestLocalization/IAbpRequestLocalizationOptionsProvider.cs @@ -0,0 +1,12 @@ +using System; +using Microsoft.AspNetCore.Builder; + +namespace Microsoft.AspNetCore.RequestLocalization +{ + public interface IAbpRequestLocalizationOptionsProvider + { + void InitLocalizationOptions(Action optionsAction = null); + + RequestLocalizationOptions GetLocalizationOptions(); + } +} \ No newline at end of file