Dependency injection 单身人士服务

Dependency injection 单身人士服务,dependency-injection,singleton,angular,Dependency Injection,Singleton,Angular,我想对Angular2中的单身服务做一些解释。 我在plnkr中做了一个简单的例子: 尝试通过单击两个按钮来更改显示的组件。您将在调试器控制台ServiceAconstructorconsole.log消息中看到 为什么AService在这种情况下不是单例?因为每次我们切换显示的组件时,它都会调用AService构造函数 提前感谢当您将服务添加到组件的提供程序:列表时,您将为每个组件获得一个新实例。 只将它添加到bootstrap(AppComponent,[AService])中,整个应用程序

我想对Angular2中的单身服务做一些解释。 我在plnkr中做了一个简单的例子:

尝试通过单击两个按钮来更改显示的组件。您将在调试器控制台
ServiceA
constructor
console.log
消息中看到

为什么
AService
在这种情况下不是单例?因为每次我们切换显示的组件时,它都会调用
AService
构造函数


提前感谢

当您将服务添加到组件的
提供程序:
列表时,您将为每个组件获得一个新实例。
只将它添加到
bootstrap(AppComponent,[AService])
中,整个应用程序就会得到相同的引用

在Angulars DI中,提供的每个实例都是单例,但仅在创建实例的注入器的范围内。
Angulars DI是分层的。为每个部件创建一个子喷油器。DI从最近的喷油器开始,以确定所需类型。如果有提供程序但尚未创建实例,则将创建一个提供程序。如果没有提供程序,DI将迭代父注入器,直到找到一个或到达根注入器。如果它到达根注入器,但仍然没有找到它抛出的提供程序


添加到
bootstrap()
的提供程序是根注入器的提供程序,因此在层次结构不进一步的情况下,当另一个注入器注册了相同类型的提供程序时,它适用于整个应用程序。

事实上,这取决于您将相应的提供程序放在何处:

  • 如果将其置于引导级别,则整个应用程序将只有一个实例

    bootstrap(AppComponent, [ MyService ]);
    
  • 如果将其放在组件级别,则每个组件实例都有一个实例

    @Component({
      (...)
      providers: [ MyService ]
    })
    export class MyComponent {
      (...)
    }
    
这是因为Angular2的层次结构。您可以做得更精细一些,因为也可以使用来自父组件的提供程序

此答案可以为您提供有关此问题的更多详细信息:


更新:新语法
platformBrowserDynamic().bootstrapModule(AppModule)
app module将在哪里提供
MyService
请将其更新为与Angular 7相关的语法?或者我可以问另一个问题,冒着被标记为重复的风险。具体来说,如何确保只调用一次
ctor()
(即singleton)?请将此更新为与Angular 7相关?具体地说,如何确保只调用一次
ctor()
(即singleton)?只在非延迟加载的模块中提供它,您应该很好,或者如果必须在延迟加载的模块中提供它,请在
forRoot
中提供它(您应该能够找到更多相关信息)确保在非延迟加载的模块中提供服务。如果您也在组件或指令上提供了它,那么您可以再次获得不同的实例,因此如果您想要一个单例,请不要这样做。使用
@Injectable({providedIn:'root'})装饰服务是否确保它是单例?因为它提供了根注入器。我没有使用Angular 7,也不知道
中提供的功能是什么。根据文档,它似乎执行类似于
forRoot
的操作。从Angular 6开始,它被添加到Angular CLI创建的服务中。谢谢你的帮助。。见: