Angular 4 依賴注入教程之五 FactoryProvider配置依賴對(duì)象

目錄

閱讀須知

本系列教程的開發(fā)環(huán)境及開發(fā)語(yǔ)言:

基礎(chǔ)知識(shí)

Console 對(duì)象

Console 對(duì)象可以在任何全局對(duì)象中訪問,如 WindowWorkerGlobalScope 以及通過屬性工作臺(tái)提供的特殊定義扮饶。在瀏覽器中我們可以通過 Window.console 訪問 console 對(duì)象望迎,使用示例如下:

console.log('My nickname is semlinker');

FactoryProvider 的作用

FactoryProvider 用于告訴 Injector (注入器)性雄,通過調(diào)用 useFactory 對(duì)應(yīng)的函數(shù)怀读,返回 Token 對(duì)應(yīng)的依賴對(duì)象褐耳。

FactoryProvider 接口

export interface FactoryProvider {
  // 用于設(shè)置與依賴對(duì)象關(guān)聯(lián)的Token值,Token值可能是Type陪拘、InjectionToken厂镇、
  // OpaqueToken的實(shí)例或字符串
  provide: any;
  // 設(shè)置用于創(chuàng)建對(duì)象的工廠函數(shù)
  useFactory: Function;
  // 依賴對(duì)象列表
  deps?: any[];
  // 用于標(biāo)識(shí)是否multiple providers,若是multiple類型左刽,則返回與Token關(guān)聯(lián)的依賴
  // 對(duì)象列表
  multi?: boolean;
}

FactoryProvider的使用 這篇文章中捺信,我們已經(jīng)介紹了 FactoryProvider 的一些相關(guān)知識(shí)。接下來我們將介紹如何使用 FactoryProvider 配置依賴對(duì)象欠痴。

FactoryProvider

俗話說得好迄靠,溫故而知新。我們先來回顧一下上一節(jié)創(chuàng)建的 LoggerService 服務(wù):

export class LoggerService {
    constructor(private enable: boolean) { }

    log(message: string) {
        if(this.enable) {
           console.log(`LoggerService: ${message}`);
        }
    }
}

LoggerService 的正確配置方式如下:

@NgModule({
   ...,
   providers: [
     HeroService,
     {
      provide: LoggerService, 
      useFactory: () => {
        return new LoggerService(true);
      }
    }
   ],
  bootstrap: [AppComponent]
})
export class AppModule { }

在繼續(xù)介紹前喇辽,我們先來了解一下 Angular 的一大特色:

跨平臺(tái)開發(fā)

學(xué)習(xí)如何基于 Angular 構(gòu)建應(yīng)用程序掌挚,并復(fù)用代碼和技能來構(gòu)建適用于所有平臺(tái)的應(yīng)用。比如:Web應(yīng)用菩咨、移動(dòng)Web應(yīng)用吠式、原生移動(dòng)應(yīng)用和原生桌面應(yīng)用等。

沒錯(cuò)抽米,Angular 框架的一大特色就是跨平臺(tái)開發(fā)特占。回到正題云茸,不知道讀者有沒有察覺到是目,在 LoggerService 類中的 log() 方法內(nèi),我們是直接使用 console.log() 方法輸出調(diào)試信息查辩。雖然在大多數(shù)情況下胖笛,我們的應(yīng)用都是運(yùn)行在瀏覽器環(huán)境下,但 console.log() 存在兼容性問題 (了解詳細(xì)信息 - Can I Use)宜岛。除此之外长踊,假如日后我們的應(yīng)用需要運(yùn)行在其它平臺(tái)下,就會(huì)出現(xiàn)問題萍倡。

為了解決上述問題身弊,我們可以創(chuàng)建一個(gè) ConsoleService 服務(wù),且該服務(wù)需實(shí)現(xiàn)統(tǒng)一的 Console 接口列敲。但本文的重點(diǎn)不在這里阱佛,因此我們先簡(jiǎn)單實(shí)現(xiàn)一個(gè) ConsoleService 服務(wù):

export class ConsoleService {
    log(message) {
        console.log(`ConsoleService: ${message}`);
    }
}

接下來我們就需要更新先前的 LoggerService 服務(wù):

export class LoggerService {
    constructor(private enable: boolean,
      consoleService: ConsoleService) { }

