Я столкнулся с проблемой с моим кодом, использующим ngRx.Поскольку проект огромен и это скорее вопрос дизайна, извините, я не привожу минимальный и воспроизводимый пример.
У меня есть проект с такой структурой:
AppModule
PrimaryOutletModule
SidenavComponent
HeaderComponent
ExploitationComponentsModule [lazy loaded in AppRouting]
MapComponent
MaService
ServicesModule [imported in AppModule]
HttpServicesModule
ExploitationServicesModule
ExploitationService
В этой структуре я добавляю этот модуль к AppModule
:
@NgModule({
imports: [
StoreModule.forRoot(exploitationReducers),
]
})
export class ExploitationStoreModule { }
Без каких-либо проблем, весь мой код работает хорошо.Но когда я добавляю его к PrimaryOutletModule
, ExploitationComponentsModule
и ExploitationServicesModule
и удаляю его из AppModule
, он перестает работать.
Я хочу удалить его из AppModule, чтобы избежать создания глобально доступных хранилищ (я хочу дать им значимые области видимости)
Моя первая мысль - записать события select
и dispatch
и когда я это делаю, я вижу, что события не улавливаются.После добавления этого в модуль:
constructor() { console.log('Store module instance created'); }
Я вижу два экземпляра.После этого вопроса SOF я понимаю, что должен использовать forRoot
метод StoreModule
.
Но так как мой ExploitationStoreModule
уже использует его, я ищу решение и наткнулся на этот вопрос SOF , говоря, что лениво загруженные модули создают новые экземпляры модулей.
Если я правильно понял, я использую forRoot
дважды, что приводит к двум экземплярам моего ExploitationStoreModule
.
Поскольку я хочу предоставить правильные области действия для своих модулей и не разрешать им обращаться к магазинам, с которыми у них нет бизнеса (например, ExploitationModule
не должен иметь доступа к SupervisionStore
), я бынравится, чтобы меня не принуждали импортировать все мои модули Store в мой AppModule
.
Возникает вопрос: как следует объявлять хранилища в приложении, чтобы они не были глобальными и предоставлялись только в соответствующих модулях?