首页 > 其他分享 >NET6 通过接口完成自动注入

NET6 通过接口完成自动注入

时间:2024-07-12 16:09:16浏览次数:16  
标签:接口 services var NET6 public types 注入

根据NETCore的注入方式添加三个接口

/// <summary>
/// 瞬时注入服务接口
/// </summary>
public interface ITransient
{
}

/// <summary>
/// 作用域注入服务接口
/// </summary>
public interface IScoped
{
}

/// <summary>
/// 单例注入服务接口
/// </summary>
public interface ISingleton
{
}

自动注入的核心代码

/// <summary>
/// 自动注入的扩展方法
/// </summary>
public static class AutoRegisterHelper
{
    /// <summary>
    /// 自动注入的扩展方法
    /// </summary>
    /// <param name="services"></param>
    /// <returns></returns>
    public static IServiceCollection CustAutoRegister(this IServiceCollection services)
    {
        //  需要自动注入的程序集名称
        var registerDllNameList = new List<string> {
            "BLL","DAL"
        };
        var assemblyList = new List<Assembly>();
        foreach (var itemName in registerDllNameList)
            assemblyList.Add(Assembly.Load(itemName));
        var types = assemblyList.SelectMany(x => x.GetTypes())//获取所有类
            .Distinct()//排重
            .Where(x => x.IsClass && !x.IsAbstract)//排除无效数据
            .ToList();

        //    分别注册三种生命周期
        Register<ITransient>(types, services.AddTransient, services.AddTransient);
        Register<IScoped>(types, services.AddScoped, services.AddScoped);
        Register<ISingleton>(types, services.AddSingleton, services.AddSingleton);

        return services;
    }

    /// <summary>
    /// 根据服务标记的生命周期interface,不同生命周期注册到容器里面
    /// </summary>
    /// <typeparam name="TLifetime">注册的生命周期</typeparam>
    /// <param name="types">集合类型</param>
    /// <param name="register">委托:成对注册</param>
    /// <param name="registerDirectly">委托:直接注册服务实现</param>
    private static void Register<TLifetime>(IEnumerable<Type> types, Func<Type, Type, IServiceCollection> register, Func<Type, IServiceCollection> registerDirectly)
    {
        //找到所有标记了Tlifetime生命周期接口的实现类
        var tImplements = types.Where(x => x.GetInterfaces().Any(tinterface => tinterface == typeof(TLifetime))).ToList();

        //遍历,挨个以其他所有接口为key,当前实现为value注册到容器中
        foreach (var t in tImplements)
        {
            //获取除生命周期接口外的所有其他接口
            var interfaces = t.GetInterfaces().Where(x => x != typeof(TLifetime));
            if (interfaces.Any())
            {
                foreach (var i in interfaces)
                {
                    register(i, t);
                }
            }

            //  有时需要直接注入实现类本身
            //registerDirectly(t);
        }
    }
}

 

 

 

 

标签:接口,services,var,NET6,public,types,注入
From: https://www.cnblogs.com/CRobot/p/18298612

相关文章

  • 5-Set接口和常用方法
    5-Set接口和常用方法介绍汇总:Set接口基本介绍Set接口的常用方法Set接口的遍历方式实践练习1-Set接口基本介绍无序(添加和取出的顺序不一致),没有索引不允许重复元素,所以最多包含一个null2-Set接口的常用方法和List接口一样,Set接口也是Collection的子接口。因此,......
  • (5)继承与接口
    上一章主要学习了类与对象的有关知识点,讨论了类的构成以及用类创建对象等内容,主要体现了面向对象编程的一个重要特点——数据的封装。本章讲述这两方面的重要内容——类的继承与多态、接口的实现与多态。1.子类与父类继承是一种由已有的类创建新类的机制。先编写一个有属性......
  • php实名认证示例、实人认证接口
    随着互联网的高速发展,人们可以发表言论的渠道越来越多。网络平台不断汲取各地、各人、各时发表的各种信息。人们喜欢将信息发布到微博、知乎、天涯、豆瓣等等网络平台,逐步的,网络信息进入大爆炸时代。这些大量涌现的信息中难免掺杂着一些不良信息,比如:虚假信息、污言秽语、违法......
  • Java中的接口和抽象类详解
    Java中的接口和抽象类详解大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在Java编程中,接口和抽象类是非常重要的两个概念,它们在面向对象编程中起着关键作用。本文将详细介绍接口和抽象类的定义、使用方法以及它们之间的区别。1.接口的定义和使用接口......
  • 脑电图 (EEG) :语音脑机接口(BCI)的理想选择
        运动性语言障碍是一种严重的医疗状况,它让患者几乎或完全失去说话能力。这种状况在帕金森病患者中的发生率为90%,在中风患者中的发生率为45.2%,在肌萎缩侧索硬化症(ALS)患者中的发生率为95%。典型的针对语言障碍的沟通辅助设备,如使用眼动追踪器的设备,其交流速度远低于自......
  • Postman接口测试工具详解
    文章目录Postman接口测试工具详解一、Postman简介二、安装与配置1.安装Postman2.配置Postman三、创建和管理请求1.创建请求2.配置请求3.添加请求参数四、发送请求与查看响应1.发送请求2.查看响应五、使用环境变量1.创建环境变量2.使用环境变量3.切换环境六......
  • STM32的SPI接口详解
    目录1.SPI简介2.SPI工作原理3.SPI时序3.1CPOL(ClockPolarity,时钟极性):3.2CPHA(ClockPhase,时钟相位):3.3 四种工作模式4.相关代码4.1使能片选信号4.2使能通讯线4.3初始化SPI4.4设置SPI速度4.5读写数据1.SPI简介STM32的SPI(SerialPeripheralInterface)是一个......
  • 接口文档的书写,git的拉取错误的解决,数据库多表查询的进一步认识(以后开发一定要先仔细
    202407111接口文档的书写:1.1首先写你这个大模块是什么功能。1.2开始根据你的功能写接口文档:2解决git拉取错误的问题:2.1出现这样的问题:(推送出错)2.2原因分析:可能因为重装过系统,或者是安装git的位置发生了变化等情况出现。2.3找到git的安装路径,打开gitbash之后,进......
  • Spring依赖注入、循环依赖——三级缓存
    依赖注入背景:实例化对象后,需要设置字段,即依赖注入,两种:set方法注入和构造方法注入。 流程:先寻找整个类的注入点,就是打了@autowired的字段或方法,然后根据类型、名称去找 常用依赖注入注解辨析:@Inject:来自JSR330规范。按类型注入。@Resource:是JavaEE的一部分。先按名......
  • golang 接口按需获取资源
    场景爬虫业务场景,我们需要调用三方接口获取代理ip地址,每个ip地址可以使用的时间有限和价格的,本着不浪费资源,我们在这里做一层封装。当有其他业务调用我们接口的时候,会拉起定时任务,这个定时任务的生命周期为5分钟,超过5分钟这个定时任务就会停止,每一次请求时都会更新定时生命周期......