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

问题描述 投票:1回答:1

我正在尝试使用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效果(位于问题功能文件夹中)将必须从theDashboard.loadIssues,fromProject.loadIssues和fromBoard.loadIssues中听取。它看起来很奇怪,因为我觉得不喜欢问题功能应该知道仪表板/项目/板。

另一种方法是将其存储在根级别,例如:

{
  "entities": {
    "projectEntities": {
      // ...
    },
    "boardEntities": {
      // ...
    },
    "issueEntities": {
      // ...
    }
  },
  "board": {
    // ...
  },
  "projects": {
    // ...
  },
  "issues": {
    // ...
  }
}

实体行动和减速器将位于core模块中。减少器和效果仍然必须监听多个动作(例如fromDashboard.loadIssues,fromProject.loadIssues和fromBoard.loadIssues),但对我来说,如果核心知道所有功能(毕竟它是核心的应用程序)。

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

谢谢你的帮助。

angular ngrx ngrx-store ngrx-entity
1个回答
0
投票

从我读到的,实体构成了整个应用程序,并且在每个模块中都需要。对于这种情况,我认为在根部添加它们是完全合理的。

我在Sharing data between modules is peanuts.写了一篇关于这个主题的文章

© www.soinside.com 2019 - 2024. All rights reserved.