FactoryProvider配置依賴對(duì)象

2018-06-06 08:29 更新

閱讀須知

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

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

Console 對(duì)象

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

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

FactoryProvider 的作用

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

FactoryProvider 接口

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

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

FactoryProvider

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

  1. export class LoggerService {
  2. constructor(private enable: boolean) { }
  3. log(message: string) {
  4. if(this.enable) {
  5. console.log(`LoggerService: ${message}`);
  6. }
  7. }
  8. }

LoggerService 的正確配置方式如下:

  1. @NgModule({
  2. ...,
  3. providers: [
  4. HeroService,
  5. {
  6. provide: LoggerService,
  7. useFactory: () => {
  8. return new LoggerService(true);
  9. }
  10. }
  11. ],
  12. bootstrap: [AppComponent]
  13. })
  14. export class AppModule { }

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

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



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

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

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

  1. export class ConsoleService {
  2. log(message) {
  3. console.log(`ConsoleService: ${message}`);
  4. }
  5. }

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

  1. export class LoggerService {
  2. constructor(private enable: boolean,
  3. consoleService: ConsoleService) { }
  4. log(message: string) {
  5. if (this.enable) {
  6. console.log(`LoggerService: ${message}`);
  7. }
  8. }
  9. }

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

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

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

  1. {
  2. provide: LoggerService,
  3. useFactory: () => {
  4. return new LoggerService(true);
  5. }

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

配置 deps 屬性

  1. {
  2. provide: LoggerService,
  3. useFactory: (consoleService) => {
  4. return new LoggerService(true, consoleService);
  5. },
  6. deps: [ConsoleService]
  7. }

更新 AppModule

  1. @NgModule({
  2. ...,
  3. providers: [
  4. HeroService,
  5. ConsoleService,
  6. {
  7. provide: LoggerService,
  8. useFactory: (consoleService) => {
  9. return new LoggerService(true, consoleService);
  10. },
  11. deps: [ConsoleService]
  12. }
  13. ],
  14. bootstrap: [AppComponent]
  15. })
  16. export class AppModule { }

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

  1. LoggerService: Fetching heros...

我有話說(shuō)

工廠函數(shù)是用來(lái)干嘛的?

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

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)