diff --git a/src/SimplCommerce.WebHost/Extensions/ServiceCollectionExtensions.cs b/src/SimplCommerce.WebHost/Extensions/ServiceCollectionExtensions.cs index 0e27f34a6..7894c18e3 100644 --- a/src/SimplCommerce.WebHost/Extensions/ServiceCollectionExtensions.cs +++ b/src/SimplCommerce.WebHost/Extensions/ServiceCollectionExtensions.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Diagnostics; +using System.IdentityModel.Tokens.Jwt; using System.IO; using System.Linq; using System.Net; @@ -11,13 +12,13 @@ using Microsoft.AspNetCore.Authentication.Cookies; using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.AspNetCore.Authentication.OAuth; -using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Mvc.ApplicationParts; -using Microsoft.Extensions.Localization; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Localization; using SimplCommerce.Infrastructure; using SimplCommerce.Infrastructure.Modules; using SimplCommerce.Infrastructure.Web.ModelBinders; @@ -25,7 +26,6 @@ using SimplCommerce.Module.Core.Extensions; using SimplCommerce.Module.Core.Models; using SimplCommerce.WebHost.IdentityServer; -using System.IdentityModel.Tokens.Jwt; namespace SimplCommerce.WebHost.Extensions { @@ -226,6 +226,29 @@ public static IServiceCollection AddCustomizedDataStore(this IServiceCollection return services; } + /// + /// Discovers and configures all modules in the application by finding and initializing their module initializers. + /// + /// The to add module services to. + /// The same service collection so that multiple calls can be chained. + public static IServiceCollection ConfigureModules(this IServiceCollection services) + { + foreach (var module in GlobalConfiguration.Modules) + { + var moduleInitializerType = module.Assembly.GetTypes() + .FirstOrDefault(t => typeof(IModuleInitializer).IsAssignableFrom(t)); + + if (moduleInitializerType != null && moduleInitializerType != typeof(IModuleInitializer)) + { + var moduleInitializer = (IModuleInitializer)Activator.CreateInstance(moduleInitializerType); + services.AddSingleton(typeof(IModuleInitializer), moduleInitializer); + moduleInitializer.ConfigureServices(services); + } + } + + return services; + } + private static void TryLoadModuleAssembly(string moduleFolderPath, ModuleInfo module) { const string binariesFolderName = "bin"; diff --git a/src/SimplCommerce.WebHost/Program.cs b/src/SimplCommerce.WebHost/Program.cs index 520f2f073..590ab3920 100644 --- a/src/SimplCommerce.WebHost/Program.cs +++ b/src/SimplCommerce.WebHost/Program.cs @@ -1,5 +1,4 @@ using System; -using System.Linq; using System.Text.Encodings.Web; using System.Text.Unicode; using Microsoft.AspNetCore.Builder; @@ -48,7 +47,6 @@ void ConfigureService() builder.Services.AddScoped(); builder.Services.AddCustomizedLocalization(); - builder.Services.AddCustomizedMvc(GlobalConfiguration.Modules); builder.Services.Configure( options => { options.ViewLocationExpanders.Add(new ThemeableViewLocationExpander()); }); @@ -60,18 +58,7 @@ void ConfigureService() builder.Services.AddTransient(); builder.Services.AddAntiforgery(options => options.HeaderName = "X-XSRF-Token"); builder.Services.AddCloudscribePagination(); - - foreach (var module in GlobalConfiguration.Modules) - { - var moduleInitializerType = module.Assembly.GetTypes() - .FirstOrDefault(t => typeof(IModuleInitializer).IsAssignableFrom(t)); - if ((moduleInitializerType != null) && (moduleInitializerType != typeof(IModuleInitializer))) - { - var moduleInitializer = (IModuleInitializer)Activator.CreateInstance(moduleInitializerType); - builder.Services.AddSingleton(typeof(IModuleInitializer), moduleInitializer); - moduleInitializer.ConfigureServices(builder.Services); - } - } + builder.Services.ConfigureModules(); builder.Services.AddMediatR(cfg => cfg.RegisterServicesFromAssembly(typeof(Program).Assembly));