在模块上定义的服务能否注入在同一模块声明的组件上定义的服务

Can a service defined on a module inject a service defined on a component declared by the same module

模块 'my' 上定义的服务能否注入模块 'my' 声明的组件上定义的服务?

我测试过好像是这样,所以这个问题主要是为了确认。所以,我有这个定义 ComboFeatureService:

的组件
@Component({
    selector: 'combo-feature',
    providers: [ComboFeatureService],
    template: '<div>I am feature</div>'
})
export class ComboFeature {
    constructor(comboService: ComboService) {
        comboService.report();
    }
}

然后我有一个服务依赖于ComboFeatureService:

@Injectable()
export class ComboService {
    constructor(public comboFeature: ComboFeatureService) {

    }

组件和服务都定义在同一个模块上:

@NgModule({
    providers: [ComboService],
    declarations: [ComboFeature],
    exports: [ComboFeature]
})
export class ComboModule {

我的理解是否正确,即使它们都定义在同一个模块上,ComboService 也无法访问 ComboFeatureService

如果是这样,那么据我了解,组件注入器 不是 根注入器的子项,对吗?

服务是否在同一个模块上定义并不重要(除非这是惰性加载模块),模块providers属于根注入器。

为此,应在当前注入器上定义两个提供程序:

@Component({
    ...
    providers: [ComboService, ComboFeatureService]
})
export class ComboFeature {
    constructor(comboService: ComboService) { ... }

或者,ComboFeatureService 可以作为可选注入,这将允许 ComboService 使用当前注入器的 ComboFeatureService(如果有 none,则什么都不用):

@Injectable()
export class ComboService {
    constructor(Optional() public comboFeature: ComboFeatureService) { ... }

提供程序是从需要它们的组件中查找的。如果未找到提供者搜索,则在父级继续搜索,直到到达根注入器(提供者添加到 non-lazy 加载模块的 @NgModule(...))。

这意味着您在模块中提供的服务无法注入组件提供的服务,因为它需要从根注入器向叶子进行搜索,而这不会发生。只有相反的方法才有效。需要在相同或更高级别提供依赖项。