![](/img/trans.png)
[英]Why we need the constructor while injecting service into component in Angular2
[英]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) { }
注意:
该组件不应使用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.