【问题标题】: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(...)

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多