iT邦幫忙

2024 iThome 鐵人賽

DAY 2
1

nestjs 的依賴注入概念

什麼是依賴

實體物品依賴

汽車需要透過四個輪子與引擎來組裝
這時,就可以說汽車對於輪子與引擎具有依賴

系統服務間的依賴

以下圖為例:
image

假設一個應用服務 app 啟動時需要使用 queue service , db service, log service。這時就可以說 queue service, db service, 與 log service 是 app 的依賴。也就是說 app 需要這些 service 才能運行起來。

以組合的關係來看就如下圖:

image

以程式碼的角度來說

export class MapService {}

export class PathFinder {
	private mapService: MapService;
	constructor() {
		this.mapService = new MapService();
	}
}

代表
image

什麼是依賴注入

  • 一種設計框架
  • 透過帶入參數依賴的方式,降低兩個相依物件耦合

依賴注入的概念

以上面的範例中,因為 PathFinder 會需要 MapService 做建構。因此變成 PathFinder 生命周期會被綁定在 MapService 上。

然而,為了讓 PathFinder 降低對 MapService 的生命周期依賴。可以透過把 MapService 由 constructor 傳入已經生成好的 MapService 實體,這種方式稱為依賴注入。

而更好的方式是把注入的類別做抽象化,也就是可以讓注入的實體只依賴於抽象類別或是介面。把原本由依賴具體類別改成依賴於抽象介面,這種概念成為依賴反轉。這樣彼此的相依程度會更加降低,以方便做測試隔離。

nestjs 的依賴注入

目前在 nestjs 框架中提供的依賴注入方式有兩種

  1. 建構子注入
@Injectable()
export class MapService {
}

export class PathFinder {
	constructor(private readonly mapService: MapService) {
		
	}
}
  1. 屬性注入
@Injectable()
export class MapService {
}

export class PathFinder {
	@Inject(MapService) mapService: MapService;
}

這個 DI 容器特性讓 nestjs 的程式能夠讓程式元件間的耦合度降低,方便於測試以及對程式做修改

結論

nestjs 框架俱備 DI 容器,方便透過注入方式共用元件,讓程式具有方便修改的特性,增加了元件隔離性方便測試。


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

尚未有邦友留言

立即登入留言