通过构造函数参数与Injector服务进行注入

时间:2017-10-04 07:02:08

标签: angular dependency-injection

我现在使用Angular2 / 4几个月了,我仍然无法弄清楚这两种方法之间的区别以及我应该使用哪种依赖注入方法

你能帮帮我吗?

第一种方法:通过构造函数

...
  constructor(
    private myService: MyService
  ) { 
    // this.myService.myMethod() ...
  }
...

第二种方法:通过注射器

...
  private myService: MyService;

  constructor(
    injector: Injector
  ) {
    this.myService = injector.get(MyService);
    // this.myService.myMethod() ...
  }
...

我理解每种方法都做了什么,我无法弄清楚最佳做法。

我知道这可能是一个主观意见,但我认为两者都有利弊。

感谢您的任何解释。

2 个答案:

答案 0 :(得分:2)

您应该总是更喜欢第一个选项:

...
  constructor(
    private myService: MyService
  ) { 
    // this.myService.myMethod() ...
  }
...

第二种方法有效,因为当您注入MyService时,它会使用Injector注入。

Angular使Injector可用于注入,因为在动态实例化模块或组件时可能需要使用它:

组件:

export class ModuleLoaderComponent {
  constructor(private _injector: Injector,private loader: NgModuleFactoryLoader) { ... }

  ngAfterViewInit() {
    this.loader.load('app/t.module#TModule').then((factory) => {
      const module = factory.create(this._injector);  <-----------------

模块:

export class RouterConfigLoader {

  load(parentInjector, route) {
    ...
    const modFactory = this.loadModuleFactory(route.loadChildren);
    const module = modFactory.create(parentInjector);
  }

您可以在以下文章中阅读有关动态实例化的更多信息:

正如@estus指出的那样,injector也用于在构造函数中注入依赖项导致循环依赖或者您希望依赖某些条件获得依赖的情况。

答案 1 :(得分:0)

有人告诉我,最好使用构造函数方法进行依赖项注入。它确切地告诉您该课程需要什么。

另一方面,在某些情况下,使用注射器更好。除了动态实例化之外,还必须考虑类继承。假设您想从引入了也基于其他服务S1的服务S2的基本组件中构建组件。即C1(S1)中的C2(S2)。

通常,C2使用super实例化C1,看起来像这样

constructor(
    private service2: S2
  ) { 
    super(S1)
  }

我看到必须调用父服务S1和S2才能构建C2的问题。如果S1使用注入器方法,则纠缠不那么多,因此编写C2就像

constructor(
    private injector: Injector
  ) { 
    super()
    this.service2 = this.injector.get(S2)
  }

private service2: S2

如果要放弃在构造函数中设置实例,可以进一步创建自己的注入器单例。看到 this article