应该将ngrx实体存储在功能级别还是应用程序级别?

时间:2019-04-15 12:35:16

标签: angular ngrx ngrx-store ngrx-entity

我正在尝试使用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),但对我而言,如果核心知道所有功能(毕竟它是核心)是可以的该应用程序。)

但是它某种程度上感觉不对,或者至少对我来说,它看起来不像标准的ngrx方式,但是我可能是错的。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

据我了解,实体构成了整个应用程序,每个模块都需要这些实体。对于这种情况,我认为将它们添加到根目录是很有意义的。

我在Sharing data between modules is peanuts.

中写了一些有关该主题的文章