Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 通过构造器参数与喷油器服务进行喷油_Angular_Dependency Injection - Fatal编程技术网

Angular 通过构造器参数与喷油器服务进行喷油

Angular 通过构造器参数与喷油器服务进行喷油,angular,dependency-injection,Angular,Dependency Injection,我现在使用Angular2/4已经有几个月了,但我仍然不知道这两种方法之间有什么区别,我应该使用哪一种方法来进行依赖注入 你能帮帮我吗 第一种方法:通过构造函数 及 第二种方法:通过喷油器 我理解每种方法的作用,但我无法找出最佳实践 我知道这可能是一种主观观点,但我认为两者都有利弊 感谢您的解释。您应该始终选择第一个选项: ... constructor( private myService: MyService ) { // this.myService.myMeth

我现在使用Angular2/4已经有几个月了,但我仍然不知道这两种方法之间有什么区别,我应该使用哪一种方法来进行依赖注入

你能帮帮我吗

第一种方法:通过构造函数 及

第二种方法:通过喷油器 我理解每种方法的作用,但我无法找出最佳实践

我知道这可能是一种主观观点,但我认为两者都有利弊


感谢您的解释。

您应该始终选择第一个选项:

...
  constructor(
    private myService: MyService
  ) { 
    // this.myService.myMethod() ...
  }
...
第二种方法有效,因为当您注入
MyService
时,它是使用
Injector
注入的

Angular使喷油器可用于喷油,因为在动态实例化模块或组件时可能需要使用它:

组成部分:

export class ModuleLoaderComponent {
  constructor(private _injector: Injector,private loader: NgModuleFactoryLoader) { ... }

  ngAfterViewInit() {
    this.loader.load('app/t.module#TModule').then((factory) => {
      const module = factory.create(this._injector);  <-----------------
您可以在以下文章中阅读有关动态实例化的更多信息:


正如@estus所指出的,
injector
也用于在构造函数中注入依赖项会导致循环依赖的情况,或者您希望根据某些条件获得依赖项。

我被告知,通常最好使用构造函数方法进行依赖项注入。它准确地告诉您这个类需要什么

另一方面,在某些情况下,最好使用喷油器。除了动态实例化之外,还必须考虑类继承,假设要从基于服务的S2的基础组件构建组件,该服务也是基于其他服务S1的。也就是C1(S1)中的C2(S2)

通常,C2使用super实例化C1,看起来像这样

constructor(
    private service2: S2
  ) { 
    super(S1)
  }
我发现必须调用父服务S1和S2才能构建C2存在问题。如果S1使用注入器方法,那么它就不会那么纠结了,这样写C2就和

constructor(
    private injector: Injector
  ) { 
    super()
    this.service2 = this.injector.get(S2)
  }

private service2: S2
如果您想放弃构造函数中的设置实例,可以进一步创建自己的注入器单例。看见

您的第二种方法同时具有这两种功能;喷油器通过喷油器提供。还要注意的是,文档告诉您:我不是DI方面的专家,而是第一种方法,当我们创建
组件
实例时,通过键入
构造函数
参数,查找
组件所需的依赖项。这对于许多情况都是好的,但在第二种方法中,您将注入整个
DI容器
,其中包括所有服务,但并非所有情况下都需要。请检查这个@jornsharpe。Thx,你的链接很有帮助。@N.HariHaraSudhan:谢谢,我不确定这是否有真正的区别,因为所有内容都是通过引用传递的,不是吗?但我认为你是对的:第一种方法更好。。。原因很简单,通过观察构造函数,您可以快速判断需要哪些依赖项。还应该注意,
injector
用于在构造函数中注入dep导致循环依赖项的情况。类似于。对于根据某些条件动态获取dep也很有用。@AngularInDepth.com,从性能角度来看,始终第一种方法是正确的,因为注入
注入器
将导致创建当前组件不需要的所有服务,如果我错了请纠正我?@estus OK,但是循环依赖关系是糟糕的项目结构的证明,没有?@N.HariHaraSudhan
Injector将导致创建当前组件不需要的所有服务。Angular将只为视图创建注入器的新实例包装器
export class RouterConfigLoader {

  load(parentInjector, route) {
    ...
    const modFactory = this.loadModuleFactory(route.loadChildren);
    const module = modFactory.create(parentInjector);
  }
constructor(
    private service2: S2
  ) { 
    super(S1)
  }
constructor(
    private injector: Injector
  ) { 
    super()
    this.service2 = this.injector.get(S2)
  }

private service2: S2