Dependency injection 在Angular 2中为依赖项注入提供模型类的新实例

Dependency injection 在Angular 2中为依赖项注入提供模型类的新实例,dependency-injection,angular,Dependency Injection,Angular,我有一个类,它作为我从服务器获取的一些数据的模型。该数据从一个笨拙的xml对象开始,其中文本节点具有属性,因此我将其转换为的json格式没有简单的字符串值。相反,我有: @Injectable() export class FooString { _attr: string; value: string; isReadOnly(): boolean { return this._attr && this._attr === 'ReadOnly'; }

我有一个类,它作为我从服务器获取的一些数据的模型。该数据从一个笨拙的xml对象开始,其中文本节点具有属性,因此我将其转换为的json格式没有简单的字符串值。相反,我有:

@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();
  }
});
;-)

为什么要在DI没有依赖项并且您不想为每个提供程序维护单个实例的情况下使用DI。因此,只需使用
new

何时使用DI

当使用DI而不是
new
时,有几个标准是正确的:

  • 如果希望维护和共享实例
  • 如果您想使用接口或基类,但又想从外部配置在运行时实际应使用的实现,如测试期间Http的
    MockBackend
  • 如果您的类依赖于DI提供的实例和/或值
  • 如果您希望能够轻松地独立测试类()
  • 也许其他人
如果有很好的参数可以使用DI,但您也需要新的实例,那么您可以只提供一个工厂

这个答案包含了一个具体的例子


使用DI通常是一个好主意。没有强有力的理由反对使用DI。只有当上述参数均不适用且提供工厂过于繁琐时,才使用
new Xxx()

谢谢。我会的。我不明白什么时候应该使用
new
,什么时候应该使用Angular的DI。你能启发我,或者给我指出正确的方向吗?我上面给出的示例是一个简单的对象,但我还有其他包含多个复杂数据结构的对象。在这种情况下,它开始看起来非常像带有引擎、轮胎等的汽车的Angular.io示例。从表面上看,DI对此非常有用,但我只能举一个例子?
new FooString();
new Payment();