Nest.js - Providers
2020-07-10 本文已影响0人
stevekeol
controllers
处理 HTTP 请求
并将更复杂的任务委托给providers
.
- Provider 只是一个用 @Injectable() 装饰器注释的类
- 对象可以彼此创建各种关系,并且“连接”对象实例的功能在很大程度上可以委托给 Nest运行时系统
- Providers 是纯粹的 JavaScript 类,在其类声明之前带有 @Injectable()装饰器
1. 服务
//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 {
//CatsService 是通过类构造函数注入的.
constructor(private catsService: CatsService) {}
@Post()
async create(@Body() createCatDto: CreateCatDto) {
this.catsService.create(createCatDto);
}
@Get()
async findAll(): Promise<Cat[]> {
return this.catsService.findAll();
}
}
//interfaces/cat.interface.ts
export interface Cat {
name: string;
age: number;
breed: string;
}
// cats.service.ts : 负责数据存储和检索
import { Injectable } from '@nestjs/common';
import { Cat } from './interfaces/cat.interface';
//Nest通过@Injectable()知道CatsService是一个装饰器.
@Injectable()
export class CatsService {
private readonly cats: Cat[] = [];
create(cat: Cat) {
this.cats.push(cat);
}
findAll(): Cat[] {
return this.cats;
}
}
//用CLI创建服务类
$ nest g service cats
- server.ts中通过@Injectable()告诉Nest该类是一个Provier;
- controller.ts中通过@Controller()告诉Nest该类是一个Controller;
- controller.ts中类CatsController中的CatsService是通过类构造函数注入的,因此可以this.catsService使用;
2. 依赖注入
参考文章
Nest是建立在强大的设计模式,通常称为依赖注入
.
- 依赖,是当类需要执行其功能时,所需要的服务或对象。 DI 是一种编码模式,其中的类会从外部源中请求获取依赖,而不是自己创建它们。
- 我们创建的类提供了一个服务,
@Injectable()
装饰器把它标记为可供注入的服务; 该注入器负责创建服务实例,并把它们注入到controller的类中。
constructor(private readonly catsService: CatsService) {}
3. 作用域 ---???
Provider通常具有和应用程序生命周期相同的的生命周期('作用域'):应用程序启动时,必须解析依赖项,因此必须实例化每个Provider。当应用程序关闭时,每个Provider都将被销毁。但有方法可以改变Provider的生命周期,参考
4. 自定义Provider ---?
Nest有一个内置的控制反转("IOC")容器,可以解决Providers之间的关系。参考
5. 默认Provider --- ?
import { Injectable, Optional, Inject } from '@nestjs/common';
@Injectable()
export class HttpService<T> {
constructor(
@Optional() @Inject('HTTP_OPTIONS') private readonly httpClient: T
) {}
}
6. 基于属性的注入 - 略
- 以上称之为
基于构造函数的注入
; - 如果您的类没有扩展其他提供者,你应该总是使用基于构造函数的注入。