Angular2基础03: 理解依赖注入
理解依赖注入injector
依赖注入是重要的程序设计模式。 Angular 有自己的依赖注入框架,离开了它,几乎没法构建 Angular 应用。下面我分步来加强我对它的理解:
开门见山,什么是依赖注入:它是一种编程模式,可以让类从外部源中获得它的依赖,而不必亲自创建它们
第一步:为什么要解耦?
第二步:实现解耦
第三步:依赖注入前身
接下来可以跟着官练习了,不然好浪费时间啊:https://angular.cn/docs/ts/latest/guide/dependency-injection.html
Angular依赖注入
依赖注入有构造函数注入,显性注入,主讲显性注入。
单例服务:在一个注入器的范围内,依赖都是单例的。 在这个例子中,HeroesComponent
和它的子组件HeroListComponent
共享同一个HeroService
实例。
提供商Providers: [{ provide: Logger, useClass: Logger }]
使用场景:Logger就是需要被使用的,而且他没有依赖
第一个是令牌 (token),它作为键值 (key) 使用,用于定位依赖值和注册提供商。
第二个是供应商定义对象。 可以把它看做是指导如何创建依赖值的配方。 有很多方式创建依赖值…… 也有很多方式可以写配方。
当两个相同时,可以简写为:
providers: [Logger]
备选的类提供商:比较好理解
[{ provide: Logger, useClass: BetterLogger }]
当有人请求Logger
时,返回BetterLogger
。
带依赖的类提供商:
[ UserService, { provide: Logger, useClass: EvenBetterLogger }]
这个也比较好理解,UserService是依赖项
别名类提供商:稍微复杂一点
假设某个旧组件依赖一个OldLogger
类。 OldLogger
和NewLogger
具有相同的接口,但是由于某些原因, 我们不能升级这个旧组件并使用它。
当旧组件想使用OldLogger
记录消息时,我们希望改用NewLogger
的单例对象来记录。
不管组件请求的是新的还是旧的日志服务,依赖注入器注入的都应该是同一个单例对象。 也就是说,OldLogger
应该是NewLogger
的别名。
[ NewLogger,
// Not aliased! Creates two instances of `NewLogger`
{ provide: OldLogger, useClass: NewLogger}]
上述做法会导致存在两个 NewLogger的实例。
解决方案:使用useExisting
选项指定别名。
[ NewLogger,
// Alias OldLogger w/ reference to NewLogger
{ provide: OldLogger, useExisting: NewLogger}]
值提供商:直接提供一个已经存在的对象给提供商。节省时间
[{ provide: Logger, useValue: silentLogger }]