防止在Angular 6中进行分层依赖注入

时间:2018-10-14 23:41:31

标签: angular typescript dependency-injection

tl; dr: 如何防止Angular在较低级别的模块中注入HttpClient的自定义实现?相反,我想使用Angular附带的标准实现(例如,不使用拦截器)。


我使用Angular CLI构建了Angular 6库。该库还导出模块和服务,为我提供身份管理功能(自行编写),并使用HttpClientModule向api服务器发送请求。

在我的应用程序中,我引用了该库(通过私有npm打包),该库运行良好。

最近,我偶然发现HttpInterceptors将功能从ngx火箭入门套件扩展到已经存在的HttpClient。您可以在以下位置找到HttpClient实现的代码:https://github.com/ngx-rocket/starter-kit/blob/master/src/app/core/http/http.service.ts

当我在我的应用程序模块的providers数组中提供自己的HttpClient实现时,似乎由于Angular分层依赖注入,我的库也将使用所提供的自定义实现,即使我不希望这样做

所以我的问题是: 如何防止Angular在较低级别的模块中注入HttpClient的自定义实现?相反,我想在较低级别的模块中使用标准实现(例如,不使用拦截器)。

我已经尝试提供的内容

{ provide: HttpClient, useValue: HttpClient }

在我的用户服务中(请在下面找到代码)无效。

此代码在我的应用程序内部:

app.module.ts

/* other module code */
imports: [
   UserModule
],
providers: [
   { provide: HttpClient, useValue: MyOwnHttpClientImplementation }
]
/* other module code */

此代码在库中:

user.module.ts

/* other module code */
imports: [
    HttpClientModule
    /* At this point, I want to use the standard HttpClient implementation */
],
providers: [
    UserService,
    { provide: HttpClient, useValue: HttpClient }
]
/* other module code */

user.service.ts

/* Here are standard HttpClient .get requests, which unfortunately
   use the interceptors that are being provided by the application that
   uses the library and the user module / service */

1 个答案:

答案 0 :(得分:0)

我通过在用户服务的构造函数中创建一个新的注射器实例解决了这一问题。这样,将不使用外部应用程序的HttpClient,而是使用角度实现:

Ctrl+T