Сервисы SingleTon

Мы видели пару опасений по поводу провайдеров, где не гарантировано, что вы получите один и тот же экземпляр службы через NgModules, если только вы не предоставили его в корневом NgModule. Существует способ определить ваш NgModule, чтобы он мог объявлять поставщиков только для корневого NgModule, но не обновлять их для всех других NgModules.

На самом деле, Angular маршрутизатор является хорошим примером этого. Когда вы определяете маршрут в корневом NgModule, вы используете RouterModule.forRoot(routes) , но внутри Feature NgModules вы используете RouterModule.forChild(routes) . Этот шаблон является общим для любой библиотеки многократного использования, которая нуждается в одном экземпляре службы (singleton). Мы можем сделать то же самое с любым NgModule, добавив два статических метода в наш NgModule, как вы видите здесь:

@NgModule({
  declarations: [
 ForumComponent,
 ForumsComponent,
 ThreadComponent,
 ThreadsComponent
  ],
  imports: [
 CommonModule,
 FormsModule,
  ],
  exports: [
 ForumsComponent
  ]
})
export class ForumsModule {
  static forRoot(): ModuleWithProviders {
 return {
 ngModule: ForumsModule,
 providers: [ForumsService]
 };
  }
 
  static forChild(): ModuleWithProviders {
 return {
 ngModule: ForumsModule,
 providers: []
 };
  }
}

Затем в нашем AppModule вы определяете импорт с помощью forRoot(), который вернет NgModule с поставщиками. В любом другом модуле NgModule, который импортирует ForumsModule, необходимо использовать метод forChild(), чтобы повторно не объявлять провайдер (таким образом, создавая новый экземпляр):

@NgModule({
  declarations: [
 AppComponent
  ],
  imports: [
 BrowserModule,
 ForumsModule.forRoot()
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }