概述

Angular 2使用自己的依赖注入框架并采用构造注入方式,依赖注入分两个步骤: 1) 向injector注册Provider 2) 构造类时injector根据参数注入对应的实例。

如上图所示,注册时在injector中建立注入名称和注入实例的对照表,获取时根据注入名称返回对应的注入实例。在同一injector中,注入实例相当于Singleton。

injector可以编码显式调用;Angular 2构造时自动获取注入实例,一般地不需要显式调用。

如果服务依赖于另一个服务,在定义服务类时需要加@Injectable标注;建议所有服务均使用@Injectable标注。

Provider

依赖注入注册有以下三种方式:

1. 注册类 Class Provider

最常见的类注册表达式如[LoggerService],是以下表达式的缩写:

[new Provider(LoggerService, {useClass: LoggerService })]

参数含义如下:

  • 第一个参数是注入名称(token)
  • 第二个参数用于产生注入实例。

可以使用其他类提供注入实例,如:

[ provider(LoggerService, { useClass: BetterLogger }) ]

也可以指定注入名称的别名,如:

[  LoggerService ,provider(OtherLogger,  {useExisting: LoggerService })
]

2. 注册值 Value Provider

可以直接指定注入的实例,如:

[ provider(LoggerService, { useValue: loggerInstance }) ]

3. 注册工厂方法 Factory Provider

当需要根据动态值确定依赖注入的实例是,可使用工厂方法注入。

注入名称 DI Token

以上注入的都是类实例,注入名称是类的类型。

如果注入的不是类(如字符串、Object或函数),注入名称可以是:

  • 常量字符串
  • OpaqueToken:优于在代码中直接使用常量字符串。

在此情况下,构造函数语法如下:

constructor(@Inject(APP_CONFIG)  private config: Config)
{ ... }

层级依赖注入

Angular 2有两种注册方式:

  • bootstrap函数的第二个参数
  • @Component的providers元数据

前者创建全局级依赖注入,整个应用一个实例;后者创建组件级依赖注入,每个组件拥有自己的实例。形成的依赖注入树如下图所示:

一般地,组件在自身injector找不到注入名称时,到父组件injector中查找,直至全局级injector为止。

根据前面的说明,类注入可以使用其他类提供实例。这意味着在依赖注入树中,同名的注入名称在不同层级可能对应到不同类型的实例。为避免注入错误的类型实例,Angular 2提供以下措施:

  • 构造函数参数@Host标注:表示该参数的注入查找到该组件的上层宿主元素为止;
  • @Component标注的viewProviders元数据:本组件使用的注入名称可以从viewProviders列表查询。viewProviders对子组件树不可见,因此如果是某个子组件查询同名的注入名称,则可以继续向上层组件查询。

一般地,推荐使用@Component providers元数据注册;除了通过服务进行组件间交互情况,因为交互的组件必须共享同一实例。

转载于:https://www.cnblogs.com/wspnet/articles/5453064.html

Angular 2 之七 依赖注入相关推荐

  1. Angular 中的依赖注入link

    Angular 中的依赖注入link 依赖注入(DI)是一种重要的应用设计模式. Angular 有自己的 DI 框架,在设计应用时常会用到它,以提升它们的开发效率和模块化程度. 依赖,是当类需要执行 ...

  2. 【Angular 4】依赖注入

    Angular算是将后端开发工程化引入前端的先驱之一,而Dependency injection依赖注入(后面简称为DI)又是Angular内部运作的核心功能,所以要深入理解Angular有必要先理解 ...

  3. angular中的依赖注入

    依赖项是指某个类执行其功能所需的服务或对象.依赖项注入(DI)是一种设计模式,在这种设计模式中,类会从外部源请求依赖项而不是创建它们. Angular 的 DI 框架会在实例化某个类时为其提供依赖.你 ...

  4. Angular应用的依赖注入调试

    上下文:我实现了一个hero service,在其构造函数里添加了一些打印语句: 在另一个Component的构造函数里将其注入: 运行时,观察service构造函数如何被调用的: function ...

  5. Angular 依赖注入

    问题描述 初学Angular,可能对一堆注解有些懵. 我们一起通过实例来探讨Angular的依赖注入. 一路尝试 @Injectable 一个命令建的StockService,一个手动建的TestSe ...

  6. angular 注入器配置_Angular依赖注入介绍

    依赖注入(DI -- Dependency Injection)是一种重要的应用设计模式.Angular里面也有自己的DI框架,在设计应用时经常会用到它,它可以我们的开发效率和模块化程度. 依赖,是当 ...

  7. 我的angularjs源码学习之旅2——依赖注入

    依赖注入起源于实现控制反转的典型框架Spring框架,用来削减计算机程序的耦合问题.简单来说,在定义方法的时候,方法所依赖的对象就被隐性的注入到该方法中,在方法中可以直接使用,而不需要在执行该函数的时 ...

  8. 理解AngularJS中的依赖注入

    作者 CraftsCoder 冷月无声 - 博客频道 - CSDN.NET http://blog.csdn.net/jaytalent/article/details/50986402 本文结合一些 ...

  9. SAP Spartacus 中的依赖注入 Dependency Injection 介绍

    先了解 Angular 中的依赖注入 依赖项是指某个类执行其功能所需的服务或对象.依赖项注入(DI)是一种设计模式,在这种设计模式中,类会从外部源请求依赖项而不是让类自己来创建它们. Angular ...

最新文章

  1. python写小程序-用python写个简单的小程序,编译成exe跑在win10上
  2. vs2010 编译linux,VS2010 Boost编译安装
  3. 诗与远方:无题(二十三)
  4. 全连接层和卷积层最终应用在网络上的不同之处
  5. NOI题库--砝码称重V2(多重背包2^n拆分)
  6. coderforces Gym 100803A/Aizu 1345/CSU 1536/UVALive 6832 Bit String Reordering(贪心证明缺)
  7. bootstrap-内联文本元素-斜体
  8. Docker概念学习系列之详谈Docker 的核心组件与概念(5)
  9. NPDP是什么考试?产品经理必知
  10. 网易编程题之地牢逃脱
  11. 服务器数据恢复;IBM V7000数据恢复方法
  12. Linux安装PHP:system libzip must be upgraded to version = 0.11
  13. 【互联网人的英语】背景知识对于理解文章究竟有多重要?
  14. 这位博主居然说“我就是看故事也要把这知识学了”
  15. Loadrunner添加关联
  16. PIL库中Image类thumbnail方法和resize方法区别
  17. oss系统和bss系统 mss系统是什么意思
  18. 团队作业3 需求改进与系统设计
  19. java isnan_Java Float isNaN()用法及代码示例
  20. 数值计算方法——第一节方程的根的求解

热门文章

  1. 大道至简 第二章 读后随笔
  2. 一个axios的简单教程
  3. LeetCode(590)——N叉树的后序遍历(JavaScript)
  4. Go语言---面向对象编程
  5. STL六大组件 功能与运用(略写)
  6. “this”不能在常量表达式中使用报错的解决方法
  7. 为什么我的U盘传到一半速度会变成0然后过一会儿才回继续
  8. 两百多的无线蓝牙耳机和一千多的AirPods,外观几乎一样,硬件差距在哪里?
  9. 如何使用ISO升级TrueNAS主要版本
  10. 为什么感觉腹部肥胖不好减?