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> |

项目整体结构
