【问题标题】:Understanding Dependency injection in angular2了解angular2中的依赖注入
【发布时间】:2016-07-20 23:22:56
【问题描述】:
这是一个代码sn-p
@Component({
... : ...
providers: [MyService]
})
export class MyComponent{
constructor(private _myService : MyService){
}
someFunction(){
this._myService.getSomething();
}
}
这是我的理解/问题,它是如何在 angular2/typescript 中工作的。
- 每当我们在
providers 中写入MyService 时,都会创建一个单例对象。
- 为什么要在构造函数中给出它?我们可以在其他任何地方做吗?
- 无论谁调用构造函数(可能是 JavaScript 引擎),它如何知道将什么传递给参数
- 还是我弄错了,这甚至不是论据?
编辑
- 如果我在两个控制器上提供
providers: [MyService] 会怎样。它会创建一个新实例还是从一个实例中获取?
【问题讨论】:
标签:
javascript
dependency-injection
typescript
angular
【解决方案1】:
provider: [ ... ] 指定为每个提供程序维护的单个实例的范围。范围是将类型添加到providers: [ ... ] 及其后代的组件(只要它们不使用具有相同键的另一个提供程序覆盖它)。在bootstrap(AppComponent, [SomeProvider]) 中列出提供程序使其全局可用,只要不被组件上的提供程序隐藏即可。
Angular2 仅支持构造函数注入。还有其他策略,但它们被认为是有问题的。
Angular 分析构造函数参数以了解在创建实例时需要传入哪些参数,从其提供者或父提供者处获取适当的实例并将其传入。
如果类不是组件、指令或管道,则需要使用 @Injectable() 修饰此功能。
DI(依赖注入)仅将实例传递给它自己创建的实例的构造函数参数。对于它创建的每个实例,它都会检查构造函数参数并从自身(提供者)获取匹配的实例并将它们传入。如果这些依赖项之一本身再次需要构造函数参数,则递归执行,直到所有依赖项都得到解决。
Jasmine 不会将实例传递给构造函数本身,它必须将其委托给 DI。
更新您的“编辑”
如果在不同的地方添加相同的服务bootstrap(...)、providers: [...],那么每个提供者都会维护一个实例。
当类请求依赖项(通过构造函数参数)时,DI 向上查看bootstrap() 并返回它找到的第一个提供程序的实例。 (这就是为什么组件上的提供者会隐藏祖先组件的提供者或bootstrap(...)
简短:是的,同一服务的两个提供者会导致两个不同的实例。