一起养成写作习惯!这是我参与「掘金日新计划 · 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>();
}
总结:还是那句话,一步步来,加油!