Angular2 http服务将替换为自定义服务

时间:2017-02-02 09:39:10

标签: angular

我认为这对许多其他开发者来说可能是常见的问题,但我还没有找到一些有效的解决方案。

我正在开展Angular2项目。当然,当我需要进行http调用来管理我的数据时,我有很多地方。所以我使用Http服务,一切都按预期工作。

在某个架构阶段(当团队已经实现了大部分页面时),新的需求到位 - 现在我们需要更深入地连接我们的服务器和客户端,因此应该将额外的头添加到从客户端发起的所有请求中(可以进行身份​​验证) bearer token,方法覆盖指令以通过防火墙,许多其他)。

根本不是问题。 10分钟完成:

  • 创建新服务MyHttp
  • 重新添加所有getpostputdelete方法并添加所需的标题
  • 使用新Http
  • 批量替换所有MyHttp个引用
  • 完成工作

但是当你涉及许多开发人员时,这种方法并不好:

  • 应该创建一些wiki资源并定义访问服务器的新规则。所有团队的所有开发人员都应立即开始遵循此规则
  • 由于两个服务都可以访问,因此可能会重新使用旧的Http服务而不是MyHttp,因此会引入不正确的行为
  • 当选择了错误的客户端http服务时,服务器团队更难以找到不正确的行为

因此,更适合多团队开发的方法是使用@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

感谢。

1 个答案:

答案 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覆盖您想要有不同行为的内容。