using Autofac; using eSuite.Core.Clock; using Microsoft.Extensions.Configuration; using System.Reflection; namespace e_suite.DependencyInjection; public sealed class ModuleConfig { public List Modules { get; set; } = new(); } public class ESuiteModule : Autofac.Module { protected override void Load(ContainerBuilder builder) { base.Load(builder); builder.RegisterType().As().SingleInstance(); RegisterAllModuleIocRegistrations(builder); } protected static void RegisterAllModuleIocRegistrations(ContainerBuilder builder) { var configuration = new ConfigurationBuilder() .SetBasePath(AppContext.BaseDirectory) .AddJsonFile("appsettings.json", optional: false, reloadOnChange: false) .Build(); var moduleConfig = configuration.Get(); var basePath = AppContext.BaseDirectory; var assemblies = new List(); foreach (var module in moduleConfig.Modules) { var fullPath = Path.Combine(basePath, module); if (!File.Exists(fullPath)) throw new FileNotFoundException($"Configured module not found: {fullPath}"); assemblies.Add(Assembly.LoadFrom(fullPath)); } var registrationTypes = assemblies .SelectMany(a => a.GetTypes()) .Where(t => typeof(IIocRegistration).IsAssignableFrom(t) && !t.IsAbstract && !t.IsInterface).ToList(); foreach (var type in registrationTypes) { var instance = (IIocRegistration)Activator.CreateInstance(type)!; instance.RegisterTypes(builder); } } }