前言:
在Autofac的使用中,提供了个种注入的API其中GetAssemblies()用着特别的舒坦。
1、core2.0也可以使用Autofac的包,但框架自身也提供了默认的注入Api,IServiceCollection(Transient、AddSingleton、Scoped)
services.AddTransient<IUserRepositiry, UserRepositiry>(); services.AddSingleton<IUserRepositiry, UserRepositiry>(); services.AddScoped<IUserRepositiry, UserRepositiry>();
上面是框架自带的注入(如果有100个类,那岂不是要写100遍,脑壳痛。。。)
2、按程序集实现依赖注入
public static class MyDependencyInjection { public static void RegisterAssembly(this IServiceCollection service, string assemblyName, ServiceLifetime serviceLifetime = ServiceLifetime.Transient) { //加载程序集 var assemblies = AppDomain.CurrentDomain.Load(assemblyName); if(assemblies == null) throw new ArgumentNullException(nameof(assemblies) + "不存在!"); //获取该程序集中包含'Service'的类 var types = assemblies.GetTypes().Where(x => x.Name.Contains("Service") && !x.IsAbstract && !x.IsGenericType); if(types == null) throw name ArgumentNullException(nameof(types) + "为空!"); foreach(var item in types) { var inter = item.GetInterfaces()?.First(); if(inter == null) continue; //以何种方式注入 switch(serviceLifetime) { case ServiceLifetime.Transient: service.AddTransient(item, inter); break; case ServiceLifetime.Singleton: service.AddSingleton(item, inter); break; case ServiceLifetime.Scoped: service.AddScoped(item, inter); break; } } } }
在Startup.cs的 ConfigureServices(IServiceCollection services)方法中调用
services.RegisterAssembly("Repository");
这样就实现了!