使用Injection Token将字符串类型的参数注入到类的构造函数里
一个常见的错误消息:
error NG2003 - No suitable injection token for parameter
构造函数里有个参数类型为string:
constructor(@Inject('apiUrl') private myname) {console.log('Jerry inject: ' + myname);}
这个myname通过注解@Inject修饰,id为apiUrl.
谁负责注入apiUrl呢?在app module里:
providers: [{ provide: JerrySandBoxService },{ provide: GreetingService, useClass: EnglishGreetingService},{provide: 'apiUrl',useValue: 'http://localhost:4200/heros'}],
运行时:
另一个例子:
const MY_SERVICE_TOKEN = new InjectionToken<MyService>('Manually constructed MyService', {providedIn: 'root',factory: () => {console.log('MyService factory called');return new MyService();}
});
构造函数:
constructor(private injectorJerry: Injector, private hostComponentService: HostComponentService, @Inject(TOKEN_HOST_CLASS_PROVIDER) h) {console.log('in HostDecoratorComponent, Host component service got from own Injector: ',hostComponentService, ' HostTokenComponentService: ', h);h.print();const BASE_URL = new InjectionToken<string>('只是描述');const injector =Injector.create({providers: [{provide: BASE_URL, useValue: 'http://localhost'}]});const url = injector.get(BASE_URL);console.log(url);const instance = injectorJerry.get(MY_SERVICE_TOKEN);console.log('MY SERVICE TOKEN: ', instance);}
注意,我们也可以使用一个抽象类作为 injection token.
{ provide: MinimalLogger, useExisting: LoggerService },
该 MinimalLogger 是一个抽象类。
// Class used as a "narrowing" interface that exposes a minimal logger
// Other members of the actual implementation are invisible
export abstract class MinimalLogger {abstract logs: string[];abstract logInfo: (msg: string) => void;
}
你通常从一个可扩展的抽象类继承。但这个应用中并没有类会继承 MinimalLogger。
LoggerService 和 DateLoggerService本可以从 MinimalLogger 中继承。 它们也可以实现 MinimalLogger,而不用单独定义接口。 但它们没有。 MinimalLogger 在这里仅仅被用作一个 "依赖注入令牌"
。
当你通过这种方式使用类时,它称作类接口
。注意,如果我们这里将类接口替换成 interface,是无法工作的,因为 JavaScript 运行时根本不存在 interface 的概念。
就像 DI 提供者中提到的那样,接口不是有效的 DI 令牌,因为它是 TypeScript 自己用的,在运行期间不存在。使用这种抽象类接口不但可以获得像接口一样的强类型,而且可以像普通类一样把它用作提供者令牌。
类接口应该只定义允许它的消费者调用的成员。窄的接口有助于解耦该类的具体实现和它的消费者。
用类作为接口可以让你获得真实 JavaScript 对象中的接口的特性。 但是,为了最小化内存开销,该类应该是没有实现的。 对于构造函数,MinimalLogger 会转译成未优化过的、预先最小化过的 JavaScript。
要获取更多Jerry的原创文章,请关注公众号"汪子熙":
使用Injection Token将字符串类型的参数注入到类的构造函数里相关推荐
- maven java 参数_将Maven参数注入Java类
我想将settings.xml配置文件参数注入Java类.我尝试使用maven-annotation-plugin,但值为null.我想知道这是不是因为这个插件是为Mojo设计的 Setting.xm ...
- springboot 在配置文件写参数注入到类中
@Configuration//配置文件位置@PropertySource("classpath:city.properties")//前缀@ConfigurationProper ...
- C++知识点60——非类型模板参数
模板参数不仅可以使类型,也可以是值.可以用特定的类型名(比如int)而非typename或者class表示非类型模板参数.当模板被实例化时,非类型模板参数会被一个值而不是类型替代.非类型模板参数 一. ...
- Python 字符串类型 - 详细
Python 字符串类型 Python 不支持单字符类型,一个字符在 Python 中,也是作为一个字符串使用. 一. 访问字符串的值 可以通过索引和切片来访问字符串的值 mystr = 'hello ...
- java枚举类型加入springbean_spring 注入一个以枚举类型对象
1.枚举 在实际编程中,往往存在着这样的"数据集",它们的数值在程序中是稳定的,而且"数据集"中的元素是有限的. 例如星期一到星期日七个数据元素组成了一周的&q ...
- 【一起学Rust | 设计模式】习惯语法——使用借用类型作为参数、格式化拼接字符串、构造函数
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.使用借用类型作为参数 二.格式化拼接字符串 三.使用构造函数 总结 前言 Rust 不是传统的面向对象编程语言,它 ...
- Objective-C 字符串拼接函数 多个不同类型的参数拼接到一个字符串 类似于Java中 String.format()方法的原生API
总目录 iOS开发笔记目录 从一无所知到入门 文章目录 需求 Screenshot Code Output 需求 我有多个参数(类型也许不同),需要拼接到一个字符串中. 在Java中有String.f ...
- Angular 为什么要引入 injection token 的概念
你可以定义和使用一个 InjectionToken 对象来为非类的依赖选择一个提供者令牌. 这里的重点是:非类. 下列例子定义了一个类型为 InjectionToken 的 APP_CONFIG . ...
- Python字符串类型及操作总结
1.字符串表示 两种类型四种表示 单行-一对单引号或一对双引号 "python" 'python' 多行-一对三单引号或一对三双引号 '''python''' "&quo ...
最新文章
- [zz]ZeroMQ 的模式
- 创智播客 大数据_中国电信启动嘉创智谷——新仓远景产业园5G部署
- ionic tab导航在android 顶部解决方案
- 打开git界面_使用 Gitea 快速搭建私有 Git 版本控制服务
- 前端开发 图片的插入 。。。。需演练
- 云小课 | 区块链关键技术之一:共识算法
- 包是如何通过交换机的
- NLP领域最优秀的8个预训练模型(附开源地址)
- 【C语言新手】EasyX图形库使用
- 用计算机中的知识秀恩爱,用你的专业,说最美的情话......
- css3 立方体3d旋转效果
- Shell攻关之运算符
- BIND9手册【转】
- Cleve Moler - MATLAB 创始人金秋10月中国大学校园行
- 计算机主机税率,海关总署:计算机及外围设备税率降至10%
- unity查找物体方法
- 手机中即将大行其道的Flash Lite.
- 最简单的uvm程序和vcs编译命令
- 超低功耗水气表GSM/GPRS无线抄表模块
- 嵌入式软件工程师职业路线