繁体   English   中英

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

[英]Angular Service Why are we injecting on constructor

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

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

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

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

是否可以上述方式进行?

不能。在创建类之前,Angular需要知道它应该注入哪些提供程序,您不能使用后面的示例来做到这一点。

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

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();
  }
}

这是相同的参考

Angular允许您在构造函数中声明参数,因此您不必在每次注入服务时都编写很多代码。 这只是第二个示例的简写。

另外,您应该将其作为参数注入,这样可以通过提供虚假服务轻松地对组件进行单元测试,并使测试代码与可能需要真实资源(例如数据库,文件服务器等)的真实服务脱钩。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM