Guias Detalhados
Dependency Injection

Contexto de injeção

O sistema de injeção de dependência (DI) depende internamente de um contexto de tempo de execução onde o injector atual está disponível.

Isso significa que injectors podem funcionar apenas quando o código é executado em tal contexto.

O contexto de injeção está disponível nestas situações:

  • Durante a construção (via constructor) de uma classe sendo instanciada pelo sistema de DI, como um @Injectable ou @Component.
  • No inicializador para campos de tais classes.
  • Na factory function especificada para useFactory de um Provider ou um @Injectable.
  • Na factory function especificada para um InjectionToken.
  • Dentro de um stack frame que executa em um contexto de injeção.

Saber quando você está em um contexto de injeção permitirá que você use a função inject para injetar instâncias.

NOTE: Para exemplos básicos de uso de inject() em construtores de classe e inicializadores de campo, veja o guia de visão geral.

Stack frame em contexto

Algumas APIs são projetadas para serem executadas em um contexto de injeção. Este é o caso, por exemplo, com router guards. Isso permite o uso de inject dentro da função guard para acessar um service.

Aqui está um exemplo para CanActivateFn

const canActivateTeam: CanActivateFn =    (route: ActivatedRouteSnapshot, state: RouterStateSnapshot) => {      return inject(PermissionsService).canActivate(inject(UserToken), route.params.id);    };

Executar dentro de um contexto de injeção

Quando você quer executar uma determinada função em um contexto de injeção sem já estar em um, você pode fazer isso com runInInjectionContext. Isso requer acesso a um injector específico, como o EnvironmentInjector, por exemplo:

src/app/heroes/hero.service.ts

@Injectable({  providedIn: 'root',})export class HeroService {  private environmentInjector = inject(EnvironmentInjector);  someMethod() {    runInInjectionContext(this.environmentInjector, () => {      inject(SomeService); // Do what you need with the injected service    });  }}

Note que inject retornará uma instância apenas se o injector puder resolver o token requerido.

Verificando o contexto

O Angular fornece a função helper assertInInjectionContext para verificar que o contexto atual é um contexto de injeção e lança um erro claro se não for. Passe uma referência para a função chamadora para que a mensagem de erro aponte para o ponto de entrada correto da API. Isso produz uma mensagem mais clara e acionável do que o erro genérico de injeção padrão.

import { ElementRef, assertInInjectionContext, inject } from '@angular/core';export function injectNativeElement<T extends Element>(): T {    assertInInjectionContext(injectNativeElement);    return inject(ElementRef).nativeElement;}

Você pode então chamar este helper de um contexto de injeção (constructor, inicializador de campo, provider factory, ou código executado via runInInjectionContext):

import { Component, inject } from '@angular/core';import { injectNativeElement } from './dom-helpers';@Component({ /* … */ })export class PreviewCard {  readonly hostEl = injectNativeElement<HTMLElement>(); // Field initializer runs in an injection context.  onAction() {    const anotherRef = injectNativeElement<HTMLElement>(); // Fails: runs outside an injection context.  }}

Usando DI fora de um contexto

Chamar inject ou chamar assertInInjectionContext fora de um contexto de injeção lançará erro NG0203.