依赖注入,也叫 DI,直接在学习 JAVA 的时候就遇到这个概念,无奈一直没弄明白到底是干嘛的,以及为什么要用它。最近在阅读 Angular 的官方文档时对它有的进一步的认识,总结如下。本文以 Typescript 为例的,语法和 JS 差不多,只是概念的总结,代码只是示意作用。
一、依赖注入
1. 不用依赖注入怎么写代码
以学校为例,学校里有老师和学生两个群体。不使用依赖注入的写法如下:
// School.ts class School { public student: Student; public teacher: Teacher; constructor () { this.student = new Student(); this.teacher = new Teacher(); } }
创建一个学校实例:
// test.ts const school = new School(); // 变量 school 是一个具体的学校
在上述的例子里,老师和学生两个群体是在学校构造函数中定义的,如果现在需要修改学生类的构造函数,如增加一个参数,也就是将 new Student()
改为 new Student(lenth)
那么还需要到 School.ts
中去修改代码。这一点无疑跟我们的解耦性设计思路违背。我们希望的是各个类尽量做到不想关,改一个地方,不需要去改其它地方。
// Student.ts class Student { stuLen: number; constructor (length: number) { this.stdLen = length; } }
// School.ts class School { public student: Student; public teacher: Teacher; constructor () { this.student = new Student(60); // 这一步进行了修改,如果不传参就会报错,因为 Student 构造函数被修改为有参数了 this.teacher = new Teacher(); } }
2. 使用依赖注入如何写
使用依赖注入可以解决上述例子中强耦合的问题。
// School.ts class School { constructor (public student: Student,public teacher: Teacher) {} }
创建一个学校实例:
// test.ts const student = new Student(); const teacher = new Teacher(); const school = new School(student,teacher);
可以看到,将 student
和 teacher
在 test.ts
中先进行实例化,再将实例化对象以传参的形式传递给 School 构造函数,在 School 类的 construtor 函数中以参数的形式进行接收。这样一来,不管 Student 类有什么改变,School.ts 都不许需要进行任何修改。这就是依赖注入的含义。
3. 定义
依赖注入可以解除类与类之间的强耦合性,这在后期代码维护阶段带来很大的便利。如果不使用依赖注入,在后期修改了一个类,其它使用到它的地方也需要进行修改。
二、Angular 的依赖注入框架
前面介绍了依赖注入的含义,我们知道确实可以解耦合,但是写法上并没有带来多少遍历,只是 new
操作的位置改变了而已。
依赖注入框架就是解决写法上便利的问题,按照依赖注入框架来写,我们只需要通过简单的注解,如:@Injectable
就可以创建构造函数实例,不需要再用 new 了。
具体用法可参考 Angular 依赖注入官方文档。
原文链接:https://www.f2er.com/angularjs/146083.html