【问题标题】:Injecting a singleton service in angular2在 angular2 中注入单例服务
【发布时间】:2016-05-31 12:47:42
【问题描述】:

我有一个在组件和其他服务之间共享数据的服务。我用 Angular 的 DI 将它注入到组件和服务中。该服务将一些数据存储在其属性中(非静态)。我还使用 ComponentResolver 来动态创建和加载组件,然后销毁它们。问题是......如果我简单地在组件中注入这样的服务:

constructor(private myService: MyDataService) { ... }

每次注入这个服务器的一个新实例,数据就会丢失。我可以静态存储数据,但是有订阅这些数据的观察者。长话短说 - 太多东西要重构为静态变量。是否有某种方法可以告诉 Angular 的 DI 只创建该服务的一个实例并在每次注入时共享它?

【问题讨论】:

    标签: dependency-injection angular angular2-di


    【解决方案1】:

    这是因为 Angulars DI 维护一个实例每个提供者

    如果您只提供一次服务(根组件或bootstrap()),那么将只有一个实例,并且注入它的每个服务或组件都将获得相同的实例。

    更新

    是的,你必须使用

    @NgModule({
      providers: [MyService],
      ...,
    })
    export class AppModule {}
    

    @Component({ 
      selector: 'my-app', 
      providers: [MyService], 
      ...
    })
    export class AppComponent {}
    

    (或者viewProviders

    提供注射剂,但如果您想要单例,请确保您只提供一次注射剂

    如果您多次提供相同的可注入对象,那么您提供它的组件及其所有后代都会从该提供者那里获取实例,而不是从可能提供它的祖先那里获取实例。

    DI 是分层的,从当前组件向根组件和AppModule 查找提供程序。它从它以这种方式找到的第一个提供者注入实例。

    【讨论】:

    • 对了,你不是必须使用 boostrap 或者至少一个视图提供者才能在构造函数中使用 DI 吗?据我了解,所有注入的服务都是单例的,我不知道可以将其作为新实例来实现。
    • 我更新了我的答案,因为它很想发表评论。
    • @GünterZöchbauer 但有没有办法强制仅在 AppComponent 中提供 Injectable 而不是在其他组件中提供?
    • 不,没有办法做到这一点。您可以在较低级别“覆盖”,但不能从较高级别强制执行特定实例。
    猜你喜欢
    • 2017-06-24
    • 1970-01-01
    • 2017-07-05
    • 2016-05-09
    • 2019-10-22
    • 1970-01-01
    • 2016-05-12
    • 2018-08-07
    • 1970-01-01
    相关资源
    最近更新 更多