Dependency injection Angular 2中的依赖注入

Dependency injection Angular 2中的依赖注入,dependency-injection,angular,angular2-services,Dependency Injection,Angular,Angular2 Services,我认为实现DI是为了允许在应用程序上使用相同的服务,并根据需要进行更改。但是,此代码段(Angular 2.0.0-beta.0)不起作用: #boot.ts 从“./project.service”导入{ProjectService} 引导(AppComponent,[ProjectService]); #my.component.ts 导出类MyComponent{ 建造商(项目:ProjectService){ } } 并有明确的服务要求: #my.component.ts 从“/pro

我认为实现DI是为了允许在应用程序上使用相同的服务,并根据需要进行更改。但是,此代码段(Angular 2.0.0-beta.0)不起作用:

#boot.ts
从“./project.service”导入{ProjectService}
引导(AppComponent,[ProjectService]);
#my.component.ts
导出类MyComponent{
建造商(项目:ProjectService){
}
}
并有明确的服务要求:

#my.component.ts
从“/project.service”导入{ProjectService};
导出类MyComponent{
建造商(项目:ProjectService){
}
}
官方文档有些不一致,但在plunkr示例中有相同的内容:

#boot.ts
从“./heroes list.component”导入{HeroesListComponent};
从“/heroses.service”导入{HeroesService};
引导(HeroesListComponent,[HeroesService])
#herones-list.component.ts
从“/heroses.service”导入{HeroesService};

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

这与依赖注入并没有真正的关系。不能在TS中使用未导入的类

此行引用一个类,DI从要注入的实例类型派生

constructor(项目:ProjectService){
如果具体的导入没有指定类型,DI就无法知道应该使用所有可能的
ProjectService
类中的哪一个

例如,您可以请求一个类型(
ProjectService
)并获得不同的实现(子类,如
MockProjectService
EnhancedProjectService
,…)

bootstrap(HeroesListComponent,[provide(ProjectService useClass:MockProjectService)]);
这样,DI将为以下构造函数注入一个
MockProjectService

constructor(项目:ProjectService){

我认为boot.ts和DI中的导入应该足够了。你是说每个依赖文件中的每个可能实现都应该导入吗?例如,如果我们有一个
ProjectService
用于应用程序,一个
MockProjectService
用于测试,它们是否都应该使用这些服务导入到每个文件中?不,你只需要这样做导入您在构造函数中使用的类型。替代实现需要导入到您直接引用它们的位置。例如,对于此行
bootstrap(AppComponent,[提供(ProjectService,useClass,MockProjectSerivce)])
您需要导入
ProjectService
MockProjectService
,因为您引用了它们。我的意思是有点不同:它是设计的吗
ProjectService
应该在
boot.ts
和与此服务相关的组件文件(
my.component.ts
)中引用,或者我在实现它时遗漏了什么?对不起,我不太理解你的最后一个问题。你是说
@Components({providers:…})
?如果你应该在那里列出类?我的意思是现在我必须执行
导入{ProjectService}在
boot.ts
my.component.ts
(以及依赖于此服务的所有其他组件)中的“/project.service”;
,这感觉是错误的。