zoukankan      html  css  js  c++  java
  • .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"); 

  • 相关阅读:
    解决:TypeError: object() takes no parameters
    刷题(三)
    刷题(二)
    web自动化流程总结
    不能在Python Console中运行pytest
    关于pytest的一些问题
    UML设计,可以设计程序的用例图、类图、活动图等_SurfaceView
    android系统下消息推送机制
    Android中的动画,选择器,样式和主题的使用
    内存监测工具 DDMS --> Heap
  • 原文地址:https://www.cnblogs.com/happygx/p/8859093.html
Copyright © 2011-2022 走看看