我已经知道什么/如何使用deps
。
这是工厂方法需要注入(inject) token 的时候,因此我们需要像这样提供它们:
const randomFactory = (car,engine) => { return ... };
...
providers: [Car,Engine,
{ provide: 'Random',
useFactory: randomFactory ,
deps: [Car, Engine],
},
]
但我读过here:
但是后来我问in other place:
我不想在两个地方继续发表评论,因此我的问题是:
问题:
在哪种情况下,我可以将
useClass
与deps
一起使用?另外,即使我使用了它,也要说
Foo
类:Class Foo
{
constructor ( private s1:Service1 , private s2:service2){}
}
^已经有(!)自己的ctor。将把deps依赖项注入(inject)哪里? (附加到ctor ??)
}
场景+代码的示例将不胜感激。
最佳答案
提供程序有两种:
静态提供者和提供者
静态提供者
这是一种用于以静态方式配置Injector的提供程序(,不带反射)
根据commit
Changelog
是什么意思?
1)当我们将提供程序传递给平台时,我们必须指定deps
,因为我们必须使用StaticClassProvider
或ConstructorProvider
而不是仅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
的文章:)