将服务注入另一个服务(单例),Angular2 时遇到问题

Jos*_*ana 5 dependency-injection typescript angular

我有两个服务,都是@Injectable。ServiceA 通过 Providers 数组提供给组件,并且在任何地方都能很好地工作。ServiceB 是一个单例,位于其模块的 Providers 数组中,在任何地方都能很好地工作。ServiceA 需要保持不是单例,ServiceB 需要保持单例。

我的问题是现在我需要从 ServiceB 访问 ServiceA,但不知道如何访问它。似乎我无法将非单例服务注入单例。

我遇到的一切都告诉我将服务放在引导程序或模块声明中,但正如我所提到的,我不能这样做,因为我需要 ServiceA 作为非单例行为。

// module setup
... providers: [ServiceB]

// non-singleton
@Injectable()
export class ServiceA

// singleton
@Injectable()
export class ServiceB {
  constructor(ServiceA)  // <-- this is the problem area, need to get ServiceA here
Run Code Online (Sandbox Code Playgroud)

我曾尝试做类似构造函数(Inject(ServiceA) serviceA) 的事情,但似乎遇到了同样的错误

错误:DI 错误 ServiceA 没有提供程序!

  1. 如何将非单例服务“提供”为单例服务,两者都是@Injectable?

Ang*_*hef 5

您可以同时声明ServiceAin@Component.providers@NgModule.providers

  • 当注入ServiceA组件的构造函数时,您将获得组件范围的实例(对应于@Component.providers声明)。
  • 当注入ServiceA另一个服务的构造函数时(在您的情况下:注入ServiceAServiceB),您将获得全局实例(对应于@NgModule.providers声明)。

换句话说,如果您在组件的提供者 ( @Component.providers) 中重新声明服务,它将“隐藏”在@NgModule.providers.

注意事项:

  • 如果你注入ServiceAServiceBServiceC,然后B和C会得到A的同一实例
  • 正如 Seaal 在评论中提到的,以这种方式组织代码可能不符合最佳实践。