(注意我使用的是Angular 2 RC5)
为简单起见,我有一个类似的应用程序:
app.module.ts
@NgModule({
providers: [
RootService
],
entryComponents: [AppComponent],
bootstrap: [AppComponent]
})
export class AppModule {}
root.service.ts
import Dependency1 from './somewhere'
import Dependency2 from './somewhere-else'
@Component({
providers: [Dependency1, Dependency2]
})
@Injectable()
export class RootService {
constructor(
private dep1: Dependency1,
private dep2: Dependency2
) {...}
}
依赖的一个例子是:
dependency1.ts
@Injectable()
export class Dependency1{
public doGroundbreakingSciencyStuff() {...}
}
我的问题是:为什么,如上所述,我遇到一个错误说:
No provider for PouchSync!
。
我可以通过向 app.module.ts 中的providers
数组添加Dependency1和Dependency2来解决问题,如下所示:
app.module.ts (已修复)
@NgModule({
providers: [
RootService,
Dependency1,
Dependency2
],
entryComponents: [AppComponent],
bootstrap: [AppComponent]
})
export class AppModule {}
这看起来非常难看。只有RootService
需要知道这些依赖关系。我在这里做错了吗?或者有人可以解释为什么它必须这样?当然,当注入RootService
时,注射器可以看到它依赖于Dependency1
和Dependency2
,因此也必须注射它们,因此它们也会被应用广泛的单身人士。
答案 0 :(得分:1)
服务不是组件,因此他们不能拥有 @Component 装饰器(这意味着 - 无法为服务类添加提供者数组)。结论?这段代码错了:
@Component({
providers: [PouchSync, PouchArraySync]
})
@Injectable()
export class RootService {
constructor(
private dep1: Dependency1,
private dep2: Dependency2
) {...}
}
但你的第二个示例是以角度2方式制作的。
您写道,只有RootService
需要了解依赖关系。因此,如果这些依赖项不是可重用对象,应该在应用程序的几个部分中注入,但只能在此类中使用(!) - 您应该只在服务中创建它们的实例。
答案 1 :(得分:0)
您要在应用程序中使用的任何服务都必须添加到providers数组中。向根ngModule添加服务实际上使它们在整个应用程序中可用。
当你说的时候 "当然,在注入RootService时,注入器可以看到它依赖于Dependency1和Dependency2,因此也必须注入它们,因此它们也是应用程序范围的单例"。
没有注入器只会通过添加RootService自动添加Dependency1和Dependency2。它们必须专门添加到提供者数组
中