Angular 2中对象的多个不同的注入实例

时间:2017-03-21 23:00:19

标签: angular dependency-injection

我有一个这样的课程

  import {Injectable } from '@angular/core';
  @Injectable()
  export class Address {
        street: string;
       ... some other attributes

  }

这样的课程

  import {Injectable } from '@angular/core';
  import { Address } from './address';

   @Injectable()
   export class Company {
         name: string;
         constructor(public address: Address) {}
   }

我使用上面这样的类

  import { Injectable } from '@angular/core';
  import { Address } from './address'; 
  import { Company } from './company';

   @Injectable()
   export class Employee {
      name: string;
      lastName: string;

      constructor(public address: Address,
                  public company: Company) {}
   }

现在,我在像这样的组件中使用Employee类

  import {Component } from '@angular/core';
  import { Employee } from '../model/employee';

  @Component({
   moduleId: module.id,
   selector: 'my-employee',
   templateUrl: '../views/employee.html
  })
  export class EmployeeComponent {
      constructor(public employee: Employee){}

   ... some other stuff;
 }

我的问题是:

1.-为什么我为公司和员工地址对象获得相同的地址对象? 2.-如何获得地址对象的不同实例?

3.-我知道,我可以使用new运算符在EmployeeComponent的构造函数中创建地址的新实例,然后将其分配给let的说员工。地址,但那么,目的是什么 DI在角度2?

1 个答案:

答案 0 :(得分:2)

  

1.-为什么我为公司和员工地址对象获取相同的Address对象?

那是因为你使用相同的注射器。注入树映射组件树,这意味着每个组件都有自己的注入器,它将尝试使用它来解析其依赖关系,如果不可能,它会将分辨率冒泡到根注入器。在这种情况下,由于您没有将模型包含在组件提供程序中(您的注入器基本上是空的),它将使用根注入器并在整个应用程序中传递相同的注入实例。一步一步:

  1. 您的EmployeeComponent构造函数请求Employee injection
  2. 向根注入器请求气泡(组件注入器中没有任何内容)
  3. Injector尝试创建新的Employee
  4. 员工构造函数请求公司和地址注入
  5. Injector创建新地址
  6. Injector尝试创建公司
  7. 公司要求地址注入
  8. Injector从步骤5中注入已解析的Address对象。
  9. Injector创建公司
  10. Injector创建员工
  11. Injector将Employee注入Employee组件
  12. 注意:在组件级别上使用注入器将无济于事 - 对于在该组件范围内注入Address的所有对象,它仍然是相同的地址。

      

    2.-如何获得Address对象的不同实例?

    您可能需要查看此question。此外,您还可以查看documentation

      

    3.-我知道,我可以使用new运算符在EmployeeComponent的构造函数中创建一个新的Address实例,然后将其分配给   让我们说employee.address,但那么,DI的目的是什么   Angular 2?

    目的与任何其他语言相同。可能不太清楚,因为接口的使用方式与C#或其他语言的使用方式不同,但重点是减少从某个具体对象到可在运行时注入类的抽象对象的行为依赖性。它不适用于POJO,数据合同以及大多数情况下的业务领域模型。它适用于可以抽象行为并被注入许多不同软件组件的类,因此它们可以在运行时使用此行为,但不依赖于它的具体实现。