一、什么是依赖注入
- 依赖注入( Dependency Injection = DI)的概念:把有依赖关系的类放到容器中,解析出这些类的实例。
- 注入什么东西:应用程序依赖容器创建并注入它所需要的外部资源
- 为什么需要依赖注入(目的):实现类的解耦。
- 依赖注入的原理
- 好处:如果后期代码因改动量过大,这样做可以减少维护和管理的量。
- 在ASP.NET Core中,依赖注入是最基础的。任何你想使用的类型,都得注入进来才可以使用。
- 设计原则:依赖于抽象(接口),而不是具体的实现。(解释:喝水依赖于喝水的工具,而不关心是马克杯还是保温杯等)
- 接口特征:不可以被实例化,不能有构造方法;接口中的所有成员都是public,static,final;接口中的方法都是抽象方法,接口中的方法会自动使用public abstract修饰;一个类可以同时实现多个接口;实现类必须实现接口中的所有方法;接口可以继承接口。
- 抽象类和接口的相同点:都代表系统的抽象层、都不能被实例化、都能包含抽象方法
- 例子理解:如果一个类A的功能实现需要借助于类B,那么就称类B是类A的依赖,如果在类A的内部去实例化类B,那么两者之间会出现较高的耦合。 一旦B出现了问题,A也需要进行改造,如果这样的情况较多每个类之间都有很多依赖,程序会极难维护并且很容易出现问题。要解决这个问题,就要把A对B的控制权拿出来,交给一个第三方去做,把控制权反转给第三方,就叫控制反转。由第三方(我们称作IOC容器)来控制依赖,把它通过构造函数、属性或者工厂模式等方法,注入到A内,这样就极大程度的对A和B进行了解耦。
- 个人理解:把A本来需要从B获得的东西(依赖),通过第三方(控制反转)换一种方式给(注入)它。
二、控制反转
- 概念(Inversion Of Control = IOC):控制反转IOC是一个重要的面向对象编程的法,
- 为什么反转:为了在业务变化的时候尽量减少改动代码造成的问题。
- 反转的目的:控制反转用于解耦( 用来削减计算机程序的耦合问题)
- 控制反转的实现方式(实现手段):依赖注入DI(最常见)、依赖查找DL(Dependency Lookup)
三、IOC容器
-
容器是什么
-
容器的构建和规则
-
IOC容器是由框架提供的,我们只要会用就行了。
-
IOC容器本身也是一个对象,只不过这个对象里面存储的都是已注册的类型。
-
常见的IOC框架:微软自带DI、Autofac、Unity
-
什么时候创建/使用:需要依赖管理的时候就可以用IOC。
-
作用:
- 注册类型:把一些类注册到容器中。在我们当前这个环境下我们要 服务注册 。
- 解析实例。如果我们想要获取A类,我们在容器里注册一个A类,这时候我们想要获得A的实例,我们一般会去 new A () ,但是现在我们只需要直接从容器里来请求这个实例。
- 管理实例的生命周期。
.NET Core DI
-
DI在 .NET扩展包 里。
-
关系:IOC是一种设计思想,而DI是这种设计思想的一个最典型的实现。正是因为用到了依赖注入的手段,所以才产生了控制反转这个结果。
-
使用DI的好处?
- 让程序之间松散耦合,减少依赖,有利于功能复用。
- 让程序整体结构更加灵活,有利于单元测试。
-
实例的注册
-
服务的生命周期(三个)(在start.up类中ConfigureServices方法对实例进行注册)
-
单例生存期:整个应用程序生命周期以内只在第一次被请求时创建一个实例,后续每个请求都使用相同的实例。
services.AddSingleton<IMessageService>();
-
Transient(暂时/瞬时生存期):在每次请求时都会创建一个新实例。
services.AddTransient<IMessageService, EmailService>();
-
Scoped(作用域生存期):作用域生存期。在同一个作用域内只初始化一个实例 ,每一个请求只创建一个实例,同一个请求会在一个作用域内。
services.AddScoped<IMessageService, EmailService>();
-
五、DI在ASP.NET Core中的基本用法
-
在Startup类中初始化
-
Controller中使用
-
View中使用
-
通过HttpContext来获取
-
依赖注入的实现方式/基本用法(三种)
-
构造函数注入(最常用的注入方式,主要要会写这个)
-
如果你需要添加一个自定义服务类,你就需要选择一个生存期。
-
构造函数注入常用于在服务构建上定义和获取服务依赖。
-
-
setter注入
-
接口注入:接口注入使用接口来提供setter方法
-
-
如何使用依赖注入
- 在 ASP.NET Core中已经内置了一套依赖注入的容器,我们可以直接使用。在Startup.ConfigureServices中添加我们要注册的服务和实现,添加的时候可以对服务的生命周期进行相应的配置,然后就可以在PageModel、Controller、Views等需要的地方使用了。