使用DI进行类注射是否有任何意义

时间:2017-02-20 16:49:16

标签: angular

在angular1中,我们经常使用工厂来注入类,而不是实例。在angular2中,我也可以这样做:

{provide: MyClass, useFactory: () => { return MyClass }}

...
constructor(MyClass) {
   let instance = new MyClass();
}

然而,我记得读到这是因为缺少JS模块。现在我们使用ES6模块,我想知道是否需要使用DI进行类注入?我看到许多库不使用角度DI来获取类,但是通过import语句访问它们。

2 个答案:

答案 0 :(得分:1)

您需要使用TypeScript导入语句在*.ts文件中创建类型。这与DI完全不同,并且与DI无关,除了这些导入的类型可以用作请求依赖的DI提供者密钥。

您只需使用new MyClass()创建类实例。

如果您的类具有来自Angulars Http的{​​{1}}之类的依赖项,例如

HttpModule

使用DI非常方便,因为您获得了由DI创建的class MyClass { constructor(this.http:Http) {} } 实例以及自动传入的MyClass参数。

DI(控制反转)也是一种常见的编程模式,它使测试更容易,因为你得到的类没有紧密耦合。

DI是层次结构,可以轻松共享具有特定范围的实例(例如组件实例及其所有子项)

答案 1 :(得分:1)

{provide: MyClass, useFactory: () => { return MyClass }}

{provide: MyClass, useValue: MyClass }

基本上是一回事。是的,将DI用于应该手动实例化的类是有意义的。

在JS(ES.Next)中执行DI时不会产生任何问题:

constructor(@Inject(MyClass) MyClass) {
  this.MyClass = new MyClass;
}

但是在TypeScript中使用它可能不太方便,因为应该正确指定类型:

constructor(@Inject(MyClass) MyClass: typeof MyClass) {
  this.MyClass = new MyClass;
}

将其作为提供程序允许随时替换或扩充功能而无需修补原始代码,这对第三方库来说是一个很好的特性。

它提供了更好的可测试性,MyClass可以替换为存根类或间谍功能。当不涉及DI时,这使得测试更复杂并且需要在导入级别上实现DI,例如,与rewire-webpack