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类。 OldLoggerNewLogger具有相同的接口,但是由于某些原因, 我们不能升级这个旧组件并使用它。

当旧组件想使用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 }]

 

posted on 2017-02-19 03:28  码先生  阅读(738)  评论(0编辑  收藏  举报