의존성 주입 시스템은 현재 인젝터(injector)가 접근 가능한 범위의 실행 컨텍스트를 구성합니다.
이 말은, 이 컨텍스트 안에서만 인젝터를 사용할 수 있다는 것을 의미합니다.
의존성 주입 컨텍스트는 이런 상황에 사용할 수 있습니다:
@Injectable이나@Component등 DI 시스템이 인스턴스를 생성하는 클래스의constructor안에서- 그러한 클래스의 필드를 초기화하는 코드 안에서
Provider나@Injectable을useFactory로 등록하는 경우 팩토리 함수 안에서InjectionToken에 연결하는factory함수 안에서- 의존성 주입 컨텍스트가 실행되는 스택 프레임 안에서
현재 작업하는 컨텍스트가 의존성 주입이 가능한 컨텍스트라면, inject 함수를 사용해서 의존성 객체의 인스턴스를 요청할 수 있습니다.
참고: 클래스 생성자나 필드를 초기화할 때 inject()를 사용하는 기본 방법을 알아보려면 개요 문서를 참고하세요.
컨텍스트 안의 스택 프레임
일부 API는 인젝션 컨텍스트 안에서 실행되도록 설계된 것들이 있습니다.
예를 들면 라우터 가드가 그렇습니다.
가드 함수 안에서는 inject 함수를 사용해서 원하는 서비스에 접근할 수 있습니다.
CanActivateFn 예시를 들어보면 이렇습니다.
const canActivateTeam: CanActivateFn = (
route: ActivatedRouteSnapshot,
state: RouterStateSnapshot,
) => {
return inject(PermissionsService).canActivate(inject(UserToken), route.params.id);
};
인젝션 컨텍스트 안에서 실행하기
의존성 주입 컨텍스트가 아닌 함수 안에서 의존성과 관련된 함수를 실행하려면 runInInjectionContext를 사용하면 됩니다.
이 방식을 사용하려면 EnvironmentInjector와 같은 인젝터에 접근할 수 있어야 합니다:
hero.service.ts
@Service()
export class HeroService {
private environmentInjector = inject(EnvironmentInjector);
someMethod() {
runInInjectionContext(this.environmentInjector, () => {
inject(SomeService); // 주입받은 서비스로 원하는 로직을 작성합니다.
});
}
}
참고로 inject 함수는 요청한 토큰을 찾을 수 있을 때만 해당 토큰의 인스턴스를 반환합니다.
컨텍스트 보장하기
Angular는 assertInInjectionContext 라는 헬퍼 함수를 제공하는데, 이 함수는 현재 컨텍스트가 의존성 주입 컨텍스트라면 아무 문제가 없지만, 의존성 주입 컨텍스트가 아니라면 오류를 발생시킵니다.
그리고 이 함수를 실행하면서 올바른 API 진입점을 인자로 전달할 수 있습니다.
이 방식을 사용하면 일반적인 인젝션 오류가 아니라 좀 더 명확하고 개선할 수 있는 메시지가 표시됩니다.
import {ElementRef, assertInInjectionContext, inject} from '@angular/core';
export function injectNativeElement<T extends Element>(): T {
assertInInjectionContext(injectNativeElement);
return inject(ElementRef).nativeElement;
}
클래스의 생성자, 필드 초기화, 프로바이더 팩토리 등 의존성 주입 컨텍스트 안에서 이 헬퍼 함수를 호출하면 이렇습니다:
import {Component, inject} from '@angular/core';
import {injectNativeElement} from './dom-helpers';
@Component({/* … */})
export class PreviewCard {
readonly hostEl = injectNativeElement<HTMLElement>(); // 필드를 초기화할 때 의존성 주입 컨텍스트를 실행합니다.
onAction() {
const anotherRef = injectNativeElement<HTMLElement>(); // 에러: 인젝션 컨텍스트가 아닙니다.
}
}
의존성 주입 컨텍스트 밖에서 의존성 주입 사용하기
의존성 주입 컨텍스트가 아닌 곳에서 inject 함수를 실행하거나 assertInInjectionContext를 실행하면 NG0203 오류가 발생합니다.