angular2 : "import", 注入和接口

angular2 : "import", inject and interfaces

我已经掌握了 angular2,虽然我对各种概念有很好的总体理解,但 DI 和导入有些混乱。

首先,我将 class(我们称之为 "foo")导入到组件 ("bar")

import { Component, OnInit } from '@angular/core';
import { Baz } from './foo';

@Component({
  templateUrl: './my.component.html',
  styleUrls: ['./my.component.css']
});

export class bar implements OnInit {
  private baz:Baz;

  ngOnInit():void {
    this.baz = new Baz();    
  }
}

然后我开始阅读有关此模式有多糟糕的信息:如果我需要更改 Baz 的构造函数,我将需要重新访问 Baz 所在的所有代码 "newed"。

所以,开始考虑注射 Baz ..

我给Baz添加了@Injectable(),然后把组件改成了read

import { Component, OnInit } from '@angular/core';
import { Baz } from './foo';

@Component({
  templateUrl: './my.component.html',
  styleUrls: ['./my.component.css'],
  providers: [Baz]
});

export class bar implements OnInit {
  private baz:Baz;

  constructor(private baz:Baz) {}

  ngOnInit():void {}
}

这很好用。

然而,这让我开始思考:DI 的全部意义在于允许您/应用程序/测试框架在需要时提供它自己的 "Baz" 版本。

因此,import { Baz } from './foo'; 变得有问题,因为这是一个 "concrete" 实现并且与特定的 class.

密切相关

说了这么多,我的问题是

你真的应该阅读 Angular DI。

不过可以帮你:

我应该使用接口而不是直接导入吗? 你什么意思 ? javascript 中没有接口这样的东西,这只是 Typescript 中的一个奇特的东西,它只是为了帮助提供工具而创建的。

"providers" 部分应该在组件、子模块或模块级别定义吗? - 还是取决于 "Baz" 的使用范围?

您提供的 Injectable class 越往上,越往下的组件将获得相同的实例。

您在根级别提供一个 IC(可注入 Class,例如服务),所有子组件都将获得相同的实例,除非它们单独提供它。

简而言之,如果您不提供,DI 会查找您的父级为您找到该服务。

因此,如果您有保存服务或服务本身不包含任何状态,请将其放在根级别,无需在组件级别提供。