ASP.NET Core IOC容器

复制代码
            //IOC容器支持依赖注入
            {
                ServiceCollection serviceDescriptors = new ServiceCollection();
                serviceDescriptors.AddTransient<IMicrophone, Microphone>();
                serviceDescriptors.AddTransient<IPower, Power>();
                serviceDescriptors.AddTransient<IHeadphone, Headphone>();
                ServiceProvider serviceProvider =serviceDescriptors.BuildServiceProvider();
                IHeadphone headphone = serviceProvider.GetService<IHeadphone>();
            }
复制代码
AddTransient:瞬时生命周期,每一次创建都是是一个全新的实例
ServiceCollection serviceDescriptors = new ServiceCollection();
serviceDescriptors.AddTransient<IMicrophone, Microphone>();
ServiceProvider serviceProvider =serviceDescriptors.BuildServiceProvider();
IMicrophone microphone1 = serviceProvider.GetService<IMicrophone>();

AddSingleton:单例生命周期:同一个类型,创建出来的是同一个实例
ServiceCollection serviceDescriptors = new ServiceCollection();
serviceDescriptors.AddSingleton<IMicrophone, Microphone>();
ServiceProvider serviceProvider = serviceDescriptors.BuildServiceProvider();
IMicrophone microphone1 = serviceProvider.GetService<IMicrophone>();

AddScoped:作用域生命周期: 同一个serviceProvider获取到的是同一个实例
ServiceCollection serviceDescriptors = new ServiceCollection();
serviceDescriptors.AddScoped<IMicrophone, Microphone>();
ServiceProvider serviceProvider1 = serviceDescriptors.BuildServiceProvider();
IMicrophone microphone1 = serviceProvider1.GetService<IMicrophone>();

ServiceCollection 抽象和具体之间多种注册方式

复制代码
{
    ServiceCollection serviceDescriptors = new ServiceCollection();
    serviceDescriptors.AddTransient<IMicrophone, Microphone>();
    ServiceProvider serviceProvider1 = serviceDescriptors.BuildServiceProvider();
    IMicrophone microphone1 = serviceProvider1.GetService<IMicrophone>();
}
{
    ServiceCollection serviceDescriptors = new ServiceCollection();
    serviceDescriptors.AddTransient(typeof(IMicrophone), typeof(Microphone));
    ServiceProvider serviceProvider1 = serviceDescriptors.BuildServiceProvider();
    IMicrophone microphone1 = serviceProvider1.GetService<IMicrophone>();
}
//注册抽象和一段业务逻辑
{
    ServiceCollection serviceDescriptors = new ServiceCollection();
    serviceDescriptors.AddTransient(typeof(IPower), provider =>
    {
        //在这里可以我们自己来决定如何创建这个对象的实例;可以对创建出来的这个实例,可以做加工
        IMicrophone microphone = provider.GetService<IMicrophone>();
        return new Power(microphone);
    });

    serviceDescriptors.AddTransient(typeof(IMicrophone), typeof(Microphone));
    ServiceProvider serviceProvider1 = serviceDescriptors.BuildServiceProvider();
    IPower power = serviceProvider1.GetService<IPower>();
}
{
    ServiceCollection serviceDescriptors = new ServiceCollection();
    serviceDescriptors.AddTransient(typeof(Microphone));
    ServiceProvider serviceProvider1 = serviceDescriptors.BuildServiceProvider();
    Microphone microphone1 = serviceProvider1.GetService<Microphone>();
}

{
    ServiceCollection serviceDescriptors = new ServiceCollection();
    serviceDescriptors.AddTransient<Microphone>();
    ServiceProvider serviceProvider1 = serviceDescriptors.BuildServiceProvider();
    Microphone microphone1 = serviceProvider1.GetService<Microphone>();
} 
相关推荐
Grey Zeng3 小时前
Java SE 25新增特性
java·jdk·jdk新特性·jdk25
雨白4 小时前
Java 线程通信基础:interrupt、wait 和 notifyAll 详解
android·java
架构师沉默8 小时前
设计多租户 SaaS 系统,如何做到数据隔离 & 资源配额?
java·后端·架构
Java中文社群10 小时前
重要:Java25正式发布(长期支持版)!
java·后端·面试
每天进步一点_JL11 小时前
JVM 类加载:双亲委派机制
java·后端
用户2986985301411 小时前
Java HTML 转 Word 完整指南
java·后端
渣哥11 小时前
原来公平锁和非公平锁差别这么大
java
渣哥11 小时前
99% 的人没搞懂:Semaphore 到底是干啥的?
java
J2K12 小时前
JDK都25了,你还没用过ZGC?那真得补补课了
java·jvm·后端
kfyty72512 小时前
不依赖第三方,不销毁重建,loveqq 框架如何原生实现动态线程池?
java·架构