1、扩展批量注入类
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40  | 
						<span style="color: rgba(0, 0, 255, 1);">public</span> <span style="color: rgba(0, 0, 255, 1);">static</span> <span style="color: rgba(0, 0, 255, 1);">class</span><span style="color: rgba(0, 0, 0, 1);"> ServicesExtersion     {         </span><span style="color: rgba(0, 0, 255, 1);">public</span> <span style="color: rgba(0, 0, 255, 1);">static</span> <span style="color: rgba(0, 0, 255, 1);">void</span><span style="color: rgba(0, 0, 0, 1);"> AddClassesAsImplementedInterface(             </span><span style="color: rgba(0, 0, 255, 1);">this</span><span style="color: rgba(0, 0, 0, 1);"> IServiceCollection services             , Assembly assembly             , Type compareType             , ServiceLifetime lifetime </span>=<span style="color: rgba(0, 0, 0, 1);"> ServiceLifetime.Scoped)         {             assembly.GetTypesAssignableTo(compareType).ForEach((type) </span>=><span style="color: rgba(0, 0, 0, 1);">             {                 </span><span style="color: rgba(0, 0, 255, 1);">foreach</span> (<span style="color: rgba(0, 0, 255, 1);">var</span> implementedInterface <span style="color: rgba(0, 0, 255, 1);">in</span><span style="color: rgba(0, 0, 0, 1);"> type.ImplementedInterfaces)                 {                     </span><span style="color: rgba(0, 0, 255, 1);">switch</span><span style="color: rgba(0, 0, 0, 1);"> (lifetime)                     {                         </span><span style="color: rgba(0, 0, 255, 1);">case</span><span style="color: rgba(0, 0, 0, 1);"> ServiceLifetime.Scoped:                             services.AddScoped(implementedInterface, type);                             </span><span style="color: rgba(0, 0, 255, 1);">break</span><span style="color: rgba(0, 0, 0, 1);">;                         </span><span style="color: rgba(0, 0, 255, 1);">case</span><span style="color: rgba(0, 0, 0, 1);"> ServiceLifetime.Singleton:                             services.AddSingleton(implementedInterface, type);                             </span><span style="color: rgba(0, 0, 255, 1);">break</span><span style="color: rgba(0, 0, 0, 1);">;                         </span><span style="color: rgba(0, 0, 255, 1);">case</span><span style="color: rgba(0, 0, 0, 1);"> ServiceLifetime.Transient:                             services.AddTransient(implementedInterface, type);                             </span><span style="color: rgba(0, 0, 255, 1);">break</span><span style="color: rgba(0, 0, 0, 1);">;                     }                 }             });         }         </span><span style="color: rgba(0, 0, 255, 1);">public</span> <span style="color: rgba(0, 0, 255, 1);">static</span> List<TypeInfo> GetTypesAssignableTo(<span style="color: rgba(0, 0, 255, 1);">this</span><span style="color: rgba(0, 0, 0, 1);"> Assembly assembly, Type compareType)         {             </span><span style="color: rgba(0, 0, 255, 1);">var</span> typeInfoList = assembly.DefinedTypes.Where(x =><span style="color: rgba(0, 0, 0, 1);"> x.IsClass                                 </span>&& !<span style="color: rgba(0, 0, 0, 1);">x.IsAbstract                                 </span>&& x !=<span style="color: rgba(0, 0, 0, 1);"> compareType                                 </span>&& x.GetInterfaces().Any(i =><span style="color: rgba(0, 0, 0, 1);"> i.IsGenericType                                 </span>&& i.GetGenericTypeDefinition() == compareType))?<span style="color: rgba(0, 0, 0, 1);">.ToList();             </span><span style="color: rgba(0, 0, 255, 1);">return</span><span style="color: rgba(0, 0, 0, 1);"> typeInfoList;         }     }</span>  | 
					
2、Startup注入
| 
					 1 2  | 
						<span style="color: rgba(0, 128, 0, 1);">//</span><span style="color: rgba(0, 128, 0, 1);"> 注入泛型依赖项</span>             services.AddClassesAsImplementedInterface(Assembly.Load(<span style="color: rgba(128, 0, 0, 1);">"</span><span style="color: rgba(128, 0, 0, 1);">WebApplication2</span><span style="color: rgba(128, 0, 0, 1);">"</span>), <span style="color: rgba(0, 0, 255, 1);">typeof</span>(IServices<>));  | 
					
