IOC容器讲解(一)

122 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第10天,点击查看活动详情

前言

今天我们开始讲IOC容器,这是重点,大家可以看看。

ASP.NET Core6 IOC容器

什么是IOC容器

IOC容器Inverion of control 的缩写,翻译过来就是控制反转

内置容器ServiceCollection的应用

//Services
//program.cs
{
​
​
    //传统工艺
    IMicrosoft microsoft = new Microsoft1();
​
}
​
​
//内置容器
{ 
    //1.创建一个容器,nuget引入,Microsoft。Extensions.DependencyInjection.Abstractions
​
    ServiceCollection services = new ServiceCollection();
​
    //2.注册抽象类和具体普通类之间的关系
​
    //services.Transient < IMicrosoft,Microsoft1 >
​
    services.AddTransient<IMicrosoft, Microsoft1>();
​
    //3.services builder一下
​
    ServiceProvider serviceProvider = services.BuildServiceProvider();
    IMicrosoft microsoft1= serviceProvider.GetService<IMicrosoft>();    
}
​
​
//类库
using Interfaces;
​
namespace Serevices
{
    public class Microsoft1: IMicrosoft
    {
        public Microsoft1()
        {
            Console.WriteLine($"{this.GetType().Name}被构造了。。");
        }
    }
}
​
​
//接口类库
namespace Interfaces
{
    public interface IMicrosoft
    {
       
    }
}

IOC容器-DI依赖注入

方便扩展

依赖注入:

就是在创建对象时,对象A依赖对象B,创建A时,自动创建B,并把对象B交给对象A

依赖注入的多种方式 1.构造函数上注入 2.属性注入 3.方法注入

DI依赖注入 --构造函数注入

{
​
​
    //传统工艺
    IMicrosoft microsoft = new Microsoft1();
    IPower power = new Power(microsoft);
    IHead head = new Head(power)
}
​
​
//IOC --依赖注入
{ 
    //1.创建一个容器,nuget引入,Microsoft。Extensions.DependencyInjection.Abstractions
​
    ServiceCollection services = new ServiceCollection();
​
    //2.注册抽象类和具体普通类之间的关系
​
    //services.Transient < IMicrosoft,Microsoft1 >
​
    services.AddTransient<IMicrosoft, Microsoft1>();
     services.AddTransient<IPower, Power>();
     services.AddTransient<IHead, Head>();
​
    //3.services builder一下
​
    ServiceProvider serviceProvider = services.BuildServiceProvider();
    IHead microsoft1= serviceProvider.GetService<IHead>();    
}
​

ServiceCollection支持的生命周期

瞬时生命周期--Transient 单例生命周期--Singleton 作用域生命周期--Scoped

瞬时生命周期:每一次创建都是一个全新的实例

单例生命周期:同一个类型,创建出来的是是同一实例

作用域生命周期:同一个ServiceProvider获取到同一个实例

抽象和具体的多种注册

注册抽象和具体

注册具体普通类

注册工厂--自定义创建实例

泛型版本的支持

1.
   { 
    //1.创建一个容器,nuget引入,Microsoft。Extensions.DependencyInjection.Abstractions
​
    ServiceCollection services = new ServiceCollection();
​
    //2.注册抽象类和具体普通类之间的关系
​
    //services.Transient < IMicrosoft,Microsoft1 >
​
    services.AddTransient<IMicrosoft, Microsoft1>();
​
    //3.services builder一下
​
    ServiceProvider serviceProvider = services.BuildServiceProvider();
    IMicrosoft microsoft1= serviceProvider.GetService<IMicrosoft>();    
}
​
​
​
2.
    { 
    //1.创建一个容器,nuget引入,Microsoft。Extensions.DependencyInjection.Abstractions
​
    ServiceCollection services = new ServiceCollection();
​
    //2.注册抽象类和具体普通类之间的关系
​
    //services.Transient < IMicrosoft,Microsoft1 >
​
    services.AddTransient(typeof(IMicrosoft),typeof(Microsoft));
​
    //3.services builder一下
​
    ServiceProvider serviceProvider = services.BuildServiceProvider();
    IMicrosoft microsoft1= serviceProvider.GetService<IMicrosoft>();    
}
    
​
​
3.
     { 
    //1.创建一个容器,nuget引入,Microsoft。Extensions.DependencyInjection.Abstractions
​
    ServiceCollection services = new ServiceCollection();
​
    //2.注册抽象类和具体普通类之间的关系
​
    //services.Transient < IMicrosoft,Microsoft1 >
​
    services.AddTransient(typeof(Ipower),provider=>{
        //自定义
        IHead head = provider.GetService<IHead>();
        return new Power(head)
    });
​
    //3.services builder一下
​
    ServiceProvider serviceProvider = services.BuildServiceProvider();
    IPower microsoft1= serviceProvider.GetService<IPower>();    
}
​
​
​
    4.
        
        { 
    //1.创建一个容器,nuget引入,Microsoft。Extensions.DependencyInjection.Abstractions
​
    ServiceCollection services = new ServiceCollection();
​
    //2.注册抽象类和具体普通类之间的关系
​
    //services.Transient < IMicrosoft,Microsoft1 >
​
    services.AddTransient<Microsoft1>();
​
    //3.services builder一下
​
    ServiceProvider serviceProvider = services.BuildServiceProvider();
    IMicrosoft microsoft1= serviceProvider.GetService<IMicrosoft>();    
}
​
     

总结:还是那句话,一步步来,加油!