2016-05-03 21 views
0

我有一個類用作從服務器獲得的一些數據的模型。這些數據以一個笨拙的xml對象開始,其中文本節點具有屬性,因此我將其轉換爲json格式時沒有簡單的字符串值。相反,我有:在Angular 2中爲依賴注入提供模型類的新實例

@Injectable() 
export class FooString { 
    _attr: string; 
    value: string; 
    isReadOnly(): boolean { 
    return this._attr && this._attr === 'ReadOnly'; 
    } 

    isHidden(): boolean { 
    return this._attr && this._attr === 'Hid'; 
    } 
} 

然後,我的模式是這樣的:

@Injectable() 
export class Payment { 
    constructor(
    public FooId: FooString, 
    public FooStat: FooString, 
    public FooName: FooString) { } 
} 

一切與FooString的同一個實例結束。我如何爲每個人獲取離散實例?

我已經嘗試了工廠,但它仍然只創建一個實例:

export let fooStringProvider = provide(FooString, { 
    useFactory:(): FooString => { 
    console.log('in foostring factory'); 
    return new FooString(); 
    } 
}); 

回答

3
new FooString(); 
new Payment(); 

;-)

爲什麼使用DI時,他們沒有依賴關係而你不知道不想爲每個提供者維護單個實例。因此,只需使用new即可。

當使用DI

使用,而不是new正確的事情DI時,有幾個標準:

  • 如果你想角維護和共享實例
  • 如果你想以使用接口或基類,但是您希望從外部配置實際應該在運行時實際使用的實現 - 例如在測試期間MockBackendHttp
  • 如果如果你希望能夠在易於隔離測試類(https://en.wikipedia.org/wiki/Inversion_of_control
  • 可能別人對你類有依賴關係,通過DI
  • 提供的實例和/或值...

如果使用DI有很好的理由,但你也想要新的實例,那麼你可以提供一個工廠。

這個答案https://stackoverflow.com/a/36046754/217408包含一個具體的例子如何做到這一點。

使用DI通常是一個好主意。恕我直言,沒有強烈的反對使用DI的論點。只有當上述論點都不適用並且提供工廠太麻煩時,請使用new Xxx()代替。

+0

謝謝。我去做。我不明白我什麼時候應該使用'new',以及何時應該使用Angular的DI。你能啓發我,還是指向正確的方向?我上面給出的例子是其中一個簡單的對象,但我有其他的包含多個複雜的數據結構。它開始看起來很像一輛帶引擎,輪胎等的汽車的Angular.io例子。從表面上看,DI似乎很棒,但我只能有一個實例? – Andrew

+0

我更新了我的答案。 –