我有一个这样的课程
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?
答案 0 :(得分:2)
1.-为什么我为公司和员工地址对象获取相同的Address对象?
那是因为你使用相同的注射器。注入树映射组件树,这意味着每个组件都有自己的注入器,它将尝试使用它来解析其依赖关系,如果不可能,它会将分辨率冒泡到根注入器。在这种情况下,由于您没有将模型包含在组件提供程序中(您的注入器基本上是空的),它将使用根注入器并在整个应用程序中传递相同的注入实例。一步一步:
注意:在组件级别上使用注入器将无济于事 - 对于在该组件范围内注入Address的所有对象,它仍然是相同的地址。
2.-如何获得Address对象的不同实例?
您可能需要查看此question。此外,您还可以查看documentation。
3.-我知道,我可以使用new运算符在EmployeeComponent的构造函数中创建一个新的Address实例,然后将其分配给 让我们说employee.address,但那么,DI的目的是什么 Angular 2?
目的与任何其他语言相同。可能不太清楚,因为接口的使用方式与C#或其他语言的使用方式不同,但重点是减少从某个具体对象到可在运行时注入类的抽象对象的行为依赖性。它不适用于POJO,数据合同以及大多数情况下的业务领域模型。它适用于可以抽象行为并被注入许多不同软件组件的类,因此它们可以在运行时使用此行为,但不依赖于它的具体实现。