.net Core中自带DI是非常简单轻量化的,但是如果批量注册就得扩展,下面使用反射进行批量注册的

1 public void AddAssembly(IServiceCollection services,string assemblyName) 2 { 3 if (!string.IsNullOrEmpty(assemblyName)) 4 { 5 var assembly = Assembly.Load(assemblyName); 6 var ts = assembly.GetTypes().Where(n => n.IsClass && !n.IsAbstract && !n.IsGenericType).ToList(); 7 foreach (var item in ts.Where(s => !s.IsInterface)) 8 { 9 var interfaceType = item.GetInterfaces(); 10 if (interfaceType.Length == 1) 11 services.AddScoped(interfaceType[0], item); 12 if (interfaceType.Length > 1) 13 services.AddScoped(interfaceType[1], item); 14 } 15 } 16 }
下面是将自带的DI换成AutoFac进行批量DI
(NuGet引入Autofac,Autofac.Configuration,Autofac.Extensions.DependencyInjection)

1 public class AutofacModule : Autofac.Module 2 { 3 //重写Autofac管道Load方法,在这里注册注入 4 protected override void Load(ContainerBuilder builder) 5 { 6 //注册Service中的对象,Service中的类要以Service结尾,否则注册失败 7 builder.RegisterAssemblyTypes(Assembly.Load("CoreDemo")).Where(a => a.Name.EndsWith("Service")).AsImplementedInterfaces(); 8 } 9 }

1 public IServiceProvider ConfigureServices(IServiceCollection services) 2 { 3 services.AddMvc(); 4 services.Configure<ConnectionOptions>(_configuration.GetSection("ConnectionStrings")); 5 6 #region 注册Autofac 7 //实例化Autofac容器 8 var builder = new ContainerBuilder(); 9 //将Services中的服务填充到Autofac中 10 builder.Populate(services); 11 //新模块组件注册 12 builder.RegisterModule<AutofacModule>(); 13 //创建容器 14 var Container = builder.Build(); 15 //Autofac接管.net core内置DI容器 16 return new AutofacServiceProvider(Container); 17 #endregion 18 }