using Microsoft.Extensions.DependencyInjection; using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; using JiShe.CollectBus.Protocol.Contracts.DependencyInjection; using TouchSocket.Core; namespace Microsoft.Extensions.DependencyInjection { public static class DependencyInjectionExtensions { public static void ServiceRegister(this IServiceCollection services, params Assembly[] assemblies) { if (assemblies.Length <= 0) { assemblies = [Assembly.GetExecutingAssembly()]; } foreach (var assembly in assemblies) { var allTypes = assembly.GetTypes(); foreach (var type in allTypes) { if (typeof(ITransientDependency).IsAssignableFrom(type) && type.IsClass && !type.IsAbstract) { var interfaceTypes = type.GetInterfaces().Where(p => p.FullName != null && !p.FullName.Contains("ITransientDependency")); foreach (var interfaceType in interfaceTypes) { services.AddTransient(interfaceType, type); } } } foreach (var type in allTypes) { if (typeof(ISingletonDependency).IsAssignableFrom(type) && type.IsClass && !type.IsAbstract) { var interfaceTypes = type.GetInterfaces().Where(p => p.FullName != null && !p.FullName.Contains("ISingletonDependency")); foreach (var interfaceType in interfaceTypes) { services.AddSingleton(interfaceType, type); } } } foreach (var type in allTypes) { if (typeof(IScopedDependency).IsAssignableFrom(type) && type.IsClass && !type.IsAbstract) { var interfaceTypes = type.GetInterfaces().Where(p => p.FullName != null && !p.FullName.Contains("IScopedDependency")); foreach (var interfaceType in interfaceTypes) { services.AddScoped(interfaceType, type); } } } } } public static void PluginServiceRegister(this IServiceCollection services, string pluginPath = "") { if (pluginPath.IsNullOrWhiteSpace()) { pluginPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Plugins"); } var assemblies = GetAssembliesFromFolder(pluginPath); ServiceRegister(services, assemblies.ToArray()); } public static IEnumerable GetAssembliesFromFolder(string folderPath) { var directory = new DirectoryInfo(folderPath); if (!directory.Exists) return Enumerable.Empty(); var files = directory.GetFiles("*.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; } } }