javascript – 了解angular2中的依赖注入

这是一段代码片段

@Component({
     ... : ...
     providers: [MyService]
})
export class MyComponent{

     constructor(private _myService : MyService){
     }

     someFunction(){
          this._myService.getSomething();
     }
}

这是我的理解/问题它在angular2 / typescript中是如何工作的.

>每当我们在提供程序中编写MyService时,都会创建一个单例对象.
>为什么要在构造函数中赋予它?我们可以在其他地方做到吗?
>无论谁调用构造函数(也许是javascript引擎),它如何知道传递给参数的内容
>或者我弄错了,甚至不是争论?

编辑

>如果我在两个控制器上提供提供商:[MyService],该怎么办?它会创建一个新实例还是从一个实例获取?

最佳答案 > provider:[…]指定为每个提供者维护的单个实例的范围.范围是将类型添加到提供程序的组件:[…]及其后代(只要它们不使用具有相同键的另一个提供程序覆盖它).在引导程序中列出提供程序(AppComponent,[SomeProvider])使其全局可用,只要不被组件上的提供程序遮蔽.

> Angular2仅支持构造函数注入.还有其他策略,但它们被认为是有问题的.

> Angular分析contructor参数以了解创建实例时需要传递的参数,从其提供者或父提供者获取适当的实例并将其传递.

对于这个工作类,如果它们不是组件,指令或管道,则需要使用@Injectable()进行修饰.

> DI(依赖注入)仅将实例传递给它自己创建的实例的构造函数参数.对于它创建的每个实例,它检查构造函数参数并从自身(提供者)获取匹配的实例并将它们传入.如果其中一个依赖项本身再次需要构造函数参数,则会递归执行,直到所有依赖项都解析为止.

Jasmine不会将实例传递给构造函数本身,它必须将它委托给DI.

更新到“编辑”

如果在不同的地方添加相同的服务bootstrap(…),提供者:[…]则每个提供者维护一个实例.

当一个类请求依赖(通过构造函数参数)时,DI向上看向bootstrap()并返回它找到的第一个提供者的实例. (这就是为什么组件的提供者影响祖先组件或引导程序的提供者(…)

简短:是的,同一服务的两个提供者导致两个不同的实例.

点赞