Может ли служба, определенная в модуле, внедрить службу, определенную в компоненте, объявленном тем же модулем

Может ли служба, определенная в модуле "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?

Если это так, то, как я понимаю, компонент инжектора не является дочерним элементом корневого инжектора, правильно?

2 ответа

Решение

Не имеет значения, определены ли сервисы в одном модуле или нет (если это не модуль с отложенной загрузкой), модуль providers принадлежат корневому инжектору.

Чтобы сделать это, оба поставщика должны быть определены на текущем инжекторе:

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

С другой стороны, ComboFeatureService может быть введен как опционально, это позволит ComboService использовать ComboFeatureService от текущего инжектора (или ничего, если его нет):

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

Провайдеры ищутся от компонента, где они требуются. Если провайдер не найден, поиск продолжается у родителя до корневого инжектора (провайдеры добавлены в @NgModule(...) не ленивых загруженных модулей).

Это означает, что ваш сервис, предоставляемый в модуле, не может внедрить сервис, предоставляемый компонентом, потому что от корневого инжектора потребуется поиск к листам, что не произойдет. Работает только наоборот. Зависимости должны быть представлены на том же или более высоком уровне.

Другие вопросы по тегам