您好,登錄后才能下訂單哦!
angular官方文檔單例服務(wù)的說明
單例模式就不要說了,懂點設(shè)計模式的都懂得,真有不明白的自行百度。
(解釋下angular的命名,angular就是angular2+,angular1叫angularjs,至于angular2,3,4,5,6只是angular的版本,通稱angular,希望小伙伴不要叫錯了)
單例模式如何在angular的服務(wù)中使用呢,angular的官方文檔中有這么一段話:
單例服務(wù)
服務(wù)在每個注入器的范圍內(nèi)是單例的。 在任何一個注入器中,最多只會有同一個服務(wù)的一個實例。
這里只有一個根注入器,而 UserService 就是在該注入器中注冊的。 所以,在整個應(yīng)用中只能有一個 UserService 實例,每個要求注入 UserService 的類都會得到這個服務(wù)實例。
不過,Angular DI 是一個 多級注入系統(tǒng),這意味著各級注入器都可以創(chuàng)建它們自己的服務(wù)實例。 Angular 總會創(chuàng)建多級注入器。
籠統(tǒng),并不知道依賴注入服務(wù)單例模式怎么用,要想弄明白很簡單,簡單的寫個例子實驗一下就可以了,下面我會給大家說一下我的實驗總結(jié),幫助小伙伴節(jié)約一些這種乏味的探索時間。
實驗樣例代碼
服務(wù)代碼
import { Injectable } from '@angular/core'; @Injectable( //{providedIn: 'root'} ) export class SingletonServiveTestService { private _name = "primaryName"; constructor() { } setName (name){ this._name = name; } getName(){ return this._name; } }
小伙伴可能會說了,這TM怎么會是單例模式。小伙伴不要激動,我也是這么想的,怎么TM怎么會是單例。不過在angular的依賴注入中,有幾種寫法確實會使這種代碼以單例模式的方式運行。
解釋下{providedIn: 'root'},一開始認為只要傳入這個對象,讓服務(wù)以root的方式提供給子module,子組件,然后這個服務(wù)就是單例的,后臺發(fā)現(xiàn),這個對象和單例沒有半毛錢關(guān)系,它只是app.module中引入服務(wù)的另一種寫法,除了這個用處,沒有別的用處,所以下文中我們就不說添加和不添加{providedIn: 'root'}的情況了
注入代碼
注入分為Module.providers和Component.providers兩種;實驗的module是實現(xiàn)懶加載的。
上面代碼的測試結(jié)果(module都是懶加載的)
這三個結(jié)果已經(jīng)代表各種情況了,如果小伙伴還想知道其他一些情況的下的結(jié)果,小伙伴可以自己動手寫個例子,或者給我留言
單例不都通過靜態(tài)屬性來實現(xiàn)的嗎?
我認為單例就是實現(xiàn)屬性方法的保持一個實例,而angular中想用到單例多是實現(xiàn)一些數(shù)據(jù)整個項目通用,按照設(shè)計模式上講上面和下面的代碼都不是標(biāo)準(zhǔn)的單例模式的寫法,但是在實際使用中確實是達到了單例模式的目的,上嗎的有angular的官方文檔做背書,所以我就寫了上嗎那種在angular中可以是單例模式,至于下面這中我就叫靜態(tài)屬性單一模式,ts靜態(tài)屬性被編譯成正常的js,就是構(gòu)造函數(shù)上的屬性而已,概念高大上,原理矮小low。
import { Injectable } from '@angular/core'; @Injectable() export class SingletonServiveTestService { private static _name = "primaryName"; constructor() { } setName (name){ SingletonServiveTestService._name = name; } getName(){ return SingletonServiveTestService._name; } }
這個實驗著在各種情況下都能表現(xiàn) 單例 特征
這種方法萬金油,單例就用這中不久ok了,小伙伴寫代碼要考究,莫要粗放。結(jié)合上面代碼代碼的單例實現(xiàn)根據(jù)具體使用場景來選擇用那種方式。
真正嚴格的用單例模式的話是用不上angular服務(wù)的依賴注入的這套機制的。至于要不要使用單例拋掉依賴注入,看業(yè)務(wù)場景了。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持億速云。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。