Контекст внедрения зависимостей
Система внедрения зависимостей (DI) опирается на контекст времени выполнения, в котором доступен текущий инжектор.
Это означает, что инжекторы работают только при выполнении кода в этом контексте.
Контекст внедрения зависимостей доступен в следующих ситуациях:
- Во время создания экземпляра класса (через
constructor), создаваемого системой DI, например@Injectableили@Component. - В инициализаторах полей таких классов.
- В фабричной функции, указанной для
useFactoryуProviderили@Injectable. - В функции
factory, указанной дляInjectionToken. - Внутри стекового фрейма, выполняющегося в контексте внедрения зависимостей.
Зная, когда вы находитесь в контексте внедрения зависимостей, вы сможете использовать функцию inject для получения зависимостей.
ПРИМЕЧАНИЕ: Основные примеры использования inject() в конструкторах классов и инициализаторах полей см. в обзорном руководстве.
Стековый фрейм в контексте
Некоторые API предназначены для выполнения в контексте внедрения зависимостей. Например, это относится к защитам маршрутизатора. Благодаря этому в функции защиты можно использовать inject для доступа к сервисам.
Пример использования CanActivateFn
const canActivateTeam: CanActivateFn = (
route: ActivatedRouteSnapshot,
state: RouterStateSnapshot,
) => {
return inject(PermissionsService).canActivate(inject(UserToken), route.params.id);
}; Выполнение в контексте внедрения зависимостей
Если нужно выполнить функцию в контексте внедрения зависимостей, но вы уже не находитесь в таком контексте, можно использовать runInInjectionContext. Для этого необходим доступ к инжектору, например к EnvironmentInjector:
@Injectable({
providedIn: 'root',
})
export class HeroService {
private environmentInjector = inject(EnvironmentInjector);
someMethod() {
runInInjectionContext(this.environmentInjector, () => {
inject(SomeService); // Do what you need with the injected service
});
}
}
Обратите внимание: inject возвращает экземпляр, только если инжектор может разрешить запрошенный токен.
Проверка контекста
Angular предоставляет вспомогательную функцию assertInInjectionContext, чтобы проверить, является ли текущий контекст контекстом внедрения зависимостей, и выдать понятную ошибку, если это не так. Передайте ссылку на вызывающую функцию, чтобы в сообщении об ошибке указывалась правильная точка входа API. Это позволяет получить более понятное и полезное сообщение, чем стандартная общая ошибка внедрения зависимостей.
import {ElementRef, assertInInjectionContext, inject} from '@angular/core';
export function injectNativeElement<T extends Element>(): T {
assertInInjectionContext(injectNativeElement);
return inject(ElementRef).nativeElement;
}
Затем можно вызвать эту вспомогательную функцию из контекста внедрения зависимостей (конструктора, инициализатора поля, фабрики провайдера или кода, выполняемого с помощью 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.
}
} Использование DI вне контекста
Если вызвать inject или assertInInjectionContext вне контекста внедрения зависимостей, Angular выдаст ошибку NG0203.
Super-powered by Google ©2010–2025.
Code licensed under an MIT-style License. Documentation licensed under CC BY 4.0.
https://angular.dev/guide/di/dependency-injection-context