Nest是以模块作为应用组件进行开发的,开发时需要注重模块化的编程思想。
We want to emphasize that modules are strongly recommended as an effective way to organize your components.
我们要强调的是,强烈建议将模块作为组织组件的有效方式。
一个简单的Nest模块
Nest.js的模块化用到了面向对象(OOP)
和依赖注入(DI)
的设计方法。
OOP编程
面向对象编程OOP三大要素:封装
、多态
和继承
封装就是把抽象的数据和对数据进行的操作封装在一起,意味着OOP也具有模块化的特点,只是封装的服务边界是对象内。
例如:
import {
Cat } from './interfaces/cat.interface';
export class CatsService {
private readonly cats: Cat[] = [];
create(cat: Cat) {
this.cats.push(cat);
}
findAll(): Cat[] {
return this.cats;
}
}
依赖注入
依赖注入(dependency injection,DI)的意思为,给予调用方它所需要的事物。
“依赖”是指可被方法调用的事物
。依赖注入形式下,调用方不再直接使用“依赖”,取而代之是“注入” 。“注入”是指将“依赖”传递给调用方的过程
。在“注入”之后,调用方才会调用该“依赖”。传递依赖给调用方,而不是让让调用方直接获得依赖,这个是该设计的根本需求。
上面讲到的依赖注入是一种控制反转 (IoC)技术,将依赖项的实例化
委托给IoC 容器
(NestJS中有自己的全局IoC容器)。
注册过程实际上就是取一个IoC容器的token(一般是类的名称),关联到依赖项(实例化对象),这是包含“依赖查找”和“依赖注入”的过程。如果没有找到“依赖项”,Nest将创建一个实例,缓存它,然后返回它,或者如果已经缓存了一个实例,则返回现有实例。
Nest中是如何实现的呢?先看看下面代码
// cat.service.ts
import {
Injectable } from '@nestjs/common';
import {
Cat } from './interfaces/cat.interface';
@Injectable() // 定义可注入到IoC的依赖项
export class CatsService {
private readonly cats: Cat[] = [];
create(cat: Cat) {
this.cats.push(cat);
}
findAll(): Cat[] {
return this.cats;