Refactor RequestLocalizationOptionsProvider.

Resolve #9158
pull/9170/head
maliming 4 years ago
parent e3d290301e
commit d7edbf9fb7

@ -58,13 +58,8 @@ namespace Microsoft.AspNetCore.Builder
.UseMiddleware<AbpCorrelationIdMiddleware>(); .UseMiddleware<AbpCorrelationIdMiddleware>();
} }
public static IApplicationBuilder UseAbpRequestLocalization(this IApplicationBuilder app, public static IApplicationBuilder UseAbpRequestLocalization(this IApplicationBuilder app)
Action<RequestLocalizationOptions> optionsAction = null)
{ {
app.ApplicationServices
.GetRequiredService<IAbpRequestLocalizationOptionsProvider>()
.InitLocalizationOptions(optionsAction);
return app.UseMiddleware<AbpRequestLocalizationMiddleware>(); return app.UseMiddleware<AbpRequestLocalizationMiddleware>();
} }

@ -23,9 +23,10 @@ namespace Microsoft.AspNetCore.RequestLocalization
public async Task InvokeAsync(HttpContext context, RequestDelegate next) public async Task InvokeAsync(HttpContext context, RequestDelegate next)
{ {
var requestLocalizationOptions = await _requestLocalizationOptionsProvider.GetLocalizationOptionsAsync();
var middleware = new RequestLocalizationMiddleware( var middleware = new RequestLocalizationMiddleware(
next, next,
new OptionsWrapper<RequestLocalizationOptions>(await _requestLocalizationOptionsProvider.GetLocalizationOptionsAsync()), new OptionsWrapper<RequestLocalizationOptions>(requestLocalizationOptions),
_loggerFactory _loggerFactory
); );

@ -1,8 +1,6 @@
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Globalization; using System.Globalization;
using System.Linq; using System.Linq;
using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Localization; using Microsoft.AspNetCore.Localization;
@ -11,90 +9,68 @@ using Microsoft.Extensions.Options;
using Volo.Abp.DependencyInjection; using Volo.Abp.DependencyInjection;
using Volo.Abp.Localization; using Volo.Abp.Localization;
using Volo.Abp.Settings; using Volo.Abp.Settings;
using Volo.Abp.Threading;
namespace Microsoft.AspNetCore.RequestLocalization namespace Microsoft.AspNetCore.RequestLocalization
{ {
public class DefaultAbpRequestLocalizationOptionsProvider : IAbpRequestLocalizationOptionsProvider, ISingletonDependency public class DefaultAbpRequestLocalizationOptionsProvider : IAbpRequestLocalizationOptionsProvider, ITransientDependency
{ {
private readonly IServiceScopeFactory _serviceProviderFactory; protected readonly IServiceScopeFactory ServiceProviderFactory;
private readonly SemaphoreSlim _syncSemaphore;
private Action<RequestLocalizationOptions> _optionsAction;
private RequestLocalizationOptions _requestLocalizationOptions;
public DefaultAbpRequestLocalizationOptionsProvider(IServiceScopeFactory serviceProviderFactory) public DefaultAbpRequestLocalizationOptionsProvider(IServiceScopeFactory serviceProviderFactory)
{ {
_serviceProviderFactory = serviceProviderFactory; ServiceProviderFactory = serviceProviderFactory;
_syncSemaphore = new SemaphoreSlim(1, 1);
}
public void InitLocalizationOptions(Action<RequestLocalizationOptions> optionsAction = null)
{
_optionsAction = optionsAction;
} }
public async Task<RequestLocalizationOptions> GetLocalizationOptionsAsync() public async Task<RequestLocalizationOptions> GetLocalizationOptionsAsync()
{ {
if (_requestLocalizationOptions == null) using (var serviceScope = ServiceProviderFactory.CreateScope())
{ {
using (await _syncSemaphore.LockAsync()) var languageProvider = serviceScope.ServiceProvider.GetRequiredService<ILanguageProvider>();
{ var settingProvider = serviceScope.ServiceProvider.GetRequiredService<ISettingProvider>();
if (_requestLocalizationOptions == null)
{
using (var serviceScope = _serviceProviderFactory.CreateScope())
{
var languageProvider = serviceScope.ServiceProvider.GetRequiredService<ILanguageProvider>();
var settingProvider = serviceScope.ServiceProvider.GetRequiredService<ISettingProvider>();
var languages = await languageProvider.GetLanguagesAsync(); var languages = await languageProvider.GetLanguagesAsync();
var defaultLanguage = await settingProvider.GetOrNullAsync(LocalizationSettingNames.DefaultLanguage); var defaultLanguage = await settingProvider.GetOrNullAsync(LocalizationSettingNames.DefaultLanguage);
var options = !languages.Any() var options = !languages.Any()
? new RequestLocalizationOptions() ? new RequestLocalizationOptions()
: new RequestLocalizationOptions : new RequestLocalizationOptions
{ {
DefaultRequestCulture = DefaultGetRequestCulture(defaultLanguage, languages), DefaultRequestCulture = await GetDefaultRequestCultureAsync(defaultLanguage, languages),
SupportedCultures = languages
.Select(l => l.CultureName)
.Distinct()
.Select(c => new CultureInfo(c))
.ToArray(),
SupportedUICultures = languages SupportedCultures = languages
.Select(l => l.UiCultureName) .Select(l => l.CultureName)
.Distinct() .Distinct()
.Select(c => new CultureInfo(c)) .Select(c => new CultureInfo(c))
.ToArray() .ToArray(),
};
foreach (var configurator in serviceScope.ServiceProvider SupportedUICultures = languages
.GetRequiredService<IOptions<AbpRequestLocalizationOptions>>() .Select(l => l.UiCultureName)
.Value.RequestLocalizationOptionConfigurators) .Distinct()
{ .Select(c => new CultureInfo(c))
await configurator(serviceScope.ServiceProvider, options); .ToArray()
} };
_optionsAction?.Invoke(options); foreach (var configurator in serviceScope.ServiceProvider
_requestLocalizationOptions = options; .GetRequiredService<IOptions<AbpRequestLocalizationOptions>>()
} .Value.RequestLocalizationOptionConfigurators)
} {
await configurator(serviceScope.ServiceProvider, options);
} }
}
return _requestLocalizationOptions; return options;
}
} }
private static RequestCulture DefaultGetRequestCulture(string defaultLanguage, IReadOnlyList<LanguageInfo> languages) protected virtual Task<RequestCulture> GetDefaultRequestCultureAsync(string defaultLanguage, IReadOnlyList<LanguageInfo> languages)
{ {
if (defaultLanguage == null) if (defaultLanguage == null)
{ {
var firstLanguage = languages.First(); var firstLanguage = languages[0];
return new RequestCulture(firstLanguage.CultureName, firstLanguage.UiCultureName); return Task.FromResult(new RequestCulture(firstLanguage.CultureName, firstLanguage.UiCultureName));
} }
var (cultureName, uiCultureName) = LocalizationSettingHelper.ParseLanguageSetting(defaultLanguage); var (cultureName, uiCultureName) = LocalizationSettingHelper.ParseLanguageSetting(defaultLanguage);
return new RequestCulture(cultureName, uiCultureName); return Task.FromResult(new RequestCulture(cultureName, uiCultureName));
} }
} }
} }

@ -1,13 +1,10 @@
using System; using System.Threading.Tasks;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Builder;
namespace Microsoft.AspNetCore.RequestLocalization namespace Microsoft.AspNetCore.RequestLocalization
{ {
public interface IAbpRequestLocalizationOptionsProvider public interface IAbpRequestLocalizationOptionsProvider
{ {
void InitLocalizationOptions(Action<RequestLocalizationOptions> optionsAction = null);
Task<RequestLocalizationOptions> GetLocalizationOptionsAsync(); Task<RequestLocalizationOptions> GetLocalizationOptionsAsync();
} }
} }

Loading…
Cancel
Save