Serviços e Injeção de Dependências
Uma classe anotada com @Injectable()
pode ser atrelada a um módulo ou componente;
- Ex: Se MeuServico
for atrelado a MeuComponente
, a cada instância de MeuComponente
será criada uma instância de MeuServico
; Ainda, todos os filhos de MeuComponente
terão acesso à essa instância*.
O serviço:
Plugando o serviço a um módulo ou a um componente:
Se você passar o serviço
MeuServico
aoproviders
do componenteMeuComponente
, uma instância desse serviço (new MeuServico()
) será criada para cadaMeuComponente
. QuandoMeuComponente
for destruído, a instância do serviço também é destruída e é invocado o métodongOnDestroy()
;Se você passar um serviço ao módulo raiz, este serviço efetivamente será um Singleton (instância global).
Consumindo o serviço
Acesse o serviço o passando como parâmetro no construtor da classe.
Diz-se aqui que uma instância de
MeuServico
foi "injetada" emMeuComponente
;Caso o serviço não tenha sido plugado a nenhum componente ou módulo pai, o Angular vai dar erro;
Caso o serviço tenha sido providenciado em vários lugares (no módulo e no componente), a instância mais local (a do componente) é fornecida;
PS:
Na sintaxe
constructor(private arg) {}
, oprivate
é um atalho para que o argumento seja copiado para uma propriedade de mesmo nome na classe. Esta é uma sintaxe extra do TypeScript.
Recomendação: NUNCA use
providedIn: "root"
.Exemplo de uso do providers como estado compartilhado
Uma instância de
PessoaService
é criada junto comPaiComponent
;Esta mesma instância é fornecida a
PaiComponent
ePessoaComponent
;
Diagrama resumido:
Código:
Inversão de Controle
Além da funcionalidade de delimitação de contexto, a injeção de dependências é de grande utilidade em mocks para testes.
Quando uma classe especifica que quer consumir ServicoA
, ela não necessariamente recebe a classe exata ServicoA
. Você pode passar qualquer outra classe ao providers
que atenda ao mesmo contrato. Ex: As ferramentas de teste permitem que se instanciem módulos injetando serviços "dublês".
Documentação: introduction to services and dependency injection;
Last updated