我认为这对许多其他开发者来说可能是常见的问题,但我还没有找到一些有效的解决方案。
我正在开展Angular2项目。当然,当我需要进行http调用来管理我的数据时,我有很多地方。所以我使用Http
服务,一切都按预期工作。
在某个架构阶段(当团队已经实现了大部分页面时),新的需求到位 - 现在我们需要更深入地连接我们的服务器和客户端,因此应该将额外的头添加到从客户端发起的所有请求中(可以进行身份验证) bearer token,方法覆盖指令以通过防火墙,许多其他)。
根本不是问题。 10分钟完成:
MyHttp
get
,post
,put
,delete
方法并添加所需的标题Http
MyHttp
个引用
但是当你涉及许多开发人员时,这种方法并不好:
Http
服务而不是MyHttp
,因此会引入不正确的行为因此,更适合多团队开发的方法是使用@NgModule
模块类注释,使用Http
配置将新MyHttp
服务替换为新的provide
:
@NgModule({
declarations: [ ... ],
imports: [ ... ],
providers: [..., {provide: Http, useClass: MyHttp}],
bootstrap: [AppComponent]
})
从我的观点来看,这种方法有很多优点:
Http
替换为MyHttp
Http
服务MyHttp
代替Http
- 他们的行为相同唯一的问题是,我们在MyHttp
内创建循环依赖,我们需要使用旧的Http
@Injectable()
export class HttpService {
constructor(private http: Http) {
}
get(url: string) { return this.http.get(url); }
post(url: string, data: any) { ...}
...
}
抛出异常:
无法实例化循环依赖!
唯一的方法 - 创建MyHttp
完全独立于Http
。但它增加了代码的复杂性。说实话,这种实施气味。
是否有任何解决方案如何使用上面定义的配置在Http
内使用MyHttp
?
感谢。
答案 0 :(得分:4)
@Injectable()
export class MyHttp extends Http {
}
@NgModule({
declarations: [ ... ],
imports: [ HttpModule, ... ],
providers: [...,
{provide: ConnectionBackend, useClass: XhrBackend},
{provide: Http, useClass: MyHttp}
],
bootstrap: [AppComponent]
})
无需以这种方式注入HTTP。
只需从https://github.com/angular/angular/blob/5921c872b6ef2f2de31f90576660a1bf56afb979/modules/%40angular/http/src/http.ts#L103-L184覆盖您想要有不同行为的内容。