Явная зависимость от глобальной службы в ngModule - PullRequest
0 голосов
/ 06 мая 2020

Я пытаюсь понять кое-что о модулях.

У меня есть AppModule (мой root модуль), который содержит PageModule и ServiceModule . PageModule использует службу из ServiceModule (и будущий модуль также будет, но не напрямую AppModule ). Я хочу, чтобы эта служба была одноэлементной, поэтому я использую следующий код в объявлении службы:

@Injectable({
  providedIn: 'root'
})

Но я хочу, чтобы мой PageModule явно зависел от ServiceModule , чтобы будущие разработчики знали, что PageModule имеет эту зависимость. Должен ли я импортировать событие ServiceModule в PageModule , хотя он в основном ничего не делает? Следует ли мне импортировать ServiceModule в root AppModule ? Я что-то неправильно понял?

Насколько я понимаю:

Я должен использовать providedIn: 'root' в ServiceModule (если только модуль, в котором я его использую, не является LazyLoaded) и импортировать ServiceModule непосредственно в PageModule без необходимости импортировать его в AppModule . Я прав?

Надеюсь вопрос не лишний. Я пытался ответить на другие вопросы и прочитать статьи о внедрении зависимостей и модулях Angular, но я не понимаю, является ли то, что я хочу, плохой практикой или нет.

1 Ответ

2 голосов
/ 06 мая 2020

можно определить для метода Root в ServiceModule и предоставить другое описание модуля для AppModule. Таким образом, AppModule может импортировать ваш сервисный модуль и инициализировать его, тогда PageModule и любые другие модули могут явно импортировать ServiceModule. хороший обзор ссылка .

// ServiceModule.ts

@NgModule({
  imports: [
    CommonModule,
  ],
  declarations: []
})
export class ServiceModule {
  static forRoot(): ModuleWithProviders {
    return {
      ngModule: ServiceModule,
      providers: [
        SingletoneService
      ]
    };
   }

   constructor(
     private singletoneService: SingletoneService,
   ) {
    this.singletoneService.init();
   }
}

// AppModule.ts

@NgModule({
  declarations: [
    AppComponent,
    SvgDefinitionsComponent
  ],
  imports: [
    ...
    ServiceModule.forRoot(),

  ],
  providers: [
  ],
  bootstrap: [AppComponent]
})
export class AppModule { }
...