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

时间:2016-05-03 22:18:13

标签: dependency-injection angular

我有一个类作为我从服务器获得的一些数据的模型。这个数据作为一个笨重的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();
  }
});

1 个答案:

答案 0 :(得分:3)

new FooString();
new Payment();

;-)

为什么使用DI时,如果他们没有依赖关系,并且您不想为每个提供商维护单个实例。因此,只需使用new

何时使用DI

使用DI而不是new时,有一些标准是正确的:

  • 如果您希望Angular维护和共享实例
  • 如果您想使用接口或基类,但是您希望从外部配置在运行时实际应该使用哪种实现 - 例如在测试期间MockBackendHttp
  • 如果您的类具有DI
  • 提供的实例和/或值的依赖关系
  • 如果您希望能够轻松地单独测试类(https://en.wikipedia.org/wiki/Inversion_of_control
  • 可能是其他人......

如果有充分的理由使用DI,但您也想要新的实例,那么您可以提供工厂。

这个答案https://stackoverflow.com/a/36046754/217408包含一个具体的例子。

使用DI通常是一个好主意。恕我直言,没有强烈反对使用DI的论据。只有当上述参数都不适用并且提供工厂太麻烦时,请改用new Xxx()