2017-03-02 65 views
0

我一直在與angular2握手,雖然我對各種概念有很好的總體理解,但DI和導入有點混淆。angular2:「導入」,注入和接口

首先,我進口類(姑且稱之爲「富」)到一個組件(「巴」)

import { Component, OnInit } from '@angular/core'; 
import { Baz } from './foo'; 

@Component({ 
    templateUrl: './my.component.html', 
    styleUrls: ['./my.component.css'] 
}); 

export class bar implements OnInit { 
    private baz:Baz; 

    ngOnInit():void { 
    this.baz = new Baz();  
    } 
} 

然後,我開始閱讀關於這個模式是多麼糟糕:如果我需要更改Baz的構造函數,我需要重新訪問Baz「新進」的所有代碼。

於是,開始看注射巴茲..

我加@Injectable()到巴茲,然後改變了組件閱讀

import { Component, OnInit } from '@angular/core'; 
import { Baz } from './foo'; 

@Component({ 
    templateUrl: './my.component.html', 
    styleUrls: ['./my.component.css'], 
    providers: [Baz] 
}); 

export class bar implements OnInit { 
    private baz:Baz; 

    constructor(private baz:Baz) {} 

    ngOnInit():void {} 
} 

這一切正常。

但是,它讓我開始思考:DI的全部意義在於允許您/應用程序/測試框架在需要時提供自己的「Baz」版本。

因此,import { Baz } from './foo';成爲問題,因爲這是一個「具體」的實現,並且與特定的類非常相關。

所有東拉西扯後,我的問題是

  • 我應該使用接口,而不是直接進口?

  • 如果是這樣,那麼作爲全局接口(.d.ts),「/// 引用」還是簡單導入接口定義會更好?

  • 應該在組件012h子模塊或模塊級別定義「providers」部分? - 或者這取決於「Baz」的使用範圍?

回答

1

你應該真正閱讀Angular DI。

但是,爲了幫助您:

我應該使用接口,而不是直接進口? 你是什麼意思? 在JavaScript中沒有像Interface這樣的東西,這僅僅是爲了幫助提供工具而創建的Typescript中的一種幻想。

應該在組件,子模塊還是模塊級定義「providers」部分? - 或者這取決於「Baz」的使用範圍?

進一步到根你提供一個Injectable類,更多的組件進一步下來會得到相同的實例。

您在根級別提供IC(可注入類,例如服務),所有子組件都會獲得samle實例,除非它們單獨提供它。

簡而言之,如果您不提供,DI會查找您的父母爲您找到該服務。

因此,如果您有保存服務或者服務本身不包含任何狀態,請將其置於根級別,不需要在組件級別提供。

+0

是的,對不起,我應該提到我正在使用打字稿。 – jmls