单身人士服务

时间:2016-02-11 12:56:05

标签: dependency-injection singleton angular

我想在 Angular2 中对单身人士服务有一些解释。 我在plnkr中做了一个简单的例子:http://plnkr.co/edit/09XVxN?p=preview

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

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

先谢谢

2 个答案:

答案 0 :(得分:1)

将服务添加到组件的providers:列表时,每个组件都会获得一个新实例 仅将其添加到bootstrap(AppComponent, [AService]),整个应用程序将获得相同的参考。

在Angulars DI中,每个提供的实例都是单例,但仅在创建实例的注入器范围内 Angulars DI是分层的。对于每个组件,创建子注入器。 DI从最近的注射器开始,以解决所需的类型。如果有提供者但还没有实例,则会创建一个。如果没有提供者DI迭代到父注射器,直到它找到一个或直到它到达根注射器。如果它到达根注入器并仍然没有找到它抛出的提供者。

添加到bootstrap()的提供程序是根注入器的提供程序,因此适用于整个应用程序,而不是在层次结构的下层,另一个注入器具有注册的相同类型的提供程序。

答案 1 :(得分:1)

实际上,这取决于您放置相应提供商的位置:

  • 如果你把它放在bootstrap级别,那么整个应用程序就会有一个实例

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

    @Component({
      (...)
      providers: [ MyService ]
    })
    export class MyComponent {
      (...)
    }
    

这是因为Angular2的分层注入器。你可以做得更精细,因为它也可以使用来自父组件的提供者......

这个答案可以为您提供更多详细信息: