素材巴巴 > 程序开发 >

议 Angular 依赖注入

程序开发 2023-09-06 16:51:03

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

依赖注入,也叫 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 构造函数

// Student.ts
 class Student {stuLen: number;constructor (length: number) {this.stdLen = length;}
 }
 

修改 School.ts 文件中的 Student()

// 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);
 

可以看到,将 studentteachertest.ts 中先进行实例化,再将实例化对象以传参的形式传递给 School 构造函数,在 School 类的 construtor 函数中以参数的形式进行接收。这样一来,不管 Student 类有什么改变,School.ts 都不许需要进行任何修改。这就是依赖注入的含义。

3. 定义

依赖注入可以解除类与类之间的强耦合性,这在后期代码维护阶段带来很大的便利。如果不使用依赖注入,在后期修改了一个类,其它使用到它的地方也需要进行修改。

二、Angular 的依赖注入框架

前面介绍了依赖注入的含义,我们知道确实可以解耦合,但是写法上并没有带来多少遍历,只是 new 操作的位置改变了而已。

依赖注入框架就是解决写法上便利的问题,按照依赖注入框架来写,我们只需要通过简单的注解,如:@Injectable 就可以创建构造函数实例,不需要再用 new 了。

具体用法可参考 Angular 依赖注入官方文档。

转载于:https://my.oschina.net/dkvirus/blog/1541804


标签:

素材巴巴 Copyright © 2013-2021 http://www.sucaibaba.com/. Some Rights Reserved. 备案号:备案中。