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

本文介绍了使用程序集依赖注入简化传统依赖注入方法的过程。通过反射加载程序集并注册所有符合要求的类及其接口,避免了手动在Startup.cs中重复注入代码。文中详细解释了实现步骤及Startup.cs中的调用示例。

传统的依赖注入确实简单,但是随着项目的扩展随之而来的问题又来了,因为传统的注入是单个类和接口注入的,加入项目的接口和类增加到了上百个的话,就需要在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"); 

转载于:https://www.cnblogs.com/happygx/p/8859093.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值