以下是代码段
@Component({
... : ...
providers: [MyService]
})
export class MyComponent{
constructor(private _myService : MyService){
}
someFunction(){
this._myService.getSomething();
}
}
以下是我在angular2 / typescript中的理解/问题。
MyService
中写providers
时,都会创建一个单例对象。修改
providers: [MyService]
该怎么办?它会创建一个新实例还是从一个实例中获取?答案 0 :(得分:2)
provider: [ ... ]
指定为每个提供程序维护的单个实例的范围。范围是将类型添加到providers: [ ... ]
及其后代的组件(只要它们不使用具有相同键的另一个提供程序覆盖它)。在bootstrap(AppComponent, [SomeProvider])
中列出提供程序使其全局可用,只要不被组件上的提供程序遮蔽。
Angular2仅支持构造函数注入。还有其他策略,但它们被认为是有问题的。
Angular分析构造函数参数,以了解创建实例时需要传递的参数,从其提供者或父提供者处获取适当的实例并将其传入。
对于这个工作类,如果它们不是组件,指令或管道,则需要使用@Injectable()
进行修饰。
DI(依赖注入)仅将实例传递给它自己创建的实例的构造函数参数。对于它创建的每个实例,它检查构造函数参数并从自身(提供者)获取匹配的实例并将它们传入。如果其中一个依赖项本身再次需要构造函数参数,则递归执行直到所有依赖项都解析为止。 Jasmine不会将实例传递给构造函数本身,而是必须将它委托给DI。
更新到您的“修改”
如果在不同位置添加相同的服务bootstrap(...)
,providers: [...]
,则每个提供商都会维护一个实例。
当一个类请求依赖项(通过构造函数参数)时,DI会向上查找bootstrap()
并返回它找到的第一个提供程序的实例。 (这就是为什么组件的提供者影响祖先组件的提供者或bootstrap(...)
简短:是的,同一服务的两个提供商会产生两个不同的实例。