Я пытаюсь создать приложение с помощью 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). Эти сущности вроде бы очевидны: проекты, проблемы, доски.
У меня проблемы с поиском наилучшего способа хранения сущностей в моем магазине, особенно потому, что они являются общими для моих разных модулей. Например:
- Dashboard нужны сущности доски, проекта и задачи.
- Совету нужны правление, проектные и выпускающие сущности.
- Проекту нужны сущности проекта и задачи.
- Задаче нужны сущности проблемы.
Следует ли хранить эти объекты на уровне функционального модуля или, скорее, на уровне корневого хранилища?
Если я сохраню их на уровне функций, это может выглядеть так:
{
"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), но для меня здесь нормально, если ядро знает обо всех функциях (в конце концов, это ядро приложение).
Но это почему-то кажется неправильным, или, по крайней мере, для меня это не похоже на стандартный способ ngrx, но я могу ошибаться.
Спасибо за любую помощь.