一、依赖注入

a) 如果模块A需要依赖模块B,通常的做法是在A中导入B,import{B} from ‘B’,但有一些场合需要解除这种直接依赖,比如单元测试时需要mock一个B对象、还有时要创建B的单例或者用工厂模式生成B,这时适合使用依赖注入(Dependency Injection)的方式来解除对B的直接依赖。

b) Angular的依赖注入框架包含三部分,Provider、Injector、Dependency,三者的关系为:

Provider的作用是建立类与其依赖项之间的映射(map\binding);Dependency为依赖项;Injector负责在创建对象的时候解析相关的依赖并根据Provider提供的绑定信息进行注入。

c) 记录用户登录信息的UserService是一个全局单例,对其注入并使用的例子为:

import{ Component, ReflectiveInjector } from '@angular/core';

import{ UserService } from '../services/user.service';

exportclass UserDemoComponent {

userName: string;

userService: UserService;

constructor() {

const injector: any =

ReflectiveInjector.resolveAndCreate([UserService]);

this.userService =injector.get(UserService);

}

signIn(): void {

this.userService.setUser({ name: 'Dante'});

this.userName =this.userService.getUser().name;

}

}

导入ReflectiveInjector类后,使用它的静态方法resolveAndCreate来创建一个injector,可被注入的内容以数组的形式从参数传入,injector.get(UserService)可以解析出一个UserService对象,这里将类本身作为token。

二、使用NgModule进行注入

a) 通过前面的代码可以直观地了解注入的过程,但实际使用中却不这样做,而是要在NgModule的providers中注册依赖项,然后通过装饰器在需要使用的类的构造函数中注入:

constructor(privateuserService: UserService) {}

需要注意的是,被注入的类要用@Injectable标记,而且这样是以单例的方式注入的,还有其它注入的形式,比如非单例类、注入一个值、调用方法并把方法的返回值注入等。

providers:[UserService]这样的写法默认会注入UserService的单例,这实际上是一种简化的写法,provider的完整配置代码应该为

providers: [{ provide: UserService, useClass: UserService }],

provide字段指明了注入时的token,通过userClass\useValue等则可以设置注入对象和注入方式。

b) 注入值

//配置

providers:[{ provide: 'API_URL', useValue: 'http://api.com/v1' }]

//使用

import{ Inject } from '@angular/core';

constructor(@Inject('API_URL')apiUrl: string) {}

使用的时候要用到@Inject标记,使用这种写法可以注入全局常量。

c) 调用方法

{provide: 'API_URL', useFactory() { return 'api.com'; }

使用useFactory来调用方法作为返回值,可以使用上面的写法,也可以使用lambda表达式的形式useFactory : ( )=>…

useFactory指向的方法的返回值将会被注入。

d) 如果调用的方法需要传入参数,可以使用第三个属性:deps,比如API_URL1要用到API_URL的值作为参数:

