你可以定义和使用一个 InjectionToken 对象来为非类
的依赖选择一个提供者令牌。
这里的重点是:非类。
下列例子定义了一个类型为 InjectionToken 的 APP_CONfig .
import { InjectionToken } from '@angular/core';
export const APP_CONfig = new InjectionToken<AppConfig>('app.config');
这里的 APP_CONfig 只是一个令牌 token,或者说是一个 place holder.
可选的参数
接着,用 APP_CONfig 这个 InjectionToken 对象在组件中注册依赖提供者。
providers: [{ provide: APP_CONfig, useValue: HERO_DI_CONfig }]
语义是,消费者代码里,注入 APP_CONfig 的令牌,则运行时,令牌会被实际的值 HERO_DI_CONfig 取代。这个 HERO_DI_CONfig 不是一个 Angular class, 所以只能以 injection token 的方式注册提供者。
现在,借助参数装饰器 @Inject(),你可以把这个配置对象注入到构造函数中。
constructor(@Inject(APP_CONfig) config: AppConfig) {
this.title = config.title;
}
接口和依赖注入
虽然 TypeScript 的 AppConfig 接口可以在类中提供类型支持,但它在依赖注入时却没有任何作用。在 TypeScript 中,接口是一项设计期工件,它没有可供 DI 框架使用的运行时表示形式或令牌。
当转译器把 TypeScript 转换成 JavaScript 时,接口就会消失,因为 JavaScript 没有接口。
由于 Angular 在运行期没有接口,所以该接口不能作为令牌,也不能注入它。
因此,下列的代码是不合法的:
// Can't use interface as provider token
[{ provide: AppConfig, useValue: HERO_DI_CONfig })]
我们不能把 interface 本身作为一个令牌,因此 Angular 引入了 injection token 的概念。
同样,下列的代码亦不合法,因为 interface 不能作为构造函数的输入参数类型注入。因此我们需要 @Inject, 将 interface 包裹一层之后再传入构造函数。
// Can't inject using the interface as the parameter type
constructor(private config: AppConfig){ }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。