在angular1中,我们经常使用工厂来注入类,而不是实例。在angular2中,我也可以这样做:
{provide: MyClass, useFactory: () => { return MyClass }}
...
constructor(MyClass) {
let instance = new MyClass();
}
然而,我记得读到这是因为缺少JS模块。现在我们使用ES6模块,我想知道是否需要使用DI进行类注入?我看到许多库不使用角度DI来获取类,但是通过import
语句访问它们。
答案 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
。