如何从useValue中的DI提供实例?

时间:2018-11-14 13:20:56

标签: angular dependency-injection

我正在使用角度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)

D3UtilsD3UtilsBuilder的代码

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继承的子级:Module1D3UtilsModule2D3Utils,它们每个都在其构造函数中对选择器进行硬编码。我不喜欢对DI使用继承,因为每次编辑依赖项时,都需要遍历所有继承树。

第三个。

getD3Utils设为静态。无法正常工作,因为我想通过DI将StringUtils传递给D3UtilsProvider

第四

{ provide: D3Utils, useValue: new D3Utils('#d3module1', new StringUtils()) }

在这种情况下,此操作有效,因为StringUtils当前没有依赖项。

0 个答案:

没有答案