用途
该技能面向 Angular v20+ 的依赖注入(Dependency Injection)实现,用于配置与使用依赖注入,涵盖 inject() 函数与 providers 配置。适合服务架构设计、依赖提供与作用域管理等场景。
主要能力
基础注入
资料建议优先使用 inject() 而非构造函数注入。示例在组件中注入 HttpClient 与 User 服务:
import { Component, inject } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { User } from './user.service';
@Component({
selector: 'app-user-list',
template: `...`,
})
export class UserList {
private http = inject(HttpClient);
private userService = inject(User);
users = this.userService.getUsers();
}
可注入服务
使用 @Injectable 声明服务,providedIn: 'root' 表示根级单例;示例中服务通过 inject(HttpClient) 获取 HttpClient,并使用 signal 管理用户数据,对外暴露只读信号 users$,并通过 async loadUsers() 调用接口写入数据。
Provider 作用域
- 根级(单例):使用 @Injectable({ providedIn: 'root' }),或在 app.config.ts 的 providers 中直接列出。
- 组件级(每个组件一个实例):在 @Component 的 providers 中提供,例如 providers: [EditorState]。
- 路由级:在路由配置的 providers 中提供,作用域为该路由树共享。
注入令牌(InjectionToken)
支持创建简单值令牌(如 API_URL)、对象令牌(如 APP_CONFIG,含 apiUrl 与 features 配置)、以及带 factory 的自提供令牌(如 WINDOW、LOCAL_STORAGE)。令牌值通过 providers 中的 useValue 提供,使用时同样通过 inject() 注入。
Provider 类型
包含 four 种类型:useClass(提供实现,可按环境条件选择实现类)、useValue(静态值与配置对象)、useFactory(带 deps 依赖的工厂,也可用于异步工厂,但资料注明明不推荐异步工厂,建议使用 provideAppInitializer)、useExisting(别名指向已有 provider,可使多个令牌指向同一实例)。
注入选项
- optional:未提供时返回 null。
- self:只在当前组件注入器中查找。
- skipSelf:跳过当前组件,向父级查找。
- host:只向上查找到宿主组件。
多重提供者(Multi Providers)
通过 multi: true 为同一令牌收集多个值,注入后为数组,可用于如多个校验器组合的场景(VALIDATORS 示例)。HTTP 拦截器内部即使用多重提供者机制,通过 provideHttpClient(withInterceptors([...])) 注册。
应用初始化器
使用 provideAppInitializer 在应用启动前运行异步代码,可注册多个初始化器,分别在注入上下文中调用 inject() 获取服务并执行初始化。
环境注入器与注入上下文
- createEnvironmentInjector:以编程方式创建注入器,示例由父注入器派生插件注入器。
- runInInjectionContext:在注入上下文中执行代码,示例在回调内使用 inject(HttpClient)。
使用方式
资料以代码示例形式给出各模式的写法,包括导入、inject() 调用、providers 配置与令牌提供方式。如需高级模式,资料指向 references/di-patterns.md。
适用场景
适用于 Angular v20+ 应用的服务架构设计、依赖的提供与作用域管理、令牌化配置注入、条件实现切换、多重校验与拦截器注册、启动前异步初始化,以及以编程方式创建注入器或临时进入注入上下文等场景。
限制
资料未提供版本兼容范围以外的限制说明、性能数据、收费或价格信息,此类内容暂未提供。