3、接口实现类
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40  | 
						<span style="color: rgba(0, 0, 255, 1);">public</span> <span style="color: rgba(0, 0, 255, 1);">class</span><span style="color: rgba(0, 0, 0, 1);"> User     {     } </span><span style="color: rgba(0, 0, 255, 1);">public</span> <span style="color: rgba(0, 0, 255, 1);">class</span><span style="color: rgba(0, 0, 0, 1);"> Role     {     } </span><span style="color: rgba(0, 0, 255, 1);">public</span> <span style="color: rgba(0, 0, 255, 1);">class</span> UserServices: IServices<User><span style="color: rgba(0, 0, 0, 1);">     {         </span><span style="color: rgba(0, 0, 255, 1);">public</span> <span style="color: rgba(0, 0, 255, 1);">async</span> Task<<span style="color: rgba(0, 0, 255, 1);">string</span>><span style="color: rgba(0, 0, 0, 1);"> GetData()         {             </span><span style="color: rgba(0, 0, 255, 1);">return</span> <span style="color: rgba(0, 0, 255, 1);">await</span> Task.FromResult(<span style="color: rgba(128, 0, 0, 1);">"</span><span style="color: rgba(128, 0, 0, 1);">User服务实现类</span><span style="color: rgba(128, 0, 0, 1);">"</span><span style="color: rgba(0, 0, 0, 1);">);         }         </span><span style="color: rgba(0, 0, 255, 1);">public</span> <span style="color: rgba(0, 0, 255, 1);">async</span> Task<User><span style="color: rgba(0, 0, 0, 1);"> GetObj()         {             </span><span style="color: rgba(0, 0, 255, 1);">return</span> <span style="color: rgba(0, 0, 255, 1);">await</span> Task.FromResult(<span style="color: rgba(0, 0, 255, 1);">new</span><span style="color: rgba(0, 0, 0, 1);"> User());         }     } </span><span style="color: rgba(0, 0, 255, 1);">public</span> <span style="color: rgba(0, 0, 255, 1);">class</span> RoleServices:IServices<Role><span style="color: rgba(0, 0, 0, 1);">     {         </span><span style="color: rgba(0, 0, 255, 1);">public</span> <span style="color: rgba(0, 0, 255, 1);">async</span> Task<<span style="color: rgba(0, 0, 255, 1);">string</span>><span style="color: rgba(0, 0, 0, 1);"> GetData()         {             </span><span style="color: rgba(0, 0, 255, 1);">return</span> <span style="color: rgba(0, 0, 255, 1);">await</span> Task.FromResult(<span style="color: rgba(128, 0, 0, 1);">"</span><span style="color: rgba(128, 0, 0, 1);">Role服务实现类</span><span style="color: rgba(128, 0, 0, 1);">"</span><span style="color: rgba(0, 0, 0, 1);">);         }         </span><span style="color: rgba(0, 0, 255, 1);">public</span> <span style="color: rgba(0, 0, 255, 1);">async</span> Task<Role><span style="color: rgba(0, 0, 0, 1);"> GetObj()         {             </span><span style="color: rgba(0, 0, 255, 1);">return</span> <span style="color: rgba(0, 0, 255, 1);">await</span> Task.FromResult(<span style="color: rgba(0, 0, 255, 1);">new</span><span style="color: rgba(0, 0, 0, 1);"> Role());         }     }  </span><span style="color: rgba(0, 0, 255, 1);">public</span> <span style="color: rgba(0, 0, 255, 1);">interface</span> IServices<T><span style="color: rgba(0, 0, 0, 1);">     {         Task</span><<span style="color: rgba(0, 0, 255, 1);">string</span>><span style="color: rgba(0, 0, 0, 1);"> GetData();         Task</span><T><span style="color: rgba(0, 0, 0, 1);"> GetObj();     }</span>  | 
					
4、controll控制器实现
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28  | 
						<span style="color: rgba(0, 0, 255, 1);">public</span> <span style="color: rgba(0, 0, 255, 1);">class</span><span style="color: rgba(0, 0, 0, 1);"> HomeController : Controller     {         </span><span style="color: rgba(0, 0, 255, 1);">private</span> <span style="color: rgba(0, 0, 255, 1);">readonly</span> ILogger<HomeController><span style="color: rgba(0, 0, 0, 1);"> _logger;         </span><span style="color: rgba(0, 0, 255, 1);">private</span> <span style="color: rgba(0, 0, 255, 1);">readonly</span> IServices<User><span style="color: rgba(0, 0, 0, 1);"> _userServices;         </span><span style="color: rgba(0, 0, 255, 1);">private</span> <span style="color: rgba(0, 0, 255, 1);">readonly</span> IServices<Role><span style="color: rgba(0, 0, 0, 1);"> _roleServices;         </span><span style="color: rgba(0, 0, 255, 1);">public</span> HomeController(ILogger<HomeController> logger, IServices<User> userServices, IServices<Role><span style="color: rgba(0, 0, 0, 1);"> roleServices)         {             _logger </span>=<span style="color: rgba(0, 0, 0, 1);"> logger;             _userServices</span>=<span style="color: rgba(0, 0, 0, 1);"> userServices;             _roleServices</span>=<span style="color: rgba(0, 0, 0, 1);"> roleServices;         }         </span><span style="color: rgba(0, 0, 255, 1);">public</span> <span style="color: rgba(0, 0, 255, 1);">async</span> Task<IActionResult><span style="color: rgba(0, 0, 0, 1);"> Index()         {             {                 _logger.LogInformation($</span><span style="color: rgba(128, 0, 0, 1);">"</span><span style="color: rgba(128, 0, 0, 1);">{await _userServices.GetData()}</span><span style="color: rgba(128, 0, 0, 1);">"</span><span style="color: rgba(0, 0, 0, 1);">);                 _logger.LogInformation($</span><span style="color: rgba(128, 0, 0, 1);">"</span><span style="color: rgba(128, 0, 0, 1);">{await _userServices.GetObj()}</span><span style="color: rgba(128, 0, 0, 1);">"</span><span style="color: rgba(0, 0, 0, 1);">);             }             {                 _logger.LogInformation($</span><span style="color: rgba(128, 0, 0, 1);">"</span><span style="color: rgba(128, 0, 0, 1);">{await _roleServices.GetData()}</span><span style="color: rgba(128, 0, 0, 1);">"</span><span style="color: rgba(0, 0, 0, 1);">);                 _logger.LogInformation($</span><span style="color: rgba(128, 0, 0, 1);">"</span><span style="color: rgba(128, 0, 0, 1);">{await _roleServices.GetObj()}</span><span style="color: rgba(128, 0, 0, 1);">"</span><span style="color: rgba(0, 0, 0, 1);">);             }             </span><span style="color: rgba(0, 0, 255, 1);">return</span><span style="color: rgba(0, 0, 0, 1);"> View();         }     }</span>  | 
					

项目整体结构
