在Asp.net core中,使用反射加载程序集,手动挺扫描所有的服务依赖,然后将这个服务依赖添加到服务容器中,具体实现代码如下:
namespace MyCore.Infrastructure.Dependency { public static class Ioc { public static void ResolveAllTypes(this IServiceCollection services, string solutionPrefix, params string[] projectSuffixes) { //solutionPrefix 解决方案名称 //projectSuffixes 需要扫描的项目名称集合 //注意: 如果使用此方法,必须提供需要扫描的项目名称 var allAssemblies = new List<Assembly>(); var path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); foreach (var dll in Directory.GetFiles(path, "*.dll")) allAssemblies.Add(Assembly.LoadFile(dll)); var types = new List<Type>(); foreach (var assembly in allAssemblies) { if (assembly.FullName.StartsWith(solutionPrefix)) { foreach (var assemblyDefinedType in assembly.DefinedTypes) { if (projectSuffixes.Any(x => assemblyDefinedType.Name.EndsWith(x))) { types.Add(assemblyDefinedType.AsType()); } } } } var implementTypes = types.Where(x => x.IsClass).ToList(); foreach (var implementType in implementTypes) { //接口和实现的命名规则为:"AService"类实现了"IAService"接口,你也可以自定义规则 var interfaceType = implementType.GetInterface("I" + implementType.Name); if (interfaceType != null) { services.Add(new ServiceDescriptor(interfaceType, implementType,ServiceLifetime.Scoped)); } } } } }
在startup.cs中的ConfigureServices中,使用:
Ioc.ResolveAllTypes(services, "MyCore", "Repository", "Service")