zoukankan      html  css  js  c++  java
  • 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 }]

  • 相关阅读:
    【转】Git: There is no tracking information for the current branch.
    【转】git多个远程仓库
    【转】python批量快速合并excel文件
    【转】HTML5-postMessage实现跨域
    Python3正则表达式search和findall差异讨论
    Python Segmentation fault错误定位办法
    Python3压缩和解压缩实现
    Python3+profile性能分析
    案例:ADG环境遇到redo日志member路径有误以及RMAN-6571错误
    CentOS7的udev的绑定规则
  • 原文地址:https://www.cnblogs.com/noper/p/6414712.html
Copyright © 2011-2022 走看看