Angular 2 中的依赖注入

Dependency Injection in Angular 2

我认为 DI 的实现是为了允许在应用程序上使用相同的服务,并根据需要更改它们。然而这个片段(Angular 2.0.0-beta.0)拒绝工作:

# boot.ts
import {ProjectService} from './project.service'

bootstrap(AppComponent, [ProjectService]);



# my.component.ts
export class MyComponent {
    constructor(project: ProjectService) {
    }
}

并且在明确的服务要求下它可以工作:

# my.component.ts
import {ProjectService} from './project.service';
export class MyComponent {
    constructor(project: ProjectService) {
    }
}

官方文档有些不一致,但是在plunkr的例子中是一样的:

# boot.ts
import {HeroesListComponent} from './heroes-list.component';
import {HeroesService}       from './heroes.service';

bootstrap(HeroesListComponent, [HeroesService])



# heroes-list.component.ts
import {HeroesService} from './heroes.service';

这是 DI 使用的预期方式吗?为什么我们必须在每个需要它的 class 中导入服务,如果我们不能在启动时只描述一次服务,好处在哪里?

这实际上与依赖注入无关。您不能在未导入的 TS 中使用 class。

此行引用了一个 class 并且 DI 派生自要注入的实例的类型。

constructor(project: ProjectService) {

如果具体导入未指定类型,DI 无法知道应该使用所有可能的 ProjectService class 中的哪一个。

例如,您可以做的是请求一个类型 (ProjectService) 并获得不同的实现(subclass,例如 MockProjectServiceEnhancedProjectService。 ..)

bootstrap(HeroesListComponent, [provide(ProjectService useClass: MockProjectService)]);

这样 DI 会为以下构造函数注入 MockProjectService

 constructor(project: ProjectService) {