在 angular2 中注入单例服务

Injecting a singleton service in angular2

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

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

每次注入此服务器的新实例,数据丢失。我可以静态存储数据,但随后会有观察者订阅该数据。长话短说 - 太多东西无法重构为静态变量。有什么方法可以告诉 angular 的 DI 只创建该服务的一个实例并在每次注入时共享它吗?

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

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

更新

是的,你必须使用

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

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

(或者 viewProviders

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

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

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