Русский
Русский
English
Статистика
Реклама

Наследование компонентов в Angular простой способ решить проблему с Dependency Injection

Итак, собственно проблема: порой у нас в проекте есть много похожих компонентов, с одинаковой логикой, одинаковыми DI, свойствами итд и возникает мысль: а почему бы не вынести все это дело в базовый компонент (точнее директиву) абстрактным классом, а остальные компоненты уже наследовать? На самом деле мысль хорошая, принцип DRY соблюдается, имеем один источник истины, при изменении той самой общей логики не придется прыгать по всем компонентам итд.

Но есть один нюанс: эти злосчастные конструкторы. Нужно в каждом наследуемом компоненте передавать все DI в конструктор родителя.

constructor ( customService: CustomService, additionalService: AdditionalService) {super(customService, additionalService)}

выглядит не очень, но это полбеды. Беда в том, что если у нас в базовом классе добавляется DI, нам придется прыгать по всем компонентам-наследникам и добавлять эту зависимость в конструктор. Плакал наш DRY :-))

Попробуем сделать по другому: вместе с базовым компонентом создадим Injectable-класс, куда завернем все зависимости. И заинжектим его в базовый класс

@Injectable()export class MyBaseComponentDependences {constructor(    public customService: CustomService,      public additionalService: AdditionalService      ) {}    }@Directive()export abstract class MyBaseComponent<T> {//Пример использования сервиса в родительском классеshareEntity = this.deps.additionalService.getShare()    protected constructor(    public deps: MyBaseComponentDependences     ) {}}

Класс-наследник будет выглядеть так

@Component({providers: [MyBaseComponentDependences] })export class MyChildComponent extends MyBaseComponent<MyDto> {    //Пример использования сервиса в классе-наследнике    customEntity = this.deps.customService.getEntity()        constructor(deps: MyBaseComponentDependences) {    super(deps);     }}

Теперь, если у нас в базовый класс добавляется DI мы меняем только класс MyBaseComponentDependences, все остальное остается как есть. Проблема решена

PS: однако я считаю, что наследование компонентов в Ангуляре стоит использовать только в том случае, когда это действительно необходимо, и нет возможности или не целесообразно выносить общую логику в сервисы, отдельные классы или директивы аттрибутов.

Источник: habr.com
К списку статей
Опубликовано: 28.02.2021 10:04:21
0

Сейчас читают

Комментариев (0)
Имя
Электронная почта

Ооп

Angular

Dependency injection

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru