Angular 2 之七 依賴注入

概述
Angular 2使用自己的依賴注入框架并采用構(gòu)造注入方式尖殃,依賴注入分兩個步驟: 1) 向injector注冊Provider 2) 構(gòu)造類時injector根據(jù)參數(shù)注入對應(yīng)的實(shí)例偷溺。

enter image description here

如上圖所示,注冊時在injector中建立注入名稱和注入實(shí)例的對照表照筑,獲取時根據(jù)注入名稱返回對應(yīng)的注入實(shí)例。在同一injector中瘦陈,注入實(shí)例相當(dāng)于Singleton凝危。
injector可以編碼顯式調(diào)用;Angular 2構(gòu)造時自動獲取注入實(shí)例晨逝,一般地不需要顯式調(diào)用蛾默。
如果服務(wù)依賴于另一個服務(wù),在定義服務(wù)類時需要加@Injectable標(biāo)注捉貌;建議所有服務(wù)均使用@Injectable標(biāo)注支鸡。
Provider
依賴注入注冊有以下三種方式:
1. 注冊類 Class Provider
最常見的類注冊表達(dá)式如[LoggerService]
冬念,是以下表達(dá)式的縮寫
[new Provider(LoggerService, {useClass: LoggerService })]

參數(shù)含義如下:
第一個參數(shù)是注入名稱(token)
第二個參數(shù)用于產(chǎn)生注入實(shí)例。

可以使用其他類提供注入實(shí)例牧挣,如:
[ provider(LoggerService, { useClass: BetterLogger }) ]

也可以指定注入名稱的別名急前,如:
[ LoggerService , provider(OtherLogger, {useExisting: LoggerService }) ]

2. 注冊值 Value Provider
可以直接指定注入的實(shí)例浸踩,如:
[ provider(LoggerService, { useValue: loggerInstance }) ]

3. 注冊工廠方法 Factory Provider
當(dāng)需要根據(jù)動態(tài)值確定依賴注入的實(shí)例是叔汁,可使用工廠方法注入。
注入名稱 DI Token
以上注入的都是類實(shí)例检碗,注入名稱是類的類型据块。
如果注入的不是類(如字符串、Object或函數(shù))折剃,注入名稱可以是:
常量字符串
OpaqueToken:優(yōu)于在代碼中直接使用常量字符串另假。

在此情況下,構(gòu)造函數(shù)語法如下:
constructor(@Inject(APP_CONFIG) private config: Config) { ... }

層級依賴注入
Angular 2有兩種注冊方式:
bootstrap函數(shù)的第二個參數(shù)
@Component的providers元數(shù)據(jù)

前者創(chuàng)建全局級依賴注入怕犁,整個應(yīng)用一個實(shí)例边篮;后者創(chuàng)建組件級依賴注入,每個組件擁有自己的實(shí)例奏甫。形成的依賴注入樹如下圖所示:[圖片上傳中戈轿。。阵子。(2)]
一般地思杯,組件在自身injector找不到注入名稱時,到父組件injector中查找挠进,直至全局級injector為止色乾。
根據(jù)前面的說明,類注入可以使用其他類提供實(shí)例领突。這意味著在依賴注入樹中暖璧,同名的注入名稱在不同層級可能對應(yīng)到不同類型的實(shí)例。為避免注入錯誤的類型實(shí)例君旦,Angular 2提供以下措施:
構(gòu)造函數(shù)參數(shù)@Host標(biāo)注:表示該參數(shù)的注入查找到該組件的上層宿主元素為止澎办;
@Component標(biāo)注的viewProviders元數(shù)據(jù):本組件使用的注入名稱可以從viewProviders列表查詢。viewProviders對子組件樹不可見于宙,因此如果是某個子組件查詢同名的注入名稱浮驳,則可以繼續(xù)向上層組件查詢。

一般地捞魁,推薦使用@Component providers元數(shù)據(jù)注冊至会;除了通過服務(wù)進(jìn)行組件間交互情況,因?yàn)榻换サ慕M件必須共享同一實(shí)例谱俭。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末奉件,一起剝皮案震驚了整個濱河市宵蛀,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌县貌,老刑警劉巖术陶,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異煤痕,居然都是意外死亡梧宫,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進(jìn)店門摆碉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來塘匣,“玉大人,你說我怎么就攤上這事巷帝〖陕保” “怎么了?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵楞泼,是天一觀的道長驰徊。 經(jīng)常有香客問我,道長堕阔,這世上最難降的妖魔是什么棍厂? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮超陆,結(jié)果婚禮上勋桶,老公的妹妹穿的比我還像新娘。我一直安慰自己侥猬,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布捐韩。 她就那樣靜靜地躺著退唠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪荤胁。 梳的紋絲不亂的頭發(fā)上瞧预,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天,我揣著相機(jī)與錄音仅政,去河邊找鬼垢油。 笑死,一個胖子當(dāng)著我的面吹牛圆丹,可吹牛的內(nèi)容都是我干的滩愁。 我是一名探鬼主播,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼辫封,長吁一口氣:“原來是場噩夢啊……” “哼硝枉!你這毒婦竟也來了廉丽?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤妻味,失蹤者是張志新(化名)和其女友劉穎正压,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體责球,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡焦履,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了雏逾。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嘉裤。...
    茶點(diǎn)故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖校套,靈堂內(nèi)的尸體忽然破棺而出价脾,到底是詐尸還是另有隱情,我是刑警寧澤笛匙,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布侨把,位于F島的核電站,受9級特大地震影響妹孙,放射性物質(zhì)發(fā)生泄漏秋柄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一蠢正、第九天 我趴在偏房一處隱蔽的房頂上張望骇笔。 院中可真熱鬧,春花似錦嚣崭、人聲如沸笨触。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽芦劣。三九已至,卻和暖如春说榆,著一層夾襖步出監(jiān)牢的瞬間虚吟,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工签财, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留串慰,地道東北人。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓唱蒸,卻偏偏與公主長得像邦鲫,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子油宜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 版本:Angular 5.0.0-alpha 依賴注入是重要的應(yīng)用設(shè)計(jì)模式掂碱。它使用得非常廣泛怜姿,以至于幾乎每個人都稱...
    soojade閱讀 2,992評論 0 3
  • 一、什么是依賴注入 控制反轉(zhuǎn)(IoC) 控制反轉(zhuǎn)的概念最早在2004年由Martin Fowler提出疼燥,是針對面向...
    Keriy閱讀 3,182評論 0 8
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理沧卢,服務(wù)發(fā)現(xiàn),斷路器醉者,智...
    卡卡羅2017閱讀 134,701評論 18 139
  • Angular 2是一個幫助我們使用HTML和JavaScript構(gòu)建客戶端應(yīng)用的框架但狭。這個框架包含幾個互相協(xié)作的...
    JasonQiao閱讀 7,124評論 1 48
  • Angular 2架構(gòu)總覽 - 簡書http://www.reibang.com/p/aeb11061b82c A...
    葡萄喃喃囈語閱讀 1,486評論 2 13