В Angular 6 теперь есть поставщиков для инъекций , что является новым рекомендуемым способом ввода услуг, и он работает очень хорошо, за исключением того, что у меня возникают проблемы при использовании службы, которая расширяет другую службу. В качестве примера предположим, что у меня есть
@Injectable({
providedIn: 'root'
})
export class ParentAppService { ... }
@Injectable({
providedIn: 'root'
})
export class ChildAppService extends ParentAppService { ... }
Проблема в том, что независимо от того, что я запрашиваю в компоненте, родительский класс всегда внедряется.
Так что, если вы попросите
constructor(private childAppService: ChildAppService) { ... }
вам все равно будет предоставлен экземпляр ParentAppService, который не ожидается.
Очень простой обходной путь - просто зарегистрировать провайдеров в вашем модуле по старинке, и это работает:
@NgModule({
providers: [AppService, ChildAppService]
})
Но это, в основном, старый способ ведения дел, и он не имеет преимуществ, связанных с улучшением процесса встряхивания деревьев и более чистого тестирования, как, например, новый процесс регистрации, предоставляемый при регистрации.
Итак, мой вопрос: как правильно это сделать? Есть ли лучший способ зарегистрировать провайдера, чтобы я мог получить желаемое поведение (может быть, указать маркер провайдера как-нибудь?).
Я установил супер простой пример стекаблица, чтобы показать, что происходит.
https://stackblitz.com/edit/angular-lacyab?file=src%2Fapp%2Fapp.component.ts
Вы заметите, что там написано "Здравствуйте, Я СЕРВИС ПРИЛОЖЕНИЯ!" хотя компонент попросил предоставить дочерний сервис. Если в модуле приложения мы регистрируем провайдеров по-старому (см. Закомментированный код), внезапно вводится правильный провайдер.
Спасибо за вашу помощь!