using JiShe.CollectBus.Common.Extensions.DependencyInjections; using System.Reflection; using JiShe.CollectBus.Common.Interfaces; using Microsoft.Extensions.Hosting; using System; using Microsoft.Extensions.Configuration; using Serilog; // ReSharper disable once CheckNamespace namespace Microsoft.Extensions.DependencyInjection { public static class DependencyInjectionExtensions { public static IServiceCollection ModuleRegister(this IServiceCollection services, IConfiguration configuration) { var assemblies = GetBinAssemblies(); foreach (var assembly in assemblies) { var allTypes = assembly.GetTypes(); foreach (var type in allTypes) { if (typeof(IJiSheModule).IsAssignableFrom(type) && type is { IsClass: true, IsAbstract: false }) { Log.Logger.Information($"正在加载模块{type.Name}..."); var instance = Activator.CreateInstance(type); _ = (type.GetMethod("ConfigureServices")?.Invoke(instance, [services, configuration])); } } } return services; } public static IServiceCollection ServiceRegister(this IServiceCollection services) { var assemblies = GetBinAssemblies(); foreach (var assembly in assemblies) { var allTypes = assembly.GetTypes(); foreach (var type in allTypes) { if (type is not { IsClass: true, IsAbstract: false }) continue; if (typeof(ISingletonDependency).IsAssignableFrom(type)) { var interfaceTypes = type.GetInterfaces().Where(p => p.FullName != null && !p.FullName.Contains("ISingletonDependency") && !p.FullName.Contains("IDisposable")); foreach (var interfaceType in interfaceTypes) { Log.Logger.Information($"正在IOC注入ISingletonDependency {type.Name}..."); services.AddSingleton(interfaceType, type); } } if (typeof(ITransientDependency).IsAssignableFrom(type)) { var interfaceTypes = type.GetInterfaces().Where(p => p.FullName != null && !p.FullName.Contains("ITransientDependency") && !p.FullName.Contains("IDisposable")); foreach (var interfaceType in interfaceTypes) { Log.Logger.Information($"正在IOC注入ITransientDependency {type.Name}..."); services.AddTransient(interfaceType, type); } } if (typeof(IScopedDependency).IsAssignableFrom(type)) { var interfaceTypes = type.GetInterfaces().Where(p => p.FullName != null && !p.FullName.Contains("IScopedDependency") && !p.FullName.Contains("IDisposable")); foreach (var interfaceType in interfaceTypes) { Log.Logger.Information($"正在IOC注入IScopedDependency {type.Name}..."); services.AddScoped(interfaceType, type); } } } } return services; } private static IEnumerable GetBinAssemblies() { var directory = new DirectoryInfo(AppDomain.CurrentDomain.BaseDirectory); if (!directory.Exists) return []; var files = directory.GetFiles("JiShe.CollectBus.*.dll"); var assemblies = new List(); foreach (var file in files) { try { var assembly = Assembly.LoadFrom(file.FullName); assemblies.Add(assembly); } catch (Exception ex) { Console.WriteLine($"Error loading assembly from {file.FullName}: {ex.Message}"); } } return assemblies; } } }