Все, что помещено в массив providers
модуля, станет единичным экземпляром, доступным во всем приложении.Некоторые модули должны использоваться как приложениями (которые должны создавать синглтоны), так и внутренними модулями, не относящимися к приложениям (которые не должны создавать синглтоны, но все же могут зависеть от объявлений / экспортов, которые не являются синглетонами).Идея forRoot
заключается в том, что он создает синглтоны, поэтому вы хотите использовать его только один раз ... в своем "корневом" модуле.
Вот определение из текущего источника:
static forRoot(routes: Routes, config?: ExtraOptions): ModuleWithProviders<RouterModule> {
return {
ngModule: RouterModule,
providers: [
ROUTER_PROVIDERS,
provideRoutes(routes),
{
provide: ROUTER_FORROOT_GUARD,
useFactory: provideForRootGuard,
deps: [[Router, new Optional(), new SkipSelf()]]
},
{provide: ROUTER_CONFIGURATION, useValue: config ? config : {}},
{
provide: LocationStrategy,
useFactory: provideLocationStrategy,
deps: [
PlatformLocation, [new Inject(APP_BASE_HREF), new Optional()], ROUTER_CONFIGURATION
]
},
{
provide: RouterScroller,
useFactory: createRouterScroller,
deps: [Router, ViewportScroller, ROUTER_CONFIGURATION]
},
{
provide: PreloadingStrategy,
useExisting: config && config.preloadingStrategy ? config.preloadingStrategy :
NoPreloading
},
{provide: NgProbeToken, multi: true, useFactory: routerNgProbeToken},
provideRouterInitializer(),
],
};
}
Что нужно сделать, это взять RouterModule
и расширить его, добавив кучу дополнительных предоставляемых услуг.Эти дополнительные сервисы должны создаваться только один раз в приложении, потому что они имеют состояние, которое должно быть общим для всего приложения.