52 lines
1.7 KiB
C#
52 lines
1.7 KiB
C#
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);
|
||
}
|
||
}
|
||
}
|
||
} |