Декоратор @Injectable
в Angular выполняет две ключевые функции:
Помечает класс как участвующий в системе Dependency Injection (DI)
Это означает, что Angular может создавать экземпляры этого класса и внедрять в него зависимости.
Позволяет указать область видимости (scope) сервиса
Через параметр providedIn
можно определить, где будет доступен сервис.
Пример:
@Injectable({
providedIn: 'root' // Сервис будет singleton на уровне приложения
})
export class DataService {}
Важно: Хотя @Injectable
обязателен для сервисов, его можно опустить для компонентов, директив и pipes, так как они уже декорированы @Component
, @Directive
, @Pipe
.
Angular создает древовидную структуру инжекторов, соответствующую структуре компонентов:
Когда компоненту или сервису нужна зависимость:
Зависимости можно регистрировать несколькими способами:
// 1. В декораторе Injectable
@Injectable({ providedIn: 'root' })
// 2. В массиве providers модуля
@NgModule({
providers: [MyService]
})
// 3. В массиве providers компонента
@Component({
providers: [MyService]
})
Angular предоставляет модификаторы для управления процессом разрешения зависимостей:
@Optional()
- зависимость не обязательна@Self()
- искать только в текущем инжекторе@SkipSelf()
- пропустить текущий инжектор@Host()
- искать только до host компонентаПример:
constructor(
@Optional() private optionalService: OptionalService,
@Host() private hostService: HostService
) {}
Дерево инжекторов позволяет:
Токены используются для идентификации зависимостей:
Пример InjectionToken:
export const API_URL = new InjectionToken<string>('api.url');
@Injectable
:
providedIn
DI в Angular:
Лучшие практики:
providedIn: 'root'
InjectionToken