Angular学习六:Angular 的依赖注入模式

Angular 的依赖注入模式

依赖注入: Dependency Injection 简称 DI

依赖注入模式要解决的问题

开发中,会经常遇见对象的实例化,当多个对象之间存在依赖时,手工实例化会特别麻烦。
如果一个对象A要依赖对象B,那么对象A不需要明确地去实例化B对象,B会由外部机制注入进来,对象A只需要声明一个B对象就行。这就是依赖注入要解决的问题。
与依赖注入经常同时出现的另一个概率叫做控制反转
控制反转: Inversion of Control 简称 IOC,是指将依赖的控制权从代码的内部反转到代码的外部。
依赖注入控制反转是一体两面,表达的是一个思想。依赖注入侧重于描述手段,即如何实现控制反转,控制反转侧重于描述目的,即目的是将依赖的控制权从代码的内部反转到代码的外部。

依赖注入模式的好处

  • 松耦合,可重用
  • 提高组件的可测试性

Angular 如何实现依赖注入

注入器

每个组件都有一个注入器实例,负责注入组件需要的对象。注入器是Angular提供的一个服务类。一般情况下不用直接调用注入器的方法,注入器会自动通过组件的 构造函数(constructor) 将组件需要的对象注入进组件。提供器会告诉注入器如何创建实例。

提供器

为了让注入器知道注入的对象如何实例化,需要指定提供器,一般情况下,我们会通过组件或模块的providers属性声明需要提供的对象。

一般声明方式

providers:[{provide:AService, useClass: AServivce}] <=> providers:[AService]
provide属性:指定了提供器的令牌(token)
useClass属性:表示实例化方式是 new

工厂方法声明方式

使用useFactory方式实例化对象
providers:[
  {
    provide:AService, 
    useFactory: (bService: BService) => {
      ....
    },
    deps:[BService] //deps声明工厂方法所依赖的服务。
    ]
工厂方法创建的对象是单例对象 

在构造函数(constructor)中声明的对象,会根据类名去匹配提供器(providers)中的令牌(token),然后根据useClass属性的值去实例化指定的对象。

提供器注入规则

  • 一个提供器声明在模块时,对所有组件都是可见的,所有组件都可以注入;
  • 一个提供器声明在组件时,只对声明它的组件和子组件可见,其他组件不可见;
  • 当声明在模块的提供器与声明在组件的提供器具有相同token时,声明在组件的提供器会覆盖声明在模块的提供器;
  • 一般情况下,我们都应该在模块中声明提供器。

相关文章

ANGULAR.JS:NG-SELECTANDNG-OPTIONSPS:其实看英文文档比看中...
AngularJS中使用Chart.js制折线图与饼图实例  Chart.js 是...
IE浏览器兼容性后续前言 继续尝试解决IE浏览器兼容性问题,...
Angular实现下拉菜单多选写这篇文章时,引用文章地址如下:h...
在AngularJS应用中集成科大讯飞语音输入功能前言 根据项目...
Angular数据更新不及时问题探讨前言 在修复控制角标正确变...