Angular 4 依赖注入教程之一 依赖注入简介

24

目录

阅读须知

本系列教程的开发环境及开发语言:

基础知识

Angular CLI 基本使用

npm install -g @angular/cli
  • 创建新的项目

ng new PROJECT-NAME
  • 启动本地服务器

cd PROJECT-NAME
ng serve

依赖注入简介

在介绍依赖注入的概念和作用前,我们先来看个例子。各位看官请睁大眼睛,我要开始 "闭门造车" 了。

示例说明

一辆车内部构造很复杂,出于简单考虑,我们就只考虑三个部分:车身、车门和引擎。接下来我们来定义各个部分。

1.定义车身类

export default class Body { }

2.定义车门类

export default class Doors { }

3.定义车引擎类

export default class Engine {
  start() {
    console.log('?开动鸟~~~');
  }
}

4.定义汽车类

import Engine from './engine';
import Doors from './doors';
import Body from './body';

export default class Car {
    engine: Engine;
    doors: Doors;
    body: Body;

    constructor() {
      this.engine = new Engine();
      this.body = new Body();
      this.doors = new Doors();
    }

    run() {
      this.engine.start();
    }
}

一切已准备就绪,我们马上来造一辆车:

let car = new Car(); // 造辆新车
car.run(); // 开车上路咯

车已经可以成功上路,但却存在以下问题:

  • 问题一:在创建新车的时候,你没有选择,假设你想更换汽车引擎的话,按照目前的方案,是实现不了的。

  • 问题二:在汽车类内部,你需要在构造函数中手动去创建各个部件。

为了解决第一个问题,提供更灵活的方案,我们可以重构一下已定义的汽车类,具体如下:

export default class Car {
    engine: Engine;
    doors: Doors;
    body: Body;

    constructor(engine, body, doors) {
      this.engine = engine;
      this.body = body;
      this.doors = doors;
    }

    run() {
      this.engine.start();
    }
}

重构完汽车类,我们来重新造辆新车:

let engine = new NewEngine();
let body = new Body();
let doors = new Doors();
this.car = new Car(engine, body, doors);
this.car.run();

此时我们已经解决了上面提到的第一个问题,要解决第二个问题我们要先介绍一下依赖注入的概念。

依赖注入的概念

软件工程中,依赖注入是种实现控制反转用于解决依赖性设计模式。一个依赖关系指的是可被利用的一种对象(即服务提供端) 。依赖注入是将所依赖的传递给将使用的从属对象(即客户端)。该服务是将会变成客户端的状态的一部分。 传递服务给客户端,而非允许客户端来建立或寻找服务,是本设计模式的基本要求。 —— 维基百科

看完概念是不是已经晕了,其实我们只要记住依赖注入的三种角色:使用者、服务(依赖对象)及注入器(Injector)。接下来我们马上来看一下 Angular 中依赖注入的应用。

Angular 依赖注入的应用

更新后的汽车类

@Injectable()
export default class Car {
  constructor(
    private engine: Engine, 
    private body: Body, 
    private doors: Doors) {}
    
   run() {
     this.engine.start();
   }
};

具体应用

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

let injector = ReflectiveInjector.resolveAndCreate([Car, 
  Engine, Doors, Body]);
let car = injector.get(Car);
car.run();

看完上面的示例,我们前面提到的第二个问题,已经完美解决了哈。如果想进一步了解依赖注入的相关内容,可以参考 Angular 2 DI - IoC & DI - 1 这篇文章哈。


如果觉得我的文章对你有用,请随意赞赏

你可能感兴趣的

木支木兮 · 2017年06月04日

所以angular core提供的 ReflectiveInjector 构造器就是闭门造车用的了?它掌握了控制权

回复

2

其实就是由注入器去统一帮助我们管理和创建依赖对象,用户只需根据实际的需要,配置好Provider,然后使用构造注入的方式,注入所需的依赖对象即可,不用关心依赖对象的创建工作和对象的管理。另外使用DI,也降低了使用者与依赖对象之间的耦合性。Angular在启动的时候,会收集我们配置的 Provider 然后创建根级注入器,但只要一创建完就不会再更新内部的Provider了。

semlinker 作者 · 2017年06月05日
2

Angular依赖注入的东西还涉及挺多东西的,如Multi Provider、子注入器、灵活的依赖对象索引规则(@SkipSelf、@Host、@Optional等)、元素级注入器、InjectionToken 等内容。另外闭门造车,是我为了引入对应的示例哈。

semlinker 作者 · 2017年06月05日
追枫 · 2017年10月24日

我赞了,但是没看懂~
let car = injector.get(Car);

get()方法哪里来的呢?

回复

载入中...