Должны ли сущности ngrx храниться на уровне функций или на уровне приложения?

Я пытаюсь создать приложение с помощью 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, но я могу ошибаться.

Спасибо за любую помощь.


person Despo    schedule 15.04.2019    source источник
comment
Привет! Я также думаю, что корневой уровень будет лучшим выбором. Ховуэр, как вы в конечном итоге решили проблему?   -  person Dmytro Mezhenskyi    schedule 12.01.2020


Ответы (1)


Из того, что я прочитал, сущности составляют все ваше приложение и необходимы в каждом модуле. В этом случае, я думаю, имеет смысл добавить их в корень.

Я написал небольшую статью на эту тему в Обмен данными между модулями - мелочь.

person timdeschryver    schedule 15.04.2019