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);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|