gpt4 book ai didi

angular - Angular 7 中注入(inject)服务与单例服务的内存和性能比较

转载 作者:行者123 更新时间:2023-12-04 15:49:57 26 4
gpt4 key购买 nike

我想了解 Angular 7 中单例与注入(inject)服务的内存和性能影响。

例如,假设我在页面上有一个组件列表,并且每个组件都注入(inject)了相同的服务(即它列在组件提供程序中)。这是否意味着如果我有例如50 个组件,我将需要 50 倍于注入(inject)服务的内存需求,而不是所有人都通用的单例服务?

是否还有其他性能影响需要考虑?

最佳答案

I would like to understand the memory and performance implications of singleton vs injected services in Angular 7.



Angular 中的依赖是通过提供者处理的。有许多类型的提供者,例如常量值、工厂、类等。等等。

服务是指已实例化的可注入(inject)类。它何时被实例化取决于它何时被提供。声明提供者最常见的地方是在模块的声明中。所以我们把它称为提供者的范围。

默认情况下,提供程序是单值解析器,但可以将提供程序配置为多个。为简单起见,我们假设提供者是范围内的单例。

作用域可以有父级和子级。当一个提供者被声明时,它是在当前范围内提供的。模块往往在注入(inject)器树上非常高,根在顶部。

创建组件时,我们可以将其视为一个新的作用域。 bootstrap 组件位于组件树的顶部,但考虑到您可以使用工厂来创建新组件,这意味着您不应假设所有内容都属于同一棵树。

是的,它可能会变得复杂。

For example, let's say that I have a list of components on a page and each one is injected the same service (i.e. it's listed in the component providers).



假设此服务名为 FooBarService .根据您配置依赖项注入(inject)器的方式,我可以解释可能发生的许多不同的事情。
  • 注入(inject)器会抛出一个错误 FooBarService是一个未知的依赖。
  • 根模块已提供 FooBarService并且此组件和所有其他组件将收到相同的实例。
  • 延迟加载模块提供了 FooBarService这个组件会收到一个实例,但是lazy模块之外的组件会抛出一个未知依赖的错误。
  • 父组件已提供 FooBarService并且它的所有子组件都将收到一个实例。
  • 每个组件都提供了FooBarService并且每个组件接收一个新实例。

  • 由于您已声明“它已在组件提供程序中列出”,因此选项 #5 将适用。

    请参阅此引用: https://angular.io/guide/providers#providing-services-in-modules-vs-components

    Does this mean that if I have e.g. 50 components, I will need 50 times the memory requirements for the injected service, vs a singleton service that is common to all?



    是的,如果您在组件的范围内而不是模块的范围内声明了提供者。每个声明它的组件将有一个实例,但该实例是为该组件的子组件共享的。

    Are there any other performance implications to consider?



    是的,如果注入(inject)器必须创建新实例,它需要更多的内存和时间来创建 50 个组件。它会对您的软件产生负面影响吗?与任何决定一样,这取决于您为什么要这样做。如果要解决依赖性问题,那么它可能是唯一的方法。如果您可以改用共享单例服务,那么我想知道您为什么不这样做。

    关于angular - Angular 7 中注入(inject)服务与单例服务的内存和性能比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54239099/

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