Spec-Zone.ru › Angular

Контекст внедрения зависимостей

Система внедрения зависимостей (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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API