一、DI的几个概念
1.服务(service):对象(比如说一个数据库操作对象)
2.注册服务:提前准备好那些服务(例如实体类、方法的实现等等)添加到服务容器中。
3.服务容器:负责管理注册的服务(把准备好的实体类、方法等添加到这里,由容器进行接管)
4.消费服务:创建对象以及关联对象
5.对象的生命周期:Transient(瞬态):服务使用完毕即被销毁,每次获取都是一个新的对象;
Scoope(范围):在某一范围内使用,出了这个范围就销毁服务。在这个范围内获取的服务对象都是同一个
Singleton:单例,无论谁获取该服务,拿到的都是一个对象
二、.NET 中的DI
1.根据类型来获取与注册服务。可以分别指定服务类型(service type)和实现类型(implementation)。这两者可能相同,也可能不同。服务类型可以是类,也可以是接口。服务类型尽量使用接口。建议面向接口编程,更灵活。
2…NET控制反转组件取名为DependencyInjection,但是它包含ServiceLocator(服务定位器)的功能
3.使用接口来模拟依赖注入:
TestServiceImpl与TestServiceImpl2实现ITest接口(服务),并实现相应的方法:
运行结果:
三、使用DI
1.首先安装 包Microsoft.Extensions.DependencyInjection
2.引入对应的命名空间
3.ServiceCollection用来构造容器对象IServiceProvider。(先将所有要注册的服务对象放到这个ServiceCollection集合中)调用ServiceCollection的BuildServiceProvider()创建的ServiceProvider对象,可以获取到BuildServiceProvider()之前ServiceCollection中的对象,也就是为业务逻辑所提供的对象
服务接口:
两个实现类:
British:
Chinese:
在Program.cs中实现服务的注册与消费:
使用框架的代码架构:
4.如何体现“控制反转”:首先确定服务的创建者与消费者,消费者很明显是Program.cs类中的应用,但是他们并不需要关心IPerson对象如何实现,应用只需要完成对象的消费即可。对象的控制转移到DI框架中,也就是将British类注册到服务容器当中。而且消费者Program.cs并不能确定它所获取的究竟是Chinese还是Britsh实现,这由服务端决定,更好的体现了所谓“控制反转”。