NestJS 有一個特性就是模組化開發,我們前兩節講了Provider和Controller,Module將會將兩者在同一個模塊內建立依賴的橋樑。
import { Module } from '@nestjs/common';
import { SchedulesController } from './schedules.controller';
import { SchedulesService } from './schedules.service';
@Module({
controllers: [SchedulesController],
providers: [SchedulesService],
})
export class SchedulesModule {}
因為在同一個Module裡,所以Nest可以在SchedulesController中通過構造函數注入SchedulesService
Module間是可以互相共享使用的,如果今天需要一個CatsService,那就把它放到exports的地方,這樣其他moudle只要imports處導入CatsModule,就能使用CatsService了
import { Module } from '@nestjs/common';
import { CatsController } from './cats.controller';
import { CatsService } from './cats.service';
@Module({
controllers: [CatsController],
providers: [CatsService],
exports: [CatsService]
})
export class CatsModule {}
Module 裝飾器接受一個對象參數,由四種類型的設定,才能識別各種依賴關係:
所以如果要在A Module要使用其他Module中的Provider,那就要在該Provider的Module中將其放進exports中
因為Nest將provider封裝在module中,如果不import module進來就無法使用它們的provider,所以要在很多地方都導入相同Module,就會顯的冗余.所以如果只想要一組隨時可用的provider,就加上@Global()即可.
Global Module被import到root module後,其他module就能在直接使用這個provider.
import { Module, Global } from '@nestjs/common';
import { CatsController } from './cats.controller';
import { CatsService } from './cats.service';
@Global()
@Module({
controllers: [CatsController],
providers: [CatsService],
exports: [CatsService],
})
export class CatsModule {}
這裡的CatsService就變成無處不在了,有其他任何module需要的話也不需在import CatsModule了
特別注意:Nest只能定義一個Global Module,且官網文件中認為將所有東西都放在Global Module裡不是一個好的決定.有需要的話,還是imports 需要的module吧