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));