Angular,Central(Redux)'Store'与Singleton Service,又名“关注点分离的结果”?

时间:2017-03-23 20:28:09

标签: angular ngrx

当我们为新的Angular项目做准备时,我们正在评估在我们的系统中采用的各种架构概念 - 尤其是状态管理。在过去,主动通知客户端组件存在自然的复杂性。今天,进入反应式编程和中央商店。

我理解维护“大型”中央商店的性质,其中包含相应的操作(在各种服务中),缩减器和包含整个应用程序状态的订阅者。我也看到了使用这些纯函数减速器进行分层单元测试的好处。我的问题是,这是如何与“关注点分离”和“单一责任”的经典概念相结合,其中通过其专用服务(依赖注入)为那些组件维护状态,同时具有外观还提供了解耦?

为什么使用大型中央商店而不是单一服务来维持“包含”状态,这些服务会对订阅者进行更改并保持关注点分离(例如:客户数据与库存数据分开)。虽然在SO和网络的其他部分都有这样的暗示,但我没有看到直接解决这个问题的参考文献。比较这两个概念(中央商店状态与依赖注入服务/单身状态)和/或做出的参考的想法非常受欢迎。

1 个答案:

答案 0 :(得分:3)

在你的Angular旅程中,问自己关于项目架构的问题肯定是一个良好的开端。

使用AngularJs(v1.x)我真的不知道什么是以反应方式工作的最佳模式,并确保每个组件都可以在服务中的某个地方订阅数据,如果另一个组件称为要更新的服务一些数据,其他组件将更新。 那时候,我尝试了多种解决方案,最后将RxJs添加到我的项目中。由于我不知道 RxJs超能力而且我基本上没有使用任何运算符,我只是订阅了,这可能有点过分了。

6~8个月前,我发现Redux并发现这种方法非常有趣。我决定深入研究集中存储的概念,包括纯函数和不可变数据。 这是我做过网络开发的最佳选择之一。您可以在任何框架之外使用Redux。因此,即使我必须使用JQuery创建示例并保留大量数据,我也会使用Redux

我真正喜欢Redux的一件事是规范化我的数据并操纵它们就像数据库,例如缩减器操作表格。使用selectors的“ Computed view ”也是根据原始“表格”组合数据的有效方式。

  

我的问题是,它如何与“关注点分离”和“单一责任”的经典概念相结合,其中通过其专用服务(依赖注入)为这些组件维护状态,同时提供相似的解耦还有吗?

好吧,当你标记ngrx时,我可以想象你计划将它与Angular(v2或+)一起使用,并且关注的分离是很好的。您可以通过Reducer拆分逻辑来操作表,但是如何进行ajax调用呢?对于这种副作用,您应该使用ngrx/effects。所以你仍然会有你的服务+减速器。 Effects将允许您对给定操作的调度作出反应。

例如,如果您使用类型action发送FETCH_USER,则在简化器中只需将布尔值isFetchingUser切换为true(这样您就可以在视图中显示微调器) )。然后从user.effect.ts(这是一项服务),您可以捕获FETCH_USER操作并调用您的后端。响应到达后,从效果中调度操作FETCH_USER_SUCCESS并将ajax调用中的数据传递到操作payload

如果你想查看一些代码,我在Github上创建了一个名为Pizza-Sync的演示。它使用@ngrx/store@ngrx/effects来标准化数据。

如果您拥有Chrome或Firefox Redux devtools扩展程序,则可以查看商店和操作。

希望它有所帮助,如果您有其他问题,请告诉我。