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


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

  • 相关阅读:
    PCB电路板元器件布局的一般原则*(转)
    PCB Layout初学者必会知识总结(转)
    数字器件和模拟器件?
    同一原理图中怎么区分数字电路和模拟电路
    oracle 11g R2执行INSERT语句,数据库把一个汉字看做3个汉字
    SQL存储过程与函数的区别
    用户自定义函数——Oracle 11g R2
    提高使用SQL Developer进行PL/SQL编程的效率——Oracle 11g R2
    Oracle查看用户使用的表
    JAVA-Eclipse快捷键
  • 原文地址:https://www.cnblogs.com/happygx/p/8859093.html
Copyright © 2020-2023  润新知