Может ли служба, определенная в модуле, внедрить службу, определенную в компоненте, объявленном тем же модулем
Может ли служба, определенная в модуле "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(...)
не ленивых загруженных модулей).
Это означает, что ваш сервис, предоставляемый в модуле, не может внедрить сервис, предоставляемый компонентом, потому что от корневого инжектора потребуется поиск к листам, что не произойдет. Работает только наоборот. Зависимости должны быть представлены на том же или более высоком уровне.