{provide: 'API_URL1', deps: ['API_URL'], useFactory(apiUrl: string) { returnapiUrl + 'api.com'; }

那么如果要注入非单例对象,也可以通过useFactory来实例化并返回了。

Angular基础(六) DI的更多相关文章

  1. Bootstrap<基础六> 表单

    Bootstrap 通过一些简单的 HTML 标签和扩展的类即可创建出不同样式的表单. 表单布局 Bootstrap 提供了下列类型的表单布局: 垂直表单(默认) 内联表单 水平表单 垂直或基本表单 ...

  2. C#_02.15_基础六_.NET类

    C#_02.15_基础六_.NET类 一.类继承是一个类在另一个类的基础上进行的扩展. 继承的子类拥有父类的全部成员.索引子类拥有本身的全部成员以及父类的全部成员. 可以对基类成员进行隐藏,如果必须的 ...

  3. {Django基础六之ORM中的锁和事务}一 锁 二 事务

    Django基础六之ORM中的锁和事务 本节目录 一 锁 二 事务 一 锁 行级锁 select_for_update(nowait=False, skip_locked=False) #注意必须用在 ...

  4. 第214天:Angular 基础概念

    一.Angular 简介 1. 什么是 AngularJS - 一款非常优秀的前端高级 JS 框架 - 最早由 Misko Hevery 等人创建 - 2009 年被 Google 公式收购,用于其多 ...

  5. Angular基础---->AngularJS的使用(一)

    AngularJS主要用于构建单页面的Web应用.它通过增加开发人员和常见Web应用开发任务之间的抽象级别,使构建交互式的现代Web应用变得更加简单.今天,我们就开始Angular环境的搭建和第一个实 ...

  6. day 71 Django基础六之ORM中的锁和事务

    Django基础六之ORM中的锁和事务   本节目录 一 锁 二 事务 三 xxx 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 锁 行级锁 select_for_update(no ...

  7. day 58 Django基础六之ORM中的锁和事务

      Django基础六之ORM中的锁和事务   本节目录 一 锁 二 事务 三 xxx 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 锁 行级锁 select_for_update( ...

  8. Django基础六之cookie和session

    Django基础六之cookie和session 目录 Django基础六之cookie和session 1. cookie和session介绍 1.1 cookie 简介 1.2 cookie的缺陷 ...

  9. Spring基础[IOC/DI、AOP]

    一.Spring作用:管理项目中各种业务Bean(service类.Dao类.Action类),实例化类,属性赋值 二.Spring IOC(Inversion of Control )控制反转,也被 ...

随机推荐

  1. javaScript 二分查找

    什么是二分查找的,举个栗子: var arr = [1, 3, 5, 7, 9, 11, 14, 15, 17, 19, 20]; 上面有序数组, 随便给你一位 9 ,输出该数在数组中的索引.   当 ...

  2. fast.ai(零)windows + pytorch 0.4

    一.下载 git clone https://github.com/fastai/fastai.git 或者直接下载下来 二.安装pytorch 去官网安装建议安装即可 https://pytorch ...

  3. OC学习5——类和对象

    1.OC是在C语言基础上进行扩展得到的一门面向对象的程序设计语言,它也提供了定义类.成员变量和方法的基本功能.类可以被认为是一种自定义的数据类型,使用它可以定义变量,所有使用类定义的变量都是指针类型的 ...

  4. Liferay平台开发使用详细PPT演示文稿

    主要章节: 概述 功能和使用 开发扩展 安全.认证 高可用 Demo 独立流程演示工程: Liferay集成Activiti开发工程: PPT演示文稿下载 Demo程序分2部分: 独立流程演示工程:h ...

  5. Python函数——列表推导式、生成器与迭代器

    列表推导式 产生背景 现在有个需求,看列表[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],要求你把列表里的每个值加1,你怎么实现? 第一种方法: a = [1,3,4,6,7,7,8,9 ...

  6. CSS基础和选择器

    什么是CSS? CSS是指层叠样式表(Cascading Style Sheets),样式定义如何显示HTML元素,样式通常又会存在于样式表中.也就是说把HTML元素的样式都统一收集起来写在一个地方或 ...

  7. [视频]K8飞刀 正则采集WordPress站点用户

    链接:https://pan.baidu.com/s/16NCuC-mD4-3dxfVdcIFkxg 提取码:k3bw

  8. 测试工具之Jmeter(创建一个简单测试用例)

    前面介绍了如何使用badboy录制jmeter脚本,以及如何导入脚本并进行测试 这里介绍下手动创建测试用例,主要步骤如下: 1.创建线程组 第一次打开Jmeter只有一个测试计划,右键“测试计划”选择 ...

  9. Python:标准库(包含下载地址及书本目录)

    下载地址 英文版(文字版) 官方文档 The Python Standard Library <Python标准库>一书的目录 <python标准库> 译者序 序 前言 第1章 ...

  10. python 浅析模块,包及其相关用法

    今天买了一本关于模块的书,说实话,模块真的太多了,小编许多也不知道,要是把模块全讲完,可能得出本书了,所以小编在自己有限的能力范围内在这里浅析一下自己的见解,同时讲讲几个常用的模块. 这里是2018. ...