    log(message: string) {
        if (this.enable) {
            console.log(`LoggerService: ${message}`);
        }
    }
}

但當(dāng)我們更新完 LoggerService ,成功保存后戴而,你會(huì)看到以下異常信息:

app.module.ts (27,16): Supplied parameters do not match any signature of call target.

這說明提供的參數(shù)與調(diào)用目標(biāo)的簽名不匹配凑术,這是因?yàn)樵?AppModule 中,LoggerService 的配置方式是:

{
  provide: LoggerService, 
  useFactory: () => {
    return new LoggerService(true);
}

而此時(shí) LoggerService 構(gòu)造函數(shù)輸入?yún)?shù)的個(gè)數(shù)為兩個(gè)所意,因此會(huì)拋出上面的異常淮逊。那么我們應(yīng)該怎么解決這個(gè)問題呢催首?這時(shí)我們就要利用 FactoryProvider 接口中定義的 deps 屬性,來聲明 LoggerService 所依賴的對(duì)象泄鹏。

配置 deps 屬性

{
  provide: LoggerService, 
  useFactory: (consoleService) => {
    return new LoggerService(true, consoleService);
  },
  deps: [ConsoleService]
}

更新 AppModule

@NgModule({
   ...,
   providers: [
     HeroService,
     ConsoleService,
     {
      provide: LoggerService, 
      useFactory: (consoleService) => {
        return new LoggerService(true, consoleService);
      },
      deps: [ConsoleService]
    }
   ],
  bootstrap: [AppComponent]
})
export class AppModule { }

當(dāng)更新完代碼郎任,然后再來一個(gè)華麗的保存操作,最后打開你的控制臺(tái)备籽,你又看到預(yù)期的輸出信息:

LoggerService: Fetching heros...

我有話說

工廠函數(shù)是用來干嘛的舶治?

在現(xiàn)實(shí)生活中,工廠是用來生產(chǎn)產(chǎn)品的车猬,如鞋子工廠用來生產(chǎn)鞋子霉猛。而 FactoryProvider 接口中 useFactory 屬性對(duì)應(yīng)的工廠函數(shù)就是用來創(chuàng)建依賴對(duì)象。此外生產(chǎn)一雙鞋子也需要對(duì)應(yīng)的材料诈唬,如鞋底韩脏、鞋帶等,而創(chuàng)建依賴對(duì)象也可能需要依賴其它對(duì)象铸磅,因此 FactoryProvider 接口中定義了 deps 屬性用來聲明依賴對(duì)象列表。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末杭朱,一起剝皮案震驚了整個(gè)濱河市阅仔,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌弧械,老刑警劉巖八酒,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異刃唐,居然都是意外死亡羞迷,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門画饥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來衔瓮,“玉大人,你說我怎么就攤上這事抖甘∪劝埃” “怎么了?”我有些...
    開封第一講書人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵衔彻,是天一觀的道長(zhǎng)薇宠。 經(jīng)常有香客問我,道長(zhǎng)艰额,這世上最難降的妖魔是什么澄港? 我笑而不...
    開封第一講書人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮柄沮,結(jié)果婚禮上回梧,老公的妹妹穿的比我還像新娘逐工。我一直安慰自己,他們只是感情好漂辐,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開白布泪喊。 她就那樣靜靜地躺著,像睡著了一般髓涯。 火紅的嫁衣襯著肌膚如雪袒啼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,554評(píng)論 1 305
  • 那天纬纪,我揣著相機(jī)與錄音蚓再,去河邊找鬼。 笑死包各,一個(gè)胖子當(dāng)著我的面吹牛摘仅,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播问畅,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼娃属,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了护姆?” 一聲冷哼從身側(cè)響起矾端,我...
    開封第一講書人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎卵皂,沒想到半個(gè)月后秩铆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡灯变,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年殴玛,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片添祸。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡滚粟,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出膝捞,到底是詐尸還是另有隱情坦刀,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布蔬咬,位于F島的核電站鲤遥,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏林艘。R本人自食惡果不足惜盖奈,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望狐援。 院中可真熱鬧钢坦,春花似錦究孕、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至禾酱,卻和暖如春微酬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背颤陶。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工颗管, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人滓走。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓垦江,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親搅方。 傳聞我的和親對(duì)象是個(gè)殘疾皇子比吭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

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