• Providers -- 提供者

基本的nest类会被视为service, repository, factory, helper,之后通过constructor来加入依赖关系,那么这样许多个对象可以互相之间建立基本关系,在此过程中,将使用nest作为连接的一种(方式?

image-20210925062314405

Providers的作用是处理更加复杂的任务委托的,声明前要带@Injectable()

Service

我们通过CLI来创建一个service,这个服务负责数据储存和检索,并且被Wee控制器调用

nest g service wee

最后生成出来只是一个很简单的东西,我们还需要加上内容

import { Injectable } from '@nestjs/common';
import { Wee } from 'src/interface/wee.interface';

@Injectable()
export class WeeService {
    private readonly wees: Wee[] = [];

    create(wee: Wee){
        this.wees.push(wee)
    }

    findAll(): Wee[]{
        return this.wees;
    }
}

//wee.interface

export interface Wee {
    name: string,
    age: number
}

那我们必须要找到一个地方来调用他们的呀,我们回到上一节的wee.controller,加多一些代码就好了

import { Controller, Get, Post, Header, Param, Body, HttpCode } from '@nestjs/common';
import { CreateCatDto } from 'src/create-cat-dto';
import { Wee } from 'src/interface/wee.interface';
import { WeeService } from './wee.service';

@Controller('wee')
export class WeeController {
    constructor(private weeService: WeeService) {}

    @Post('h*llo/:id')
    @HttpCode(200)
    create(@Body() createCatDto: CreateCatDto){
        return this.weeService.create(createCatDto)
    }

    @Get()
    async findAll(): Promise<Wee[]>{
        return this.weeService.findAll();
    }

    @Get('h*llo/:id')
    findall(@Param() params): string {
        return 'Hello Wibus! ID: ' + params.id
    }
}

依赖注入

依赖注入在Nest当中是通过constructor来实现的,上面代码当中,我们是使用weeService来创建了一个WeeService实例

constructor(private weeService: WeeService) {}

可选提供者(我不懂

有时,您可能需要解决一些依赖项。例如,您的类可能依赖于一个配置对象,但如果没有传递,则应使用默认值。在这种情况下,关联变为可选的, provider 不会因为缺少配置导致错误。

要指示 provider 是可选的,请在 constructor 的参数中使用 @Optional() 装饰器。

import { Injectable, Optional, Inject } from '@nestjs/common';

@Injectable()
export class HttpService<T> {
  constructor(
    @Optional() @Inject('HTTP_OPTIONS') private readonly httpClient: T
  ) {}
}

请注意,在上面的示例中,我们使用自定义 provider,这是我们包含 HTTP_OPTIONS自定义标记的原因。前面的示例显示了基于构造函数的注入,通过构造函数中的类指示依赖关系。在此处详细了解自定义providers及其关联的 token