在 nestjs 當需要把元件或是共享到某一個 Module 中時,可以透過 nestjs 提供一個叫作 provider 的元件角色可以來做這件事。
只要可以被標注是 Injectable 的元件,或是值
上圖說明可以常規的 Provider 的關係圖。簡單來說,就算語法上做的到,也不會把某一個 Controller 注入到另一個 Controller。
但現實上,偶爾還是會看到這種反例。自以為兩個 Controller 的處理函數一樣,想要透過 Controller 注入 另一個 Controller 的 "天才" 。然後就會遇到循環依賴,如果又想透過 moduleRef 去解,就會造成一種世界奇觀。
在 nestjs Module 中要使用依賴注入時,需要把要注入的物件提供在 @Module 裝飾子中的 providers 參數,語法如下:
app.module.ts
import { Module } from '@nestjs/common';
import { AppService } from './app.service';
@Module({
imports: [],
controllers: [],
providers: [AppService],
exports: []
})
export class AppModule {}
而在要被 provide 的物件類別宣告中,需要加入 @Injectable 這個標注,語法如下:
app.service.ts
import { Injectable } from '@nestjs/common';
@Injectable()
export class AppService {
getHello(): string {
return 'Hello World!';
}
}
在 nestjs 程式中,通常會把要分享的共用實作邏輯,封裝在裝飾著 @Injectable 的物件類別中。而這類別通常會被歸類為 Service。
Service 可以是來自第三方的套件,或是自行開發的邏輯,透過 Module 的 providers
屬性可以讓 Service 注入到需要使用的地方
nestjs 透過 Provider 元件提供一個共享邏輯的方式,讓程式能夠透過這種方法有彈性的去做抽換。做到可以維護性高的一個特性,方便修改。
即使如此,還是必須要從官網上,理解共用的邏輯。避免使用去詭異的注入,比如 Controller 注入 Controller 這種錯誤的概念。