ASP.NET Core 3 源码解析 — [1]依赖注入
尊重作者劳动成果,转载请注明出处,谢谢!
目录
1.控制反转
1.1 IoC 设计原则
1.2 依赖注入
2.依赖注入容器
2.1 生命周期
2.2 注册服务
2.3 获取服务
2.4 第三方依赖注入容器
3.实现解析
3.1 设计模型
3.2 ServiceCollection
3.3 ServiceProvider
1.控制反转
1.1 IoC 设计原则
控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。控制反转即将创建对象的控制权或执行业务流程的控制器进行了转移,原先创建对象的主动权和创建时机是由客户端代码控制的,而现在把这种控制权转移到了第三方。
1.2 依赖注入
实现 IOC 设计原则中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。依赖注入(Dependency Injection,缩写为DI),是实现控制反转设计原则最常见的一种模式。IoC 的一个重点是在系统运行中,动态的向某个对象提供它所需要的其它对象,这一点是通过 DI 来实现的。组件之间依赖关系由容器在运行期决定,形象的说,即由容器动态的将某个依赖关系注入到组件之中。依赖注入的目的并非为软件系统带来更多功能,而是为了提升组件重用的频率,并为系统搭建一个灵活、可扩展的平台。通过依赖注入机制,我们只需要通过简单的配置,而无需任何代码就可指定目标需要的资源,完成自身的业务逻辑,而不需要关心具体的资源来自何处,由谁实现。
我们可以简单的理解依赖即创建一个对象时所需要(依赖)的其它对象,而提供这些对象的方式称为注入。依赖注入的方式有以下三种:
- 构造注入:
- 属性注入:
- 方法注入:
2.依赖注入容器
2.1 生命周期
通常我们将某个对象依赖的其它对象称为服务,服务既可以是接口类型,也可以是抽象类或具体类型,每个服务都有其对应的生命周期。.NET Core 的依赖注入框架使用 ServiceLifetime 枚举类型来表示服务的生命周期,ServiceLifetime 包含了 3 个枚举值,定义如下:
public enum ServiceLifetime { /// <summary> /// Specifies that a single instance of the service will be created. /// </summary> Singleton, /// <summary> /// Specifies that a new instance of the service will be created for each scope. /// </summary> /// <remarks> /// In ASP.NET Core applications a scope is created around each server request. /// </remarks> Scoped, /// <summary> /// Specifies that a new instance of the service will be created every time it is requested. /// </summary> Transient }
- Singleton:单例模式,每次从所有容器中获取的实例都是相同的,即获取的实例是全局唯一的。
- Scoped:作用域模式,每次从同一个容器中获取的实例都是相同的,作用域可以理解为每一个线程或每一个 HTTP 请求等的作用范围,当线程退出或 HTTP 请求结束时,作用范围也随之消失。
- Transient:瞬态模式,每次从容器中获取的都是一个新的实例,也可以理解为每次都是 new 了一个新的对象。
2.2 注册服务
2.3 获取服务
2.4 第三方依赖注入容器
3.实现解析
3.1 设计模型
3.2 ServiceCollection
3.3 ServiceProvider