如何将 httpClient 注入到实例化服务中?

How do I inject httpClient into an instantiated service?

我在 app.module.ts 中实例化 MyService,并在我的代码中提供它。

但是,我希望 MyService 使用 httpClient,但我无法angular- 惯用地实例化 httpClient 作为参数传递给 MyService。我不确定在 MyService 中访问 httpClient 的正确方法是什么。

我研究过直接实例化 httpClient,然后将其作为参数传递给我的服务。然而,这似乎造成了循环依赖。我也尝试过弄乱注入器,但显然 Angular 团队特别建议不要这样做。我强烈觉得我缺少一些简单的东西。

app.module.ts

imports: [
    ...
    httpClientModule
    ...
],

function MainServiceFactory() {
    return new MyService();
}
...
providers: [{
    provide: MyService,
    useFactory: MainServiceFactory
}],
...

MyService.ts

...
constructor(private http : HttpClient) {
    ...
}

没有实例化并作为 httpClient 的参数传递:我自然得到一个 "error in app.module.ts, expected 1 argument"! 通过实例化,我违反了 angular 建议。

编辑: 我忽略了指定我确实导入了 httpClientModule

大家都说,你要导入HttpClientModule

查看您的代码,我认为您正在尝试处理 angular's dependency injection:

我在 stackblitz 中做了一个例子:

https://stackblitz.com/edit/angular-yqvlv7?file=src%2Fapp%2Fapp.module.ts

我在这里定义了一个抽象class来表现得像一个接口,然后my.service实现了这个接口。

在 app.module 中,我使用 my-service class 提供 'interface'。做完这一切,你可以在组件中注入'interface'(在这个link,hello.component.ts)

HttpClient只在my-service注入,完全没有问题

希望能帮助您更好地理解它。

Angular API 中所述,FactoryProvider 有一个可选的 deps 字段继承自 core/FactorySansProvider。该字段是一个数组,您可以在其中放置工厂的依赖项。唯一需要的更改是:

function MainServiceFactory(http: HttpClient) {
    return new MyService(http);
}

providers: [{
    provide: MyService,
    useFactory: MainServiceFactory,
    deps: [HttpClient]
}],

此处引用 Angular dependency providers。该文档还说 useFactory 应该用于评估 运行 时间依赖性而不是静态依赖性,但我猜你在实际代码中有多个选项。