Refactoring

This commit is contained in:
hishamco 2020-09-30 00:07:00 +03:00
parent f83c1b1741
commit 2e2d46996a
10 changed files with 130 additions and 75 deletions

View File

@ -7,7 +7,6 @@ using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Oqtane.Infrastructure;
using Oqtane.Infrastructure.Localization;
using Oqtane.Models;
using Oqtane.Modules;
using Oqtane.Shared;
@ -21,12 +20,14 @@ namespace Oqtane.Controllers
private readonly IConfigurationRoot _config;
private readonly IInstallationManager _installationManager;
private readonly IDatabaseManager _databaseManager;
private readonly ILocalizationManager _localizationManager;
public InstallationController(IConfigurationRoot config, IInstallationManager installationManager, IDatabaseManager databaseManager)
public InstallationController(IConfigurationRoot config, IInstallationManager installationManager, IDatabaseManager databaseManager, ILocalizationManager localizationManager)
{
_config = config;
_installationManager = installationManager;
_databaseManager = databaseManager;
_localizationManager = localizationManager;
}
// POST api/<controller>
@ -76,7 +77,7 @@ namespace Oqtane.Controllers
var binFolder = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
// Get the satellite assemblies
foreach (var culture in LocalizationSettings.SupportedCultures)
foreach (var culture in _localizationManager.GetSupportedCultures())
{
if (culture == Constants.DefaultCulture)
{

View File

@ -4,44 +4,13 @@ using System.Linq;
using System.Reflection;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Oqtane.Infrastructure;
using Oqtane.Infrastructure.Localization;
namespace Oqtane.Extensions
{
public static class ApplicationBuilderExtensions
{
private static readonly string DefaultCultureKey = "Localization:DefaultCulture";
private static readonly string SupportedCulturesKey = "Localization:SupportedCultures";
public static IApplicationBuilder UseOqtaneLocalization(this IApplicationBuilder app)
{
var configuration = app.ApplicationServices.GetService<IConfiguration>();
var defaultCulture = configuration.GetSection(DefaultCultureKey).Value;
var supportedCultures = configuration.GetSection(SupportedCulturesKey).Get<string[]>();
if (defaultCulture == CultureInfo.InstalledUICulture.Name)
{
LocalizationSettings.DefaultCulture = defaultCulture;
}
if (supportedCultures.Length > 0)
{
LocalizationSettings.SupportedCultures.AddRange(supportedCultures);
}
CultureInfo.CurrentUICulture = new CultureInfo(defaultCulture);
app.UseRequestLocalization(options => {
options.SetDefaultCulture(defaultCulture)
.AddSupportedUICultures(supportedCultures)
.AddSupportedUICultures(supportedCultures);
});
return app;
}
public static IApplicationBuilder ConfigureOqtaneAssemblies(this IApplicationBuilder app, IWebHostEnvironment env)
{
var startUps = AppDomain.CurrentDomain
@ -55,5 +24,22 @@ namespace Oqtane.Extensions
return app;
}
public static IApplicationBuilder UseOqtaneLocalization(this IApplicationBuilder app)
{
var localizationManager = app.ApplicationServices.GetService<ILocalizationManager>();
var defaultCulture = localizationManager.GetDefaultCulture();
var supportedCultures = localizationManager.GetSupportedCultures();
CultureInfo.CurrentUICulture = new CultureInfo(defaultCulture);
app.UseRequestLocalization(options => {
options.SetDefaultCulture(defaultCulture)
.AddSupportedUICultures(supportedCultures)
.AddSupportedUICultures(supportedCultures);
});
return app;
}
}
}

View File

@ -5,7 +5,6 @@ using System.Reflection;
using System.Runtime.Loader;
using Microsoft.Extensions.Hosting;
using Oqtane.Infrastructure;
using Oqtane.Infrastructure.Localization;
using Oqtane.Modules;
using Oqtane.Services;
using Oqtane.Shared;
@ -134,7 +133,10 @@ namespace Microsoft.Extensions.DependencyInjection
AssemblyLoadContext.Default.Resolving += ResolveDependencies;
foreach (var culture in LocalizationSettings.SupportedCultures)
using (var serviceScope = ServiceActivator.GetScope())
{
var localizationManager = serviceScope.ServiceProvider.GetService<ILocalizationManager>();
foreach (var culture in localizationManager.GetSupportedCultures())
{
if (culture == Constants.DefaultCulture)
{
@ -167,6 +169,7 @@ namespace Microsoft.Extensions.DependencyInjection
}
}
}
}
private static Assembly ResolveDependencies(AssemblyLoadContext context, AssemblyName name)
{

View File

@ -0,0 +1,9 @@
namespace Oqtane.Infrastructure
{
public interface ILocalizationManager
{
string GetDefaultCulture();
string[] GetSupportedCultures();
}
}

View File

@ -0,0 +1,9 @@
namespace Oqtane.Infrastructure
{
public class LocalizationOptions
{
public string DefaultCulture { get; set; }
public string[] SupportedCultures { get; set; }
}
}

View File

@ -1,18 +0,0 @@
using System.Collections.Generic;
using Oqtane.Shared;
namespace Oqtane.Infrastructure.Localization
{
public static class LocalizationSettings
{
static LocalizationSettings()
{
DefaultCulture = Constants.DefaultCulture;
SupportedCultures = new List<string> { DefaultCulture };
}
public static string DefaultCulture { get; set; }
public static List<string> SupportedCultures { get; }
}
}

View File

@ -0,0 +1,29 @@
using System.Collections;
using Microsoft.Extensions.Options;
using Oqtane.Shared;
namespace Oqtane.Infrastructure
{
public class LocalizationManager : ILocalizationManager
{
private static readonly string DefaultCulture = Constants.DefaultCulture;
private static readonly string[] SupportedCultures = new[] { DefaultCulture };
private readonly LocalizationOptions _localizationOptions;
public LocalizationManager(IOptions<LocalizationOptions> localizationOptions)
{
_localizationOptions = localizationOptions.Value;
}
public string GetDefaultCulture()
=> string.IsNullOrEmpty(_localizationOptions.DefaultCulture)
? DefaultCulture
: _localizationOptions.DefaultCulture;
public string[] GetSupportedCultures()
=> _localizationOptions.SupportedCultures.IsNullOrEmpty()
? SupportedCultures
: _localizationOptions.SupportedCultures;
}
}

View File

@ -128,6 +128,8 @@ namespace Oqtane
.AddSignInManager()
.AddDefaultTokenProviders();
services.Configure<LocalizationOptions>(Configuration.GetSection("Localization"));
services.Configure<IdentityOptions>(options =>
{
// Password settings
@ -190,6 +192,7 @@ namespace Oqtane
services.AddTransient<ISettingRepository, SettingRepository>();
services.AddTransient<ILogRepository, LogRepository>();
services.AddTransient<ILogManager, LogManager>();
services.AddTransient<ILocalizationManager, LocalizationManager>();
services.AddTransient<IJobRepository, JobRepository>();
services.AddTransient<IJobLogRepository, JobLogRepository>();
services.AddTransient<INotificationRepository, NotificationRepository>();
@ -199,6 +202,9 @@ namespace Oqtane
services.AddTransient<ISqlRepository, SqlRepository>();
services.AddTransient<IUpgradeManager, UpgradeManager>();
// TODO: Check if there's a better way instead of building service provider
ServiceActivator.Configure(services.BuildServiceProvider());
// load the external assemblies into the app domain, install services
services.AddOqtane(_runtime);

View File

@ -0,0 +1,8 @@
namespace System.Collections
{
public static class EnumerableExtensions
{
public static bool IsNullOrEmpty(this IEnumerable source)
=> source == null || source.GetEnumerator().MoveNext() == false;
}
}

View File

@ -0,0 +1,22 @@
using System;
using Microsoft.Extensions.DependencyInjection;
namespace Oqtane.Shared
{
public static class ServiceActivator
{
private static IServiceProvider _serviceProvider = null;
public static void Configure(IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
}
public static IServiceScope GetScope(IServiceProvider serviceProvider = null)
{
var provider = serviceProvider ?? _serviceProvider;
return provider?.GetRequiredService<IServiceScopeFactory>().CreateScope();
}
}
}