Angular 把組件和服務區分開,以提升模塊性和複用性。服務器
Angular 不會強制遵循這些原則。它只會經過依賴注入讓你能更容易地將應用邏輯分解爲服務,並讓這些服務可用於各個組件中。app
在Angular中使用服務,首先根據須要的功能,寫一個服務類(angular中稱爲provider),而後將該服務類註冊到注入器中(應用啓動時自動建立),以後就能夠在組件類或其餘服務中經過Angular的依賴注入系統使用了,Angular會自動將該類實例化,並處理好依賴關係.ide
在Angular中有不少方式能夠將服務類註冊到注入器中:函數
providedIn
屬性providers
屬性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 }]