概念
:::info
- DIP(依赖倒置原则):六大设计原则里面一种设计原则,它转换了依赖关系,高层模块不依赖于底层模块的实现,而低层模块要依赖于高层模块的接口定义,总的原则就是高层和底层都不互相依赖,两者都依赖与抽象,抽象不依赖于实现,实现应该依赖于抽象
- IOC(控制反转):一种反转流、依赖和接口的方式(DIP的具体实现方式)
- DI(依赖注入):IoC的一种实现方式,用来反转依赖(IoC的具体实现方式)
- IoC容器:依赖注入的框架,用来映射依赖,管理对象创建和生存周期(DI框架)。
5.IOC容器能做到哪些
√对接口和实现类实现了由原来的零散式管理到现在的集中化管理
√ 对类之间,类接口之间的关联关系可以采用多种模式注入(构造器注入,属性注入)等等。
**√** 对实现类的生命周期进行了统一管理,能够控制服务的创建,释放和监控。
**√ **类的依赖由编译时推迟到了运行时
- 微软重新设计的asp.net core 就是基于内建容器ServiceCollection,其实就一个IOC容器,在asp.net core出来之前也有好几种IOC容器如:Autofac、Unity等等
:::
:::info
Transient:每次从容器 (IServiceProvider)中获取的时候都是一个新的实例 Singleton:每次从同根容器中( IServiceProvider)获取的时候都是同一个实例Scoped:同一个请求中从同一个容器中( IServiceProvider)获取的实例是相同的实例
:::
实例代码
:::info
- Nuget先下载DI包: Microsoft.Extensions.DependencyInjection
:::
//接口类
public interface ITest {
public string Name { get; set; }
public void SayHi();
}
//实现类
public class Test1 : ITest
{
public string t1 { get; set; } = Guid.NewGuid().ToString();
public string Name { get; set; }
public void SayHi()
{
Console.WriteLine($"Hello,I'am {Name} ---{t1}");
}
}
static void Main(string[] args)
{
//IOC容器
ServiceCollection services = new ServiceCollection();
services.AddScoped<Test1>(); //注册服务
using (ServiceProvider sp=services.BuildServiceProvider())
{
using (IServiceScope ss1 = sp.CreateScope())
{
//从IOC容器取Ibird实例对象
Test1 tt1= ss1.ServiceProvider.GetService<Test1>();
tt1.Name = "www";
tt1.SayHi();
Test1 tt2 = ss1.ServiceProvider.GetService<Test1>();
tt2.Name = "w3";
tt1.SayHi();
Console.WriteLine(object.ReferenceEquals(tt1,tt2));
}
}
Console.Read();
}