Dispenser/DispenserCore/IOC/IocScanner.cs

52 lines
1.7 KiB
C#
Raw Permalink Normal View History

2024-08-16 07:20:09 +00:00
using System.Reflection;
using DispenserCommon.Ioc;
namespace DispenserCore.IOC;
public class IocScanner
{
/// <summary>
/// 扫描所有的类将所有带有Component的类注册到IOC容器中
/// </summary>
public static List<IocService> Scan()
{
var components = GetAssemblies()
.SelectMany(a => a.GetTypes()
.Where(t => t.GetCustomAttributes(typeof(Component), true).Length > 0))
.ToList();
List<IocService> services = [];
components.ForEach(component =>
{
var attribute = component.GetCustomAttribute<Component>();
services.Add(new IocService(attribute?.Type ?? component, component));
});
return services;
}
private static IEnumerable<Assembly> GetAssemblies()
{
var assemblies = new List<Assembly>();
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<Assembly> 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);
}
}
}
}