iT邦幫忙

2024 iThome 鐵人賽

DAY 4
1

nestjs 核心元件 Provider

目標

  1. 介紹 nestjs provider 作用
  2. 介紹 Service 與 Provider 關係

什麼是 Provider

在 nestjs 當需要把元件或是共享到某一個 Module 中時,可以透過 nestjs 提供一個叫作 provider 的元件角色可以來做這件事。

什麼元件可以是 Provider

只要可以被標注是 Injectable 的元件,或是值
Provider-relation

上圖說明可以常規的 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!';
  }
}

Service 與 Provider 的關係

在 nestjs 程式中,通常會把要分享的共用實作邏輯,封裝在裝飾著 @Injectable 的物件類別中。而這類別通常會被歸類為 Service。

Service 可以是來自第三方的套件,或是自行開發的邏輯,透過 Module 的 providers 屬性可以讓 Service 注入到需要使用的地方

nestjs Provider Inject 方式

  1. Constructor 方式: 透過 constructor 參數帶入
  2. Property 方式: 以 property 的形式帶入,通常用在有子類別的類別( constructor帶入過多參數的麻煩)

nestjs Provider Inject 範圍

  • DEFAULT: 一整個 App 只存在一個。舉例: ConfigService
  • REQUEST: 一個 Http Request flow 只存在一個。舉例: LoggingInterceptor
  • TRANSIENT: 每個 consumer 各自有一個。舉例: CounterService

結論

nestjs 透過 Provider 元件提供一個共享邏輯的方式,讓程式能夠透過這種方法有彈性的去做抽換。做到可以維護性高的一個特性,方便修改。

即使如此,還是必須要從官網上,理解共用的邏輯。避免使用去詭異的注入,比如 Controller 注入 Controller 這種錯誤的概念。


上一篇
nestjs 核心元件 Module
下一篇
nestjs 核心元件 Controller
系列文
透過 nestjs 框架,讓 nodejs 系統維護度增加26
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言