快速入門Angular(二):依賴注入@injectable 與 provider
前言
若不熟悉依賴注入、控制反轉…這些名詞,可以參考我的另一篇簡單介紹依賴注入、控制反轉
先對他有基本認識,會比較容易理解為什麼Angular會採用依賴注入
@Injectable vs Provider
@injectable | provider | |
---|---|---|
中文意思 | 可被注入的 | 提供者 |
使用位置 | 是一裝飾器,寫在service上 | 是ngModule或Component傳入參數 |
主要功能 | 用以標記此class具有依賴注入的特性 | 傳入模組,做為該模組的公用函數 |
補充說明 | 由於只有service會使用依賴注入,也就是只有service才會打上此裝飾器 | 通常寫在ngModule就好。若是Component間不想要共用,需要各自實例化自己的service避免干擾,則寫在Component的provider裡面 |
寫ngModule或component都會有跟自己名字相似的裝飾器
但service卻沒有@service裝飾器?其實就是@injectable
畢竟service主要功能是當要使用時才注入,用injectable(可被注入的)字眼可以更形象地表達他的用途!
@injectable 中的參數 providedIn
@Injectable({
providedIn: 'root',
})
這是在Angular 6中新加入的功能
大部份情況下,providedIn直接寫'root'
就好,Angular會自動判斷該打包到哪裡
只有真正使用此service的才會注入進去,未使用到的部份會搖樹優化(tree-shaking)掉
在providedIn
出現之前,service通常是直接寫在ngModule中來注入,就會造成大量的服務打包進去
參考資料
知乎/Angular 6+依赖注入使用指南:providedIn与providers对比
Angular官方文件/多級依賴注入器