【问题标题】:Override a service for another service in angular (hierarchical injector)以角度(分层注入器)覆盖另一个服务的服务
【发布时间】:2023-03-16 22:20:01
【问题描述】:

我在 app.module.ts 的 providers 数组中放置了一个服务 (service1)。假设我还有 2 个服务,service2 和 service3,这两个都需要将 service1 注入其中。 Service2 可以在应用程序范围内提供 service1 的实例(通过应用程序模块的提供程序数组),但 service3 需要一个新实例。 如果是组件,我们可以简单地将 service1 添加到我们想要一个新实例的组件的 providers 数组中,在服务的情况下如何实现呢?

【问题讨论】:

  • 对不起,我不明白你的意思。请提供您拥有的代码。服务总是意味着只存在一次。这是一个单身人士。通过注入服务,您可以在所有注入器之间共享它。但您不会创建它的新实例。

标签: angular dependency-injection


【解决方案1】:

好吧,首先我会审查您的逻辑,因为这个用例充其量感觉很尴尬 - 但如果没有您的进一步解释,我们无法就此提供建议。也许让两个服务派生自同一个抽象类会更好?

如果您确实重新考虑了您的设计并且这是您所需要的 - 这是可行的,但会带来一些影响。

在您的模块(或提供 Service1 的任何提供程序)中,您可以为同一类有两个提供程序,例如

providers: [
  { provide: Service1 },
  { provide: 'service1new', useFactory: () => new Service1() }
],

当然,如果需要,您可以向工厂添加依赖项:

providers: [
  { provide: ServiceZ },
  { provide: Service1 },
  { provide: 'service1new', useFactory: (z: ServiceZ) => new Service1(z), deps: [ServiceZ] }
],

那么你的Service2 可以注入单例:

//Service2
constructor(private readonly service1: Service1) {
  ...
}

在您的Service3 中,您可以在每次实例化时通过指定其他提供者来注入新实例:

//Service3
constructor(@Inject('service1new') private readonly service1: Service1) {
  ...
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-22
    • 2018-03-03
    • 2019-04-19
    相关资源
    最近更新 更多