Angular 2 - 在服务中包含提供者

Angular 2 - Including a provider in a service

我将服务作为提供者加载到组件中。此服务可能 return 使用 Http 的数据,也可能不使用,组件不应该关心。但是,如果加载的服务使用 Http,组件本身似乎必须包含 HTTP_PROVIDERS。这打破了关注点分离。我误会了什么?

事实上,最好在引导应用程序时指定 HTTP_PROVIDERS

bootstrap(AppComponent, [ HTTP_PROVIDERS ]);

但我同意你的看法,仅在组件上配置提供程序会产生一些影响。

由于分层注入器,之前的配置将起作用。

有关分层注入器的更多详细信息,请参阅此问题:

  • What's the best way to inject one service into another in angular 2 (Beta)?

This breaks separation of concerns. What am I misunderstanding?

为了支持实例化服务的多个实例(即,所有服务不必是单例),Angular 应用程序需要一种方法来指定多个注入器(而不仅仅是一个)。这些注入器需要在某种层次结构中创建和配置。 component/directive树,既然是树,就已经有了层级。所以 Angular 使用(现有的)组件树来配置依赖注入。我喜欢将其视为覆盖组件树的稀疏器 "injector tree"。

我认为为服务定义一个单独的层次结构会带来更多工作——作为开发人员,我们可能必须定义和配置另一个注入器树。

因此,与其将其视为 "components need to know the dependencies of services"(当这样说时,听起来我们确实正在打破关注点分离),我更喜欢将其视为以下内容:"when I write an Angular app, I have to configure my providers/dependencies on the injector tree"... 因为注入器树覆盖了组件树,所以我使用组件来配置它。

但这并不理想,因为如果您想在不同的应用程序中重用组件,您可能需要更改 providers 数组(即,您可能需要重新配置注入器树)。