名词解释
说起依赖注入,很多人会想起两个词:IOC和DI。
IOC(Inversion of Control)=控制反转
DI(Dependency Injection)=依赖注入
IOC其实并不是某项具体的实现技术,它是一种思路(或者是设计理念),这一点很多有经验的同学都会搞混。如果用白话来讲,IOC就意味着把对象交给IOC容器控制,而不是在对象内部控制。简而言之就是“容器控制对象”。
套入到程序来说,我们有两个class,A、B,如果B要用到A的方法,传统的方法是在B中添加A的引用(比如new),这种就算是“正转”,但如果我们把这个过程IOC容器去控制,那就是“反转”。IOC也不能为程序带来更多功能,其主要目的是为了提升重用率、增强扩展性、降低耦合性、增强对程序设计的理解。
DI是什么呢?可以把它理解为IOC的另一种解释方式。可能是IOC的概念听起来的确云里雾里,所以有位大佬(Martin Fowler)给出了一个新的名词DI,明确指出“被注入对象依赖IoC容器配置依赖对象”,从另一个角度解释了IOC的理念。
net core的实现
net core自带ioc容器,如果你想把某个对象交给ioc容器来控制,最简单的使用方法就是在你的startup.cs中添加代码,如下:
public void ConfigureServices(IServiceCollection services)
{
services.AddScoped<XXX>();
services.AddTransient<XXX>();
services.AddSingleton<XXX>();
}
在这个阶段,需要注意交给ioc容器控制的对象有三种声明周期可以选择:
Scoped:作用域模式,每一次注入只会生成一个对象。
Transient:瞬态模式,每一次注入都生成新的对象。
Singleton:单例模式,只会生成一次。
如果需要使用被注入的对象,只需要在构造函数中添加被注入类型的对象即可,如下:
private readonly XXX _x;
public ADController(XXX x)
{
_x = x;
}
当有多个对象时如法炮制。
PS
这是在掘金的第一篇文章,就先从依赖注入起,开始梳理自身知识体系,顺便锻炼下自己的文笔。满足自己的前提下也希望对他人有所帮助,共勉之。