我正在使用角度7.0.1
简而言之,我很感兴趣在提供新值时如何通过DI获取服务实例:
providers:[{provide: D3utils, useValue: new D3Utils('selector', StringUtils)]
,其中StringUtils
应该由DI提供。
正在上3个课:
D3Utils
-constructor(selector, stringUtils)
StringUtils
D3UtilsProvider
-constructor(stringUtils)
。具有方法getD3Utils(selector) => new D3Utils(selector, this.stringUtils)
D3Utils
和D3UtilsBuilder
的代码
class D3Utils implements ID3Utils {
constructor(private selector: string, private stringUtils: StringUtils) {
}
}
export class D3UtilsProvider {
constructor(private stringUtils: StringUtils) {
}
public getD3Utils(selector: string) {
return new D3Utils(selector, this.stringUtils);
}
}
问题是 D3Utils 需要由DI提供的 StringUtils 和一个应手动传递的参数。我要写下一个:
在第一个模块中
providers: [{
provide: D3Utils,
useValue: D3UtilsProvider.getBuilder('module1')
}];
在第二个模块中
providers: [{
provide: D3Utils,
useValue: D3UtilsProvider.getBuilder('module2')
}];
因此,在D3UtilsProvider.getBuilder('module2')
行中,我需要D3UtilsProvider
的实例,该实例需要DI中的StringUtils
。该怎么做?
PS。我找到了什么解决方法
第一个。
{ provide: 'd3selector', useValue: '#d3module1'}
{ provide: 'd3selector', useValue: '#d3module1'}
我不喜欢,d3selector是什么绝对不明显。
第二个。
创建两个从D3Utils
继承的子级:Module1D3Utils
和Module2D3Utils
,它们每个都在其构造函数中对选择器进行硬编码。我不喜欢对DI使用继承,因为每次编辑依赖项时,都需要遍历所有继承树。
第三个。
将getD3Utils
设为静态。无法正常工作,因为我想通过DI将StringUtils
传递给D3UtilsProvider
。
第四
{ provide: D3Utils, useValue: new D3Utils('#d3module1', new StringUtils()) }
在这种情况下,此操作仅有效,因为StringUtils当前没有依赖项。