gpt4 book ai didi

angular - 无法将服务注入(inject)另一个服务(单例)Angular2

转载 作者:太空狗 更新时间:2023-10-29 17:52:20 25 4
gpt4 key购买 nike

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

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

我遇到的一切都告诉我将服务放在 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

我试过做类似 constructor(Inject(ServiceA) serviceA) 的事情,但似乎得到了同样的错误

Error: DI Error No provider for ServiceA!

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

最佳答案

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

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

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

注意事项:

  • 如果将 ServiceA 注入(inject)到 ServiceBServiceC 中,则 B 和 C 将获得相同的 A 实例。
  • 正如 Seaal 在评论中提到的,以这种方式组织代码可能不符合最佳实践。

关于angular - 无法将服务注入(inject)另一个服务(单例)Angular2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42278283/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com