一个常见的错误消息:

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将字符串类型的参数注入到类的构造函数里相关推荐

  1. maven java 参数_将Maven参数注入Java类

    我想将settings.xml配置文件参数注入Java类.我尝试使用maven-annotation-plugin,但值为null.我想知道这是不是因为这个插件是为Mojo设计的 Setting.xm ...

  2. springboot 在配置文件写参数注入到类中

    @Configuration//配置文件位置@PropertySource("classpath:city.properties")//前缀@ConfigurationProper ...

  3. C++知识点60——非类型模板参数

    模板参数不仅可以使类型,也可以是值.可以用特定的类型名(比如int)而非typename或者class表示非类型模板参数.当模板被实例化时,非类型模板参数会被一个值而不是类型替代.非类型模板参数 一. ...

  4. Python 字符串类型 - 详细

    Python 字符串类型 Python 不支持单字符类型,一个字符在 Python 中,也是作为一个字符串使用. 一. 访问字符串的值 可以通过索引和切片来访问字符串的值 mystr = 'hello ...

  5. java枚举类型加入springbean_spring 注入一个以枚举类型对象

    1.枚举 在实际编程中,往往存在着这样的"数据集",它们的数值在程序中是稳定的,而且"数据集"中的元素是有限的. 例如星期一到星期日七个数据元素组成了一周的&q ...

  6. 【一起学Rust | 设计模式】习惯语法——使用借用类型作为参数、格式化拼接字符串、构造函数

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.使用借用类型作为参数 二.格式化拼接字符串 三.使用构造函数 总结 前言 Rust 不是传统的面向对象编程语言,它 ...

  7. Objective-C 字符串拼接函数 多个不同类型的参数拼接到一个字符串 类似于Java中 String.format()方法的原生API

    总目录 iOS开发笔记目录 从一无所知到入门 文章目录 需求 Screenshot Code Output 需求 我有多个参数(类型也许不同),需要拼接到一个字符串中. 在Java中有String.f ...

  8. Angular 为什么要引入 injection token 的概念

    你可以定义和使用一个 InjectionToken 对象来为非类的依赖选择一个提供者令牌. 这里的重点是:非类. 下列例子定义了一个类型为 InjectionToken 的 APP_CONFIG . ...

  9. Python字符串类型及操作总结

    1.字符串表示 两种类型四种表示 单行-一对单引号或一对双引号 "python" 'python' 多行-一对三单引号或一对三双引号 '''python''' "&quo ...

最新文章

  1. [zz]ZeroMQ 的模式
  2. 创智播客 大数据_中国电信启动嘉创智谷——新仓远景产业园5G部署
  3. ionic tab导航在android 顶部解决方案
  4. 打开git界面_使用 Gitea 快速搭建私有 Git 版本控制服务
  5. 前端开发 图片的插入 。。。。需演练
  6. 云小课 | 区块链关键技术之一:共识算法
  7. 包是如何通过交换机的
  8. NLP领域最优秀的8个预训练模型(附开源地址)
  9. 【C语言新手】EasyX图形库使用
  10. 用计算机中的知识秀恩爱,用你的专业,说最美的情话......
  11. css3 立方体3d旋转效果
  12. Shell攻关之运算符
  13. BIND9手册【转】
  14. Cleve Moler - MATLAB 创始人金秋10月中国大学校园行
  15. 计算机主机税率,海关总署:计算机及外围设备税率降至10%
  16. unity查找物体方法
  17. 手机中即将大行其道的Flash Lite.
  18. 最简单的uvm程序和vcs编译命令
  19. 超低功耗水气表GSM/GPRS无线抄表模块
  20. 嵌入式软件工程师职业路线

热门文章

  1. JAVA中String类的intern()方法的作用
  2. Linux scp复制文件,不需要输入密码的技巧
  3. Linux:环境变量
  4. 浏览器中的XML与JavaScript
  5. Orion Network Performance Monitor 软件在网络管理中的应用
  6. fedora7 常用软件安装
  7. 【Java】生成 .json格式文件工具类
  8. Java高级特性 第10节 IDEA和Eclipse整合JUnit测试框架
  9. 《从0到1学习Flink》—— Flink 写入数据到 ElasticSearch
  10. linux虚拟机桥接网络配置