具有多个相关实体的 ngrx `forFeature`

ngrx `forFeature` with multiple related entities

我们正在尝试为我们的应用采用 forFeature 模式。然而,多个功能是相关的。

我们有一个同时显示多个实体关系的应用程序。

例如考虑我们有以下实体

哪里是模特

ìnterface Product {
  countryId: string;
  currencyId: string;
  supplierId: string;
}

interface Supplier {
  name: string;
  harbourId: string;
  countryId: string;
}

然后在 product-detail 页面中,我们显示产品的 currencycountry 以及 supplier 的名称和 country

考虑一下我们还有一个 supplier-details page,我们在其中显示上述供应商信息及其最后 10 个产品。

当前处理所有这些的方式是使用这样的存储结构:

 - entities
 ---- product
 ---- supplier
 ---- currency
 ---- country
 ---- harbour
 - ui
 ---- other stuff ui related

这是通过根目录下的单个商店完成的。

然而app文件夹结构是这样划分的:

 - features
 --- product
 ------ product.actions / product.reducer / product.effects / product.selector
 --- supplier
 ------ supplier.actions / supplier.reducer / supplier.effects / supplier.selector
 --- store 
 ------ reducers ( here we are importing all reducers to combine those)
 ------ harbour.actions / harbour.reducer / harbour.effects / harbour.selector
 ------ country.actions / country.reducer / country.effects / country.selector
 ------ currency.actions / currency.reducer / currency.effects / currency.selector

如您所见,文件夹结构有点混乱,因为我还不确定将 harbourcountrycurrency 放在哪里,因为其中一些很友好一般实体。

不过,我正在查看 ngrxforFeature 位,我想知道如果我们碰巧使用它,以及是否可以一起使用这些功能,所有这些将如何组合在一起。

forFeature 用于需要以惰性方式注册的减速器,与 forRoot.

相比,forChild

我认为对此的经验法则是:

如果只有特定的 lazy-loaded 模块需要减速器,那么它应该是该模块的 forFeature,这样它只会在加载该模块后被注册。

一旦 reducer 需要跨模块共享(延迟加载或不延迟加载),那么它需要在您的应用程序中处于更高的抽象级别,并且应该转到 forRoot 版本(全球可访问 "at startup")

总而言之:

  • 我觉得你的实体结构没问题。
  • 我会把 harbour/country/currency 与你对文件结构所做的类似。
  • 仅在 forFeature 中仅使用该功能模块需要的状态片,并且该模块是 lazy loaded