组件
组件
几乎所有的事物都是一个组件 Service,Repository,Factory,Helper,可以通过构造函数将一个组件注入控制器或者另一个组件中。

在上一章中,我们已经构建了一个简单的控制器 CatsController。
控制器应该只处理HTTP请求并将更复杂的任务委托给组件。 这些组件是一个普通的 TypeScript 类,带有 [@Component](https://github.com/Component) "@Component")() 装饰器。
!> Nest 为了更好的程序设计性,依赖关系组织更加符合面向对象的方式,我们强烈建议程序开发时遵循 SOLID 原则。
我们来创建一个 CatsService 组件:
cats.service.ts
import { Component } from '@nestjs/common';
import { Cat } from './interfaces/cat.interface';
@Component()
export class CatsService {
private readonly cats: Cat[] = [];
create(cat: Cat) {
this.cats.push(cat);
}
findAll(): Cat[] {
return this.cats;
}
}
组件没有什么特别的。这里是一个 CatsService ,一个具有一个属性和两个方法的基本类。 唯一的区别是它有 [@Component](https://github.com/Component) "@Component")() 装饰器。 [@Component](https://github.com/Component) "@Component")() 附加元数据,因此 Nest 知道这个类是一个 Nest 组件。
!> 这里有个Cat 的接口我没有提到它, 因为结构与我们在上一章中创建的 CreateCatDto 类完全相同。
既然我们已经完成了服务类, 让我们在 CatsController 中使用它:
cats.controller.ts
import { Controller, Get, Post, Body } from '@nestjs/common';
import { CreateCatDto } from './dto/create-cat.dto';
import { CatsService } from './cats.service';
import { Cat } from './interfaces/cat.interface';
@Controller('cats')
export class CatsController {
constructor(private readonly catsService: CatsService) {}
@Post()
async create(@Body() createCatDto: CreateCatDto) {
this.catsService.create(createCatDto);
}
@Get()
async findAll(): Promise<Cat[]> {
return this.catsService.findAll();
}
}
这个 Catsservice 是通过类的构造器注入进来的。不必在意这个 private readonly 简写语法,它代表我们已经在这儿创建和初始化了这个 Catsservice 成员。
依赖注入
Nest 是建立在强大的设计模式之上的,这通常称为依赖注入。 在官方的 Angular 文献中有一篇关于这个概念的好文章。
!> 在此处了解更多关于嵌套依赖注入的内容。
使用 TypeScript 管理依赖关系是非常容易的,因为 Nest 只会按类型识别您的依赖关系。 这一行:
constructor(private readonly catsService: CatsService) {}
有一件重要的事情你必须要知道,tsconfig.json 文件中 emitDecoratorMetadata 选项设置为 true。
最后一步
最后一件事是告诉模块,一个叫做 CatsService 的东西确实是存在的。 解决这个问题的唯一的方法是打开 app.module.ts 文件,并将服务放入 [@Module](https://github.com/Module) "@Module")()装饰器 的components 数组中。
app.module.ts
import { Module } from '@nestjs/common';
import { CatsController } from './cats/cats.controller';
import { CatsService } from './cats/cats.service';
@Module({
controllers: [CatsController],
components: [CatsService],
})
export class ApplicationModule {}
现在,Nest 将顺利解决 CatsController 类的依赖关系。 这就是我们的目录结构现在的样子:
-| src/
-| modules/
-|cats/
-| dto/
-| create-cat.dto.ts
-| interfaces/
-| cat.interface.ts
-| cats.service.ts
-| cats.controller.ts
-| app.module.ts
-|server.ts
