无法将服务注入另一个服务(单例),Angular2

时间:2017-02-16 15:34:30

标签: angular typescript dependency-injection

我有两个服务,都是@Injectable。 ServiceA通过Providers阵列提供给组件,并且可以在任何地方使用。 ServiceB是一个单例,位于其模块的Providers数组中,无处不在。 ServiceA需要保持不是单身,而ServiceB需要保持单身。

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

我遇到的一切都告诉我将服务放在bootstrap或模块声明中,但正如我所提到的,我不能这样做,因为我需要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

我尝试过像构造函数(Inject(ServiceA)serviceA)这样的东西,但似乎得到了同样的错误

  

错误:DI错误   没有ServiceA的提供者!

  1. 如何将“非单身人士”服务“提供”到单身人士服务中,两者都是@Injectable?

1 个答案:

答案 0 :(得分:4)

您可以在ServiceA@Component.providers中声明@NgModule.providers

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

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

注意事项:

  • 如果您将ServiceA注入ServiceBServiceC,那么B和C将获得相同的A实例。
  • 正如Seaal在评论中所提到的,以这种方式组织代码可能与最佳实践不一致。