【问题标题】:Dependency Injection in Angular 2Angular 2 中的依赖注入
【发布时间】:2016-01-18 15:04:13
【问题描述】:

我认为实施 DI 是为了允许在应用程序上使用相同的服务,并根据需要进行更改。然而这个 sn-p (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 的预期方式吗?为什么我们必须在每个需要它的类中导入服务,如果我们不能只在启动时描述服务,好处在哪里?

【问题讨论】:

    标签: dependency-injection angular angular2-services


    【解决方案1】:

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

    这一行引用了一个类,而 DI 从类型派生出要注入的实例。

    constructor(project: ProjectService) {
    

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

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

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

    这样 DI 会为下面的构造函数注入一个MockProjectService

     constructor(project: ProjectService) {
    

    【讨论】:

    • 我认为在 boot.ts 和 DI 中导入就足够了。您的意思是应该导入每个依赖文件中的每个可能的实现吗?例如。如果我们有一个用于应用程序的ProjectService 和一个用于测试的MockProjectService — 是否应该将它们都导入到使用这些服务的每个文件中?
    • 不,你只需要导入你在构造函数中使用的类型。需要在您直接引用它们的地方导入替代实现。例如对于这一行bootstrap(AppComponent, [provide(ProjectService, useClass, MockProjectSerivce)]),您需要导入ProjectService MockProjectService,因为您同时引用了它们。
    • 我的意思有点不同:它是否设计了 ProjectService 应该在 boot.ts 和与此服务相关的组件文件 (my.component.ts) 中引用 both ,或者我在实现它时错过了什么?
    • 对不起,我不太明白你的最后一个问题。你是在说@Components({providers: ...})吗?如果你应该列出那里的类?
    • 我的意思是现在我必须在boot.tsmy.component.ts(以及所有其他依赖此服务的组件)中执行import {ProjectService} from './project.service'; both,这感觉不对.
    猜你喜欢
    • 2016-02-15
    • 1970-01-01
    • 2016-07-19
    • 1970-01-01
    • 2016-12-15
    • 1970-01-01
    • 2016-04-15
    • 2015-11-08
    相关资源
    最近更新 更多