2016-05-03 34 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

我更新了我的答案。 –