我理解维护“大型”中央存储的本质,其中包含相应的操作(在各种服务中),reducer和包含整个应用程序状态的订阅者.我也看到了使用这些纯函数减速器进行分层单元测试的好处.我的问题是,这是如何与“关注点分离”和“单一责任”的经典概念相结合,其中通过其专用服务(依赖注入)为这些组件维护状态,同时提供了相似的解耦?
为什么使用大型中央存储而不是单一服务来维持“包含”状态,这些服务会对订户进行更改并保持关注点分离(例如:客户数据与库存数据分开).虽然在SO和网络的其他部分都有这样的暗示,但我没有看到直接解决这个问题的参考文献.比较这两个概念(中央商店状态与依赖注入服务/单身状态)和/或做出的参考的想法非常受欢迎.
使用AngularJs(v1.x)我真的不知道什么是以反应方式工作的最佳模式,并确保每个组件都可以在服务中的某个地方订阅数据,如果另一个组件称为服务来更新某些数据,其他组件会更新.
那时候,我尝试了多种解决方案,最后将RxJ添加到我的项目中.这可能是矫枉过正,因为我不知道RxJs超级强大,我基本上没有使用任何运算符,我只是订阅.
6~8个月前,我发现Redux并发现这种方法非常有趣.我决定深入研究集中存储的概念,包括纯函数和不可变数据.这是我做过的网络开发人员的最佳选择之一.您可以在任何框架之外使用Redux.因此,即使我必须使用JQuery做一个示例并维护大量数据,我也使用Redux.
我真正喜欢Redux的一件事是规范化我的数据并将它们操作为数据库,例如缩减器操作表.带有选择器的“Computed view”也是一种强大的方式,可以根据需要从原始“表格”中编写数据.
The question I have is how does this stack up to the classic notions of ‘separation of concerns’ and ‘single responsibility’ where state is maintained for those components via their dedicated services (dependency injected) while a semblance of decoupling is provided as well?
好吧,当您标记ngrx时,我可以想象您计划将它与Angular(v2或)一起使用,并且关注点的分离很棒.你通过Reducer拆分逻辑来操作表,但是如何制作ajax调用呢?对于那种副作用,你应该使用ngrx/effects.所以你仍然会有你的减少服务.效果将允许您对给定操作的调度作出反应.
例如,如果您使用FETCH_USER类型调度操作,则在简化器中只需将布尔值isFetchingUser切换为true(因此您可以在视图中显示微调器).然后从user.effect.ts(这是一个服务),您可以捕获FETCH_USER操作并调用您的后端.响应到达后,从效果中调度一个动作FETCH_USER_SUCCESS,并将来自ajax调用的数据传递给动作有效负载.
如果你想查看一些代码,我在Github上创建了一个名为Pizza-Sync的演示.它使用@ ngrx / store和@ ngrx / effects与规范化数据.
如果您有Chrome或Firefox Redux devtools扩展,您可以查看商店和操作.
希望它有所帮助,如果您有其他问题,请告诉我.