Я использую angular 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 нуждается в StringUtils, который предоставляется DI и одним параметром, который должен быть передан вручную .Я хочу написать следующее:
в первом модуле
providers: [{
provide: D3Utils,
useValue: D3UtilsProvider.getBuilder('module1')
}];
во втором модуле
providers: [{
provide: D3Utils,
useValue: D3UtilsProvider.getBuilder('module2')
}];
Итак, в строке D3UtilsProvider.getBuilder('module2')
мне нужен экземпляр D3UtilsProvider
, который нуждается в StringUtils
от DI.Как это сделать?
PS.Какие обходные пути я нашел
Первый.
{ provide: 'd3selector', useValue: '#d3module1'}
{ provide: 'd3selector', useValue: '#d3module1'}
Мне не нравится , что совершенно не очевидно, чтоis d3selector.
Второй.
Создайте двух дочерних элементов, унаследованных от D3Utils
: Module1D3Utils
и Module2D3Utils
, каждый из которых жестко закодировал селектор в своих конструкторах,Я не люблю использовать наследование с DI, потому что каждый раз, когда вы редактируете зависимости, вам нужно пройти через все дерево наследования.
Третий.
Сделать getD3Utils
статичным.Не работает, потому что я хочу передать StringUtils
на D3UtilsProvider
с DI.
Четвертый
{ provide: D3Utils, useValue: new D3Utils('#d3module1', new StringUtils()) }
Это работает только для этого конкретного случая, потому что StringUtils в настоящее время не имеет зависимостей.