Então, o problema real: às vezes temos muitos componentes semelhantes em um projeto, com a mesma lógica, o mesmo DI, propriedades, etc., e surge o pensamento: por que não colocar tudo em um componente base (ou melhor, uma diretiva ) com uma classe abstrata, e o resto dos componentes já são herdados? Na verdade, o pensamento é bom, o princípio DRY é observado, temos uma fonte de verdade, ao mudar essa mesma lógica geral, você não terá que pular todos os componentes, etc.
Mas há uma ressalva: esses designers infelizes. É necessário em cada componente herdado passar todos os DIs para o construtor do pai.
constructor (
customService: CustomService,
additionalService: AdditionalService
) {
super(customService, additionalService)
}
não parece muito bom, mas não é ruim. O problema é que, se adicionarmos DI na classe base, teremos que pular todos os componentes herdados e adicionar essa dependência ao construtor. Nosso DRY estava chorando :-))
Vamos tentar fazer de outra forma: junto com o componente base, criaremos uma classe Injetável, onde envolveremos todas as dependências. E injete-o na classe base
@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
) {}
}
A classe herdada ficará assim
@Component({providers: [MyBaseComponentDependences] })
export class MyChildComponent extends MyBaseComponent<MyDto> {
// -
customEntity = this.deps.customService.getEntity()
constructor(deps: MyBaseComponentDependences) {
super(deps);
}
}
Agora, se adicionarmos DI à classe base, mudamos apenas a classe MyBaseComponentDependences, todo o resto permanece como está. Problema resolvido
PS: entretanto, acredito que a herança de componentes em Angular deve ser usada somente quando for realmente necessário, e não é possível ou aconselhável transferir lógica geral para serviços, classes separadas ou diretivas de atributos.