Я пытаюсь создать приложение, используя ngrx. В качестве примера, скажем, что это приложение для управления проектами (например, Jira). Требования говорят, что это должно быть построено, используя ngrx.
В этом приложении я определил следующие функции:
- Доска (список досок канбан)
- Управление проектами
- Управление проблемами
- Панель инструментов (обзор всех функций / проектов / плат / настроек / других)
Итак, моя структура папок может выглядеть так:
- board (feature module)
- core
- dashboard (feature module)
- issue (feature module)
- project (feature module)
- shared
- app.component.ts
- app-routing.module.ts
- app.module.ts
У меня также есть набор сущностей (хранится с использованием модуля сущностей ngrx). Эти сущности довольно очевидны: проекты, проблемы, советы.
У меня возникли проблемы с поиском лучшего способа хранения сущностей в моем магазине, особенно потому, что они совместно используются разными моими модулями. Например:
- Приборной панели нужны объекты правлений, проектов и выпусков.
- Правлению нужны доски, проекты и организации.
- Проекту нужны объекты проекта и выпуска.
- Выпуск нуждается в объектах выпуска.
Должны ли эти объекты храниться на уровне функционального модуля или, скорее, на уровне корневого хранилища?
Если я сохраню их на уровне функций, это может выглядеть так:
{
"board": {
"boardEntities": {
"0" {
"id": 0,
"projectId": 1,
"name": "My super board",
"configuration": { ... }
}
}
},
"projects": {
"projectEntities": {
"1": {
"id": 1,
"name": "my project",
"issueIds": [0, 1, 2, 3, 4], // all issues of this project
"owner": "owner"
}
}
},
"issues": {
issueEntities: {
"0": {
// ...
}
}
}
}
Но тогда часть загрузки немного неловкая. Например, когда моя панель инструментов пытается отобразить проблемы, они могут быть еще не в моем состоянии. Я отправлю действие, подобное new fromDashboard.loadIssues()
, и это действие будет поймано в эффекте, который загрузит проблемы, но этот эффект присутствует в функции проблемы. Поскольку проблемы могут быть загружены практически со всех функций, мой эффект loadIssues (расположенный в папке функций проблем) должен будет прослушивать fromDashboard.loadIssues, fromProject.loadIssues и fromBoard.loadIssues. Это выглядит странно, потому что я не чувствую, что Особенность проблемы должна знать о приборной панели / проекте / правлении.
Другим способом было бы сохранить его на корневом уровне, например:
{
"entities": {
"projectEntities": {
// ...
},
"boardEntities": {
// ...
},
"issueEntities": {
// ...
}
},
"board": {
// ...
},
"projects": {
// ...
},
"issues": {
// ...
}
}
Где действия сущностей и редукторы будут находиться в модуле core
. Редукторам и эффектам все равно придется прослушивать несколько действий (например, fromDashboard.loadIssues, fromProject.loadIssues и fromBoard.loadIssues), но для меня здесь все в порядке, если ядро знает обо всех функциях (в конце концов, это ядро приложение).
Но это как-то нехорошо, или, по крайней мере, для меня это не похоже на стандартный способ сделать это, но я могу ошибаться.
Спасибо за любую помощь.