【问题标题】:Angular 2 service: where to keep the dataAngular 2 服务:保存数据的位置
【发布时间】:2017-04-13 13:52:22
【问题描述】:

我已经学习 Angular 2 几个星期了。我对一件事有点困惑。请在此处比较数据的存储/共享方式:

https://github.com/Apress/pro-angular-2ed/blob/master/Angular%202.0/08%20-%20SportsStore%20-%20Orders%20and%20Checkout/SportsStore/app/model/product.repository.ts

这里:

https://github.com/gothinkster/angular2-realworld-example-app/blob/master/src/app/shared/services/comments.service.ts

第一个链接显示了在 Adam Freeman 的名为“Pro Angular”的书中是如何完成的。我们可以看到有一个名为 ProductRepository 的服务,它就是存储所有产品的地方。该服务有一个构造函数,它从另一个名为 StaticDataSource 的服务初始化其数据(后来在本书中将其更改为从其余 api 获取数据)。 总结一下:我们有一个组件,它被注入了一个名为 ProductRepository 的服务。然后它使用该服务中的 getProducts() 方法来接收所有产品(实际上这些产品只是存储在该服务的一个数组中)。

现在让我们看看第二个链接:

在这里,我们有一个 CommentsService。这次数据不存储在此服务中。我们只有一个名为 getComments() 的方法,它依次从 api 服务执行另一个方法。 总结一下:我们有一个组件(ArticleComponent),它被注入了 CommentsService。然后它在该服务上调用 getComments(),实际上每次调用它都会向服务器发送一个 http.get 请求。


现在我的问题是关于这些方法之间的区别和后果。据我了解,在第一种情况下,所有数据仅从服务器获取一次(当应用程序加载时),然后将其全部存储在名为 SomethingRepository(ProductRepository 等)的服务中。 然而,在第二个链接中,每次我们使用服务(在任何组件中)时,我们都会直接从服务器接收数据。

关于它的最佳实践是什么?我只是担心如果我们使用书中介绍的方法,那么我们将不会总是获得“最新”的可能数据,因为如果另一个客户端同时更改了某些内容,那么我们仍然会处理我们下载时下载的数据。应用程序正在加载。另一方面,第二种方法可能会影响我们在组件之间共享数据的可能性。

我对此感到非常困惑,我不确定我是否真的应该将整个模型保留在我的应用程序中并拥有某种存储库,或者第二种方法可能更好。感谢您的帮助。

【问题讨论】:

    标签: web-services angular angular2-services


    【解决方案1】:

    您在该网站上花费的时间不太可能改变一系列产品。在这种情况下,这使得实际缓存获得的数据更加相关。

    例如在活动留言板中的 cmets 集合可以在单个页面访问期间更改多次。这可能是他们选择在获取集合时始终从服务调用的原因。即使在我看来,这不是正确的方法。最好使用 websocket 连接,并从服务器更新集合,而不是每次都获取集合,很有可能什么都没有改变。

    太棒了,总而言之,这取决于具体情况、集合到集合,以及您想使用哪种缓存。但我的建议是只调用一次服务器,如果它是像产品数组这样的静态数据。而当它是动态数据时,你应该使用 websockets 来维护集合

    【讨论】:

      【解决方案2】:

      不幸的是,正如大多数软件开发所采用的那样,哪种方法更好的答案是:“这取决于”。

      正如您已经明确指出的那样,在客户端存储数据的方法的风险在于,如果另一个用户更改了某些内容,您将面临本地缓存过时数据的风险。这是否重要取决于应用程序和缓存的数据类型以及数据更改的频率等。但是,从不必每次都去服务器获取列表的角度来看,您确实可以获得更好的性能.以这种方式缓存某些类型的数据要安全得多(例如,美国各州的列表,甚至是不太大且不会随时更改的产品目录) - 对于其他应用程序,您无法承受过时的数据。

      因此,我的结论是使用最适合手头数据的方法。很多时候,处理无效缓存所增加的复杂性不值得它带来的性能优势,但这绝不是您可以在所有情况下使用的笼统陈述。了解不同的方法以及好处和权衡,以便您知道何时应用哪种技术。

      PS。这个问题很可能会因为基于意见而被关闭。它可能更适合:http://softwareengineering.stackexchange.com

      【讨论】:

        猜你喜欢
        • 2017-05-14
        • 1970-01-01
        • 1970-01-01
        • 2017-03-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多