Angular6的服務和依賴注入

Angular 把組件和服務區分開,以提升模塊性和複用性。服務器

  • 經過把組件中和視圖有關的功能與其餘類型的處理分離開,你可讓組件類更加精簡、高效。 理想狀況下,組件的工做只管用戶體驗,而不用顧及其它。 它應該提供用於數據綁定的屬性和方法,以便做爲視圖(由模板渲染)和應用邏輯(一般包含一些模型的概念)的中介者。
  • 組件不該該定義任何諸如從服務器獲取數據、驗證用戶輸入或直接往控制檯中寫日誌等工做。 而要把這些任務委託給各類服務。經過把各類處理任務定義到可注入的服務類中,你可讓它能夠被任何組件使用。 經過在不一樣的環境中注入同一種服務的不一樣提供商,你還可讓你的應用更具適應性。

Angular 不會強制遵循這些原則。它只會經過依賴注入讓你能更容易地將應用邏輯分解爲服務,並讓這些服務可用於各個組件中。app

在Angular中使用服務,首先根據須要的功能,寫一個服務類(angular中稱爲provider),而後將該服務類註冊到注入器中(應用啓動時自動建立),以後就能夠在組件類或其餘服務中經過Angular的依賴注入系統使用了,Angular會自動將該類實例化,並處理好依賴關係.ide

在Angular中有不少方式能夠將服務類註冊到注入器中:函數

  • @Injectable 元數據中的providedIn屬性
  • @NgModule 元數據中的 providers屬性
  • @Component 元數據中的 providers屬性

不一樣的註冊方式,生成的服務也有所不一樣.優化

  • 在服務類的 @Injectable 裝飾器中:日誌

    //service
    @Injectable({
        providedIn: 'root',
    })

    providedIn: 'root' 告訴 Angular在根注入器中註冊這個服務,這也是使用CLI生成服務時默認的方式.
    這種方式註冊,不須要再@NgModule裝飾器中寫providers,並且在代碼編譯打包時,能夠執行搖樹優化,會移除全部沒在應用中使用過的服務。推薦使用此種方式註冊服務.code

  • 在模塊@NgModule 中的 providers對象

    //service
    @Injectable()
    //module
    @NgModule({
        providers: [
            UserService,
            { provide: APP_CONFIG, useValue: HERO_DI_CONFIG }
        ],
    })

    這種方式註冊,能夠對服務進行一些額外的配置(服務類中也須要寫@Injectable()裝飾器).編譯

  • 在組件 @Component 中的 providerstable

    @Component({
    selector: 'app-heroes',
    providers: [ HeroService ]

    這種方式註冊,會註冊到每一個組件實例本身的注入器上。(多個組件會有多個注入器)

  • 不提供服務類

    最多見的圖紙是class,可是在配置providers: []時,也能夠不提供服務類,而是返回對象的工廠函數,或是對象字面量[{ provide: Logger, useClass: Logger }]
    也可使用useValue屬性直接交付一個對象實例,[{ provide: Logger, useValue: silentLogger }]

相關文章
相關標籤/搜索