我已经知道什么/如何使用deps
这是工厂方法需要注入(inject) token 的时候,因此我们需要像这样提供它们:

const randomFactory = (car,engine) => { return ... };
 ...
 providers: [Car,Engine,
             { provide: 'Random',
               useFactory: randomFactory ,
               deps: [Car, Engine],
             },
            ]

但我读过here:



但是后来我问in other place:



我不想在两个地方继续发表评论,因此我的问题是:

问题:

在哪种情况下,我可以将useClassdeps一起使用?

另外,即使我使用了它,也要说Foo类:
Class Foo
{
 constructor ( private s1:Service1 , private s2:service2){}
}

^已经有(!)自己的ctor。将把deps依赖项注入(inject)哪里? (附加到ctor ??)

}

场景+代码的示例将不胜感激。

最佳答案

提供程序有两种:

静态提供者提供者

javascript -  `deps:[]`也可以与 `useClass`一起使用吗?-LMLPHP

静态提供者

这是一种用于以静态方式配置Injector的提供程序(,不带反射)

根据commit



Changelog

是什么意思?

1)当我们将提供程序传递给平台时,我们必须指定deps,因为我们必须使用StaticClassProviderConstructorProvider而不是仅ClassProvider(请参见上图)

platformBrowserDynamic().bootstrapModule(AppModule,
 {
   providers: [
    {
       provide: ElementSchemaRegistry,
       useClass: CustomDomElementSchemaRegistry,
       deps: [] <===================== required here
    }
   ]
 }
);

2)当我们动态创建Injector时,必须指定deps,因为Injector.create takes StatisProvider数组。

例如:
export const MyParams = new InjectionToken<string[]>('params');

export class MyService {
  constructor(@Inject(MyParams) public someParameters: string[]) {}
}

@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  name = 'Angular ' + VERSION.full;

  constructor() {
      const inj = Injector.create([
      { provide: MyService, useClass: MyService  } <=== we will get an error because we have to define deps
    ])
  }
}

https://ng-run.com/edit/5Xm4jwAoXXyAIspwF571

提供者

@NgModule @ Component / @ Directive 元数据中编写提供程序时,通常使用这种提供程序

看着这个答案how the parameters of a forRoot() module's method is passed to a provider?,我会说在那里不需要deps。我们只需要在providers数组中提供Params,angular就可以为我们完成所有工作。

@estus说



因为他的意思是Provider(更确切地说是ClassProvider)而不是StaticProvider
P.S. 您也可以阅读我有关StaticInjector的文章:)
  • https://medium.com/@a.yurich.zuev/angular-how-staticinjector-replaces-reflectiveinjector-6f303d2798f6
  • 10-06 11:33