Angular 2服务:保存数据的位置

时间:2017-04-13 13:52:22

标签: web-services angular angular2-services

我已经学习了角度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等)的服务中。 然而,在第二个链接中,每次我们使用服务(在任何组件中),我们都直接从服务器接收数据。

关于它的最佳做法是什么?我只是担心,如果我们使用书中提出的方法,那么我们就不会总是得到最新鲜的'可能的数据,因为如果另一个客户在此期间改变了某些东西,那么我们仍然处理我们的应用程序加载时下载的数据。另一方面,第二种方法可能会影响我们在组件之间共享数据的可能性。

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

2 个答案:

答案 0 :(得分:3)

在您在该网站上花费的时间内,产品集合不太可能发生变化。在这种情况下,实际缓存获取的数据更为重要。

评论集合(例如在活动留言板中)可在单页访问期间多次更改。这可能是他们选择在获得集合时始终从服务中调用的原因。尽管在我看来,这不是正确的方法。更好的方法是使用websocket连接,并从服务器更新集合,而不是每次都获取集合,很可能没有任何变化。

Sooooo,总结一下,它取决于具体情况,集合到集合,您希望使用哪种缓存。但我的建议是只调用服务器一次,如果它是静态数据,如产品数组。当它是动态数据时,您应该使用websockets来维护集合

答案 1 :(得分:2)

不幸的是,随着大多数软件开发的进行,哪种方法更好的答案是:"它取决于"。

正如您已经清楚地确定的那样,存储数据客户端方法的风险在于,如果另一个用户更改了某些内容,则存在使用过时数据的本地缓存的风险。这是否重要取决于应用程序和缓存的数据类型以及数据更改的频率等。但是,从每次无需访问服务器的角度来看,您确实获得了更好的性能。某些类型的数据以这种方式缓存更安全(例如,美国各州的列表,甚至是产品目录,它们不是太大而且不会随着时间的推移而改变) - 对于其他应用程序,您只需无法承受陈旧数据。

因此,我的意思是使用最适合手头数据的方法。很多时候,处理无效缓存的额外复杂性并不值得它带来的性能优势,但这绝不是你可以在所有情况下使用的一揽子声明。了解不同的方法,利益和权衡,以便了解何时应用哪种技术。

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