using System.Reflection; using DispenserCommon.Ioc; namespace DispenserCore.IOC; public class IocScanner { /// /// 扫描所有的类,将所有带有Component的类注册到IOC容器中 /// public static List Scan() { var components = GetAssemblies() .SelectMany(a => a.GetTypes() .Where(t => t.GetCustomAttributes(typeof(Component), true).Length > 0)) .ToList(); List services = []; components.ForEach(component => { var attribute = component.GetCustomAttribute(); services.Add(new IocService(attribute?.Type ?? component, component)); }); return services; } private static IEnumerable GetAssemblies() { var assemblies = new List(); foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies()) { var name = assembly.GetName().Name; if (name != null && name.ToLower().Contains("dispenser")) GetReferenceAssemblies(assembly, assemblies); } return assemblies; } private static void GetReferenceAssemblies(Assembly assembly, ICollection assemblies) { foreach (var assemblyName in assembly.GetReferencedAssemblies()) { var name = assemblyName.Name; if (name != null && name.ToLower().Contains("dispenser")) { var ass = Assembly.Load(assemblyName); if (assemblies.Contains(ass)) continue; assemblies.Add(ass); GetReferenceAssemblies(ass, assemblies); } } } }