分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 软件开发

.netCore2.0 程序集DI依赖注入

发布时间:2023-09-06 01:49责任编辑:赖小花关键词:暂无标签

传统的依赖注入确实简单,但是随着项目的扩展随之而来的问题又来了,因为传统的注入是单个类和接口注入的,加入项目的接口和类增加到了上百个的话,就需要在Startup.cs中复制注入上百次,虽然能解决问题,但是显然有点笨拙。

下面介绍一个程序集DI依赖注入,即通过反射进行文件注入

首先通过反射获取当前程序集

/// <summary> ???????/// 通过程序集的名称加载程序集 ???????/// </summary> ???????/// <param name="assemblyName"></param> ???????/// <returns></returns> ???????public static Assembly GetAssemblyByName(string assemblyName) ???????{ ??????????return AssemblyLoadContext.Default.LoadFromAssemblyName(new AssemblyName(assemblyName)); ???????}

程序集依赖注入方法,逻辑不多描述,全在注释中

/// <summary> ???????/// 程序集依赖注入 ???????/// </summary> ???????/// <param name="services">服务实例</param> ???????/// <param name="assemblyName">程序集名称。不带DLL</param> ???????/// <param name="serviceLifetime">依赖注入的类型 可为空</param> ???????public static void AddAssembly(this IServiceCollection services, string assemblyName, ServiceLifetime serviceLifetime = ServiceLifetime.Scoped) ???????{ ???????????if (services == null) ???????????????throw new ArgumentNullException(nameof(services) + "为空"); ???????????if (String.IsNullOrEmpty(assemblyName)) ???????????????throw new ArgumentNullException(nameof(assemblyName) + "为空"); ???????????var assembly = RuntimeHelper.GetAssemblyByName(assemblyName); ???????????if (assembly == null) ???????????????throw new DllNotFoundException(nameof(assembly) + ".dll不存在"); ???????????//找到当前程序集的类集合 ???????????var types = assembly.GetTypes(); ???????????//过滤筛选(是类文件,并且不是抽象类,不是泛型) ???????????var list = types.Where(o => o.IsClass && !o.IsAbstract && !o.IsGenericType).ToList(); ???????????if (list == null && !list.Any()) ???????????????return; ???????????//遍历获取到的类 ???????????foreach (var type in list) ???????????{ ???????????????//然后获取到类对应的接口 ???????????????var interfacesList = type.GetInterfaces(); ???????????????//校验接口存在则继续 ???????????????if (interfacesList == null || !interfacesList.Any()) ???????????????????continue; ???????????????//获取到接口(第一个) ???????????????var inter = interfacesList.First(); ???????????????switch (serviceLifetime) ???????????????{ ???????????????????//根据条件,选择注册依赖的方法 ???????????????????case ServiceLifetime.Scoped: ???????????????????????//将获取到的接口和类注册进去 ???????????????????????services.AddScoped(inter, type); ???????????????????????break; ???????????????????case ServiceLifetime.Singleton: ???????????????????????services.AddScoped(inter, type); ???????????????????????break; ???????????????????case ServiceLifetime.Transient: ???????????????????????services.AddTransient(inter, type); ???????????????????????break; ???????????????} ???????????} ???????}

具体在Startup.cs 中调用如下

 //程序集依赖注入(General.Services程序集名称) services.AddAssembly("General.Services"); 

.netCore2.0 程序集DI依赖注入

原文地址:https://www.cnblogs.com/happygx/p/8859093.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved