【问题标题】:Inject non-singleton service into non-singleton service in Angular将非单例服务注入Angular中的非单例服务
【发布时间】:2018-08-07 11:29:37
【问题描述】:

如果我想将非单例服务注入 Angular 中的另一个非单例服务,该怎么办?

假设我有一个ComponentA,它使用这样的ServiceA

@component({
  selector: "componentA",
  providers: [ServiceA]
})
export class ComponentA {
  constructor(private serviceA: ServiceA) {}
}

现在,ServiceA 也依赖于ServiceB,所以我需要注入它

@Injectable()
export class ServiceA {
   constructor(private serviceB: ServiceB) {}
}

我将如何/在哪里声明我的ServiceB?在模块中?在那种情况下会是单例吗?

如果我将它添加到 ComponentA 中的提供程序,它可以正常工作,但是我需要在 ComponentA 中知道 ServiceA 依赖于 ServiceB,这对我来说似乎不太好。

谢谢!

【问题讨论】:

  • 这似乎是一个非常有效的问题......所以很高兴知道人们为什么投票否决它。 (我非常赞成禁止投反对票!)
  • 好吧,你为什么不想一开始就有单例服务呢?
  • @BunyaminCoskuner 也许是一个有状态的服务?

标签: angular dependency-injection


【解决方案1】:

服务在提供它们的范围内始终是单例,因此如果您在模块中提供 B,那么对于使用该模块的每个人来说,它都是同一个单例。我认为您需要直接在服务 A 中使用 Injector 才能按照自己的方式进行操作。

https://angular.io/api/core/Injectable

【讨论】:

    【解决方案2】:

    粗略地说,除非您在@Injectable() 中有providedIn 选项,否则Angular 不会将服务视为单例。有关其工作原理的详细信息,您可以参考文档:https://angular.io/api/core/Injectable#providedin

    您将遇到的问题是,如果您只是这样做:

    @Injectable()
    export class ServiceB {
       constructor() {}
    }
    

    尝试将 ServiceB 注入 ServiceA 时会抛出错误,因为它没有提供程序。现在通常,要解决此问题,您需要将{ providedIn: 'root' } 添加到ServiceB 的@Injectable()。这会将服务 B 创建为应用程序范围的单例服务。

    当您使用@Component( { providers: [] } ) 时,将创建一个实例仅为该组件。但你不能为服务做到这一点。

    您可能会问,为什么@Injectable() 没有像@Component() 那样的providers 选项? Angular 团队出于多种原因不想这样做,请参阅此 github 问题以获取更多信息 https://github.com/angular/angular/issues/5622

    TLDR:

    为了给你提供解决这个问题的方法,你可以保持简单,如果你想控制你使用的实例,你可以完全避免使用 Angular 的 DI,你可以自己做:

    @Injectable()
    export class ServiceA {
       constructor(private serviceB: ServiceB = new ServiceB()) {}
    }
    

    编辑:正如@minigeek 所建议的,使用providedIn 您可以使用any 让每个惰性模块都获得它自己的服务实例。

    【讨论】:

    • 不再使用 Angular 11。providedin : 每个模块创建的任何实例
    • 是的,但这仍然是每个(惰性)模块的一项服务。这可能会回答这个问题,因此为什么包含到 providedIn 选项的链接。
    • 知道了!.. 是的,你可以在答案中添加它
    猜你喜欢
    • 2013-05-13
    • 2019-10-22
    • 1970-01-01
    • 1970-01-01
    • 2017-07-05
    • 2019-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多