首页 > 解决方案 > 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 的实体模块存储)。这些实体有点明显:项目、问题、董事会。

我遇到的麻烦是找到将实体存储在我的商店中的最佳方式,特别是因为它们在我的不同模块之间共享。例如:

这些实体应该存储在功能模块级别还是根存储级别?

如果我将它们存储在功能级别,它可能如下所示:

{
  "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方式,但我可能错了。

谢谢你的帮助。

标签: angularngrxngrx-storengrx-entity

解决方案


根据我的阅读,实体构成了您的整个应用程序,并且在每个模块中都需要。对于这种情况,我认为将它们添加到根目录是非常有意义的。

我在模块之间共享数据是花生中写了一篇关于这个主题的小文章。


推荐阅读