Как предоставить экземпляр из DI в useValue? - PullRequest
0 голосов
/ 14 ноября 2018

Я использую angular 7.0.1

Короче, меня интересует, как получить экземпляр службы по DI при предоставлении нового значения: providers:[{provide: D3utils, useValue: new D3Utils('selector', StringUtils)], где должно быть указано StringUtilsпо DI.

Играют 3 класса:

  1. D3Utils - constructor(selector, stringUtils)
  2. StringUtils
  3. 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 в настоящее время не имеет зависимостей.

...