1
resposta

Necessidade do providedIn: 'root' utilizando o @Injectable( )

Eu tenho uma aplicação em angular que começou a ser feita no angular4 e foi atualizando até o angular8. Lá atrás, ao gerar um service ele vinha sem o root no @Injectable({ providedIn: 'root', }). Depois, pelo que eu entendi, passou a ser gerado automaticamente pelo angular CLI.

A minha dúvida é entender o motivo do providedIn e sua real necessidade. Isso porque o Flavio comenta que fazendo isso podemos acessar o service de qualquer lugar da aplicação. Mas o estranho é que eu estou utilizando o Angular8 e não tem o providedIn: 'root' em nenhum service e mesmo assim eu consigo acessá-lo via injeção de dependência em qualquer lugar da aplicação.

Na documentação do angular, tem esse exemplo simples a seguir de uma utilização de um service com o providedIn: 'root'. https://stackblitz.com/angular/kgmpnvdxqmo?file=src%2Fapp%2Fuser.service.ts .

Eu entrei e retirei o providedIn deixando apenas o @Injectable() sem mais nada. E funciona normalmente, ele consegue chamar o service via injeção de dependência... Então ter ou não ter o providedIn: 'root' daria na mesma?

1 resposta

Fala ai Enzo, tudo bem? Sobre o providedIn:

A gente utiliza o providedIn para definir como e quem pode injetar esse serviço como dependência, normalmente o root diz que qualquer componente pode recebê-lo.

Caso você queira limitar um pouco mais o acesso, você pode remover o providedIn e injetar o componente no módulo para que ele apenas seja disponível para componentes desse módulo.

No exemplo que tu mandou, por padrão todo componente pode injetá-lo, por que o mesmo tem providedIn: 'root' (primeira explicação).

Mas, porque funcionou quando você removeu o providedIn? Porque o user.module está injetando esse serviço (segunda explicação):

@NgModule({
  providers: [UserService],
})

Espero ter ajudado.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software