using LY.App.Extensions.DI; using System.Reflection; namespace LY.App.Extensions { public static class AutoDIExtensions { /// /// /// /// /// public static IServiceCollection ServicesAutoInjectionExtension(this IServiceCollection serviceCollection) { var directory = AppDomain.CurrentDomain.BaseDirectory; var types = Directory.GetFiles(directory, "*.dll", SearchOption.TopDirectoryOnly) .Where(s => !s.ToLower().Contains("sql")) .Select(Assembly.LoadFrom) .SelectMany(a => a.GetTypes()); Injection(serviceCollection, types); return serviceCollection; } /// /// 服务自动注入 /// /// 需要自动注入服务的服务集合 /// 应用于每个Assembly的筛选函数 /// 指定的注入类型不在可注入的范围内 /// 指定注入的类型未实现任何服务 /// 输入的参数错误:1、注入的类型未实现指定的服务。2、指定的服务不是Interface类型 /// 自动注入服务后的服务集合 public static IServiceCollection ServicesAutoInjection(this IServiceCollection serviceCollection, Func selector) { var directory = AppDomain.CurrentDomain.BaseDirectory; var types = Directory.GetFiles(directory, "*.dll", SearchOption.TopDirectoryOnly) .Select(Assembly.LoadFrom) .Where(selector) .SelectMany(a => a.GetTypes()); Injection(serviceCollection, types); return serviceCollection; } // 注入逻辑 private static void Injection(IServiceCollection serviceCollection, IEnumerable types) { foreach (var type in types) { var attribute = type.GetCustomAttribute(); if (attribute == null) continue; switch (attribute.InjectionType) { case InjectionType.Transient: serviceCollection.AddTransient(type); break; case InjectionType.Scoped: serviceCollection.AddScoped(type); break; case InjectionType.Singleton: serviceCollection.AddSingleton(type); break; default: throw new ArgumentOutOfRangeException(); } } } } }