Angular Service为什么我们注入构造函数

时间:2018-04-10 14:04:03

标签: angular

为什么我们在构造函数中注入服务作为这样的参数?

import { HeroService } from '../hero.service'; 
constructor(private heroService: HeroService) { }

不是作为参数传递,而是为什么我们不注入构造函数内部:

import { HeroService } from '../hero.service'; 
constructor() {
    this.heroService=HeroService;
}

有可能以上述方式吗?

4 个答案:

答案 0 :(得分:1)

没有。在创建类之前,Angular需要知道它应该注入哪些提供者,使用后一个例子你不能这样做。

答案 1 :(得分:1)

您可以在官方文档中找到,

The parameter simultaneously defines a private heroService property and identifies it as a HeroService injection site.

constructor(private heroService: HeroService) { }
  • 当Angular创建HeroesComponent时,依赖注入系统会将heroService参数设置为HeroService的单例实例。
  • 您可以通过指定具有依赖关系类型的构造函数参数,告诉Angular在组件的构造函数中注入依赖项。这是HeroListComponent构造函数,要求注入HeroService。

注意:

  • 组件不应该使用new创建HeroService。它应该要求注射HeroService。

  • 通过指定具有依赖关系类型的构造函数参数,可以告诉Angular在组件的构造函数中注入依赖项。这是HeroListComponent构造函数,要求注入HeroService。

如果我们不这样做会发生什么:

如果您不想使用依赖注入,那么您应该每次都使用所需的依赖项创建新的服务实例,这是我们不想要的。

此外,我们需要为该服务声明一个新变量

例如:

export class HeroListComponent {
  heroes: Hero[];
  heroService;
  constructor()
  {
    this.heroService = new HeroService('', '');
    this.heroes = this.heroService.getHeroes();
  }
}

Here is a reference for the same

答案 2 :(得分:0)

Angular允许您在构造函数中声明参数,这样您每次注入服务时都不必编写大量代码。这只是你的第二个例子的简写。

此外,您应该将其作为参数注入,因为这样您可以通过提供虚假服务轻松地对组件进行单元测试,并将您的测试代码与需要真实服务的实际服务分离,例如数据库,文件服务器等。

答案 3 :(得分:0)

即使您的第二个示例可能有效,我也不会建议您这样做,因为使用注入器所有组件将获得他们在第二个示例中赢得的相同服务实例。因此,例如,使用服务在组件之间传递数据将不再起作用。