Должны ли сущности ngrx храниться на уровне функций или на уровне приложений? - PullRequest
1 голос
/ 15 апреля 2019

Я пытаюсь создать приложение, используя 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), но для меня здесь все в порядке, если ядро ​​знает обо всех функциях (в конце концов, это ядро приложение).

Но это как-то нехорошо, или, по крайней мере, для меня это не похоже на стандартный способ сделать это, но я могу ошибаться.

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

1 Ответ

0 голосов
/ 15 апреля 2019

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...