From bcb6c81e439900a9ffa68539af8141d4ff5afda8 Mon Sep 17 00:00:00 2001 From: hishamco Date: Sat, 3 Oct 2020 22:41:48 +0300 Subject: [PATCH] Avoid Building ServiceProvider in ConfigureServices --- .../OqtaneServiceCollectionExtensions.cs | 54 +++++++++---------- Oqtane.Server/Startup.cs | 19 ++++--- 2 files changed, 38 insertions(+), 35 deletions(-) diff --git a/Oqtane.Server/Extensions/OqtaneServiceCollectionExtensions.cs b/Oqtane.Server/Extensions/OqtaneServiceCollectionExtensions.cs index 4090be8d..0b94b088 100644 --- a/Oqtane.Server/Extensions/OqtaneServiceCollectionExtensions.cs +++ b/Oqtane.Server/Extensions/OqtaneServiceCollectionExtensions.cs @@ -15,10 +15,10 @@ namespace Microsoft.Extensions.DependencyInjection { public static class OqtaneServiceCollectionExtensions { - public static IServiceCollection AddOqtane(this IServiceCollection services, Runtime runtime) + public static IServiceCollection AddOqtane(this IServiceCollection services, Runtime runtime, string[] supportedCultures) { LoadAssemblies(); - LoadSatelliteAssemblies(); + LoadSatelliteAssemblies(supportedCultures); services.AddOqtaneServices(runtime); return services; @@ -122,7 +122,7 @@ namespace Microsoft.Extensions.DependencyInjection } } - private static void LoadSatelliteAssemblies() + private static void LoadSatelliteAssemblies(string[] supportedCultures) { var assemblies = AppDomain.CurrentDomain.GetAssemblies(); var assemblyPath = Path.GetDirectoryName(Assembly.GetEntryAssembly()?.Location); @@ -133,39 +133,35 @@ namespace Microsoft.Extensions.DependencyInjection AssemblyLoadContext.Default.Resolving += ResolveDependencies; - using (var serviceScope = ServiceActivator.GetScope()) + foreach (var culture in supportedCultures) { - var localizationManager = serviceScope.ServiceProvider.GetService(); - foreach (var culture in localizationManager.GetSupportedCultures()) + if (culture == Constants.DefaultCulture) { - if (culture == Constants.DefaultCulture) + continue; + } + + var assembliesFolder = new DirectoryInfo(Path.Combine(assemblyPath, culture)); + foreach (var assemblyFile in assembliesFolder.EnumerateFiles(Constants.StalliteAssemblyExtension)) + { + AssemblyName assemblyName; + try { + assemblyName = AssemblyName.GetAssemblyName(assemblyFile.FullName); + } + catch + { + Console.WriteLine($"Not Satellite Assembly : {assemblyFile.Name}"); continue; } - var assembliesFolder = new DirectoryInfo(Path.Combine(assemblyPath, culture)); - foreach (var assemblyFile in assembliesFolder.EnumerateFiles(Constants.StalliteAssemblyExtension)) + try { - AssemblyName assemblyName; - try - { - assemblyName = AssemblyName.GetAssemblyName(assemblyFile.FullName); - } - catch - { - Console.WriteLine($"Not Satellite Assembly : {assemblyFile.Name}"); - continue; - } - - try - { - Assembly assembly = AssemblyLoadContext.Default.LoadFromStream(new MemoryStream(File.ReadAllBytes(assemblyFile.FullName))); - Console.WriteLine($"Loaded : {assemblyName}"); - } - catch (Exception e) - { - Console.WriteLine($"Failed : {assemblyName}\n{e}"); - } + Assembly assembly = AssemblyLoadContext.Default.LoadFromStream(new MemoryStream(File.ReadAllBytes(assemblyFile.FullName))); + Console.WriteLine($"Loaded : {assemblyName}"); + } + catch (Exception e) + { + Console.WriteLine($"Failed : {assemblyName}\n{e}"); } } } diff --git a/Oqtane.Server/Startup.cs b/Oqtane.Server/Startup.cs index 98d43bcd..396e6602 100644 --- a/Oqtane.Server/Startup.cs +++ b/Oqtane.Server/Startup.cs @@ -1,4 +1,5 @@ using System; +using System.Collections; using System.IO; using System.Linq; using System.Net.Http; @@ -26,11 +27,14 @@ namespace Oqtane { public class Startup { - public IConfigurationRoot Configuration { get; } + private static readonly string[] DefaultSupportedCultures = new[] { Constants.DefaultCulture }; + private string _webRoot; private Runtime _runtime; private bool _useSwagger; + public IConfigurationRoot Configuration { get; } + public Startup(IWebHostEnvironment env) { var builder = new ConfigurationBuilder() @@ -128,7 +132,10 @@ namespace Oqtane .AddSignInManager() .AddDefaultTokenProviders(); - services.Configure(Configuration.GetSection("Localization")); + var localizationSection = Configuration.GetSection("Localization"); + var localizationOptions = localizationSection.Get(); + + services.Configure(localizationSection); services.Configure(options => { @@ -202,11 +209,11 @@ namespace Oqtane services.AddTransient(); services.AddTransient(); - // 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); + services.AddOqtane(_runtime, + localizationOptions.SupportedCultures.IsNullOrEmpty() + ? DefaultSupportedCultures + : localizationOptions.SupportedCultures); services.AddMvc() .AddNewtonsoftJson()