【问题标题】:Are Angular2's services supposed to be stateless?Angular2 的服务应该是无状态的吗?
【发布时间】:2017-02-21 21:32:22
【问题描述】:

我来自 Java 世界,那里的服务通常是无状态的。 Angular2 中的服务也应该是无状态的吗?或者我们可以简单地存储状态,因为我们不必像 Java 示例那样关心并发线程访问?

在 AuthService 类中的 https://angular.io/docs/ts/latest/guide/router.html#!#teach-authguard-to-authenticate 处存储状态。

只是为了简化示例还是一种常见做法?我知道服务是实例化的,并且在声明它们的范围内存在,但这意味着我必须关心提供服务的位置才能知道状态持续多长时间。

【问题讨论】:

  • Angular2 中的常见做法是将服务作为单例注入,这意味着它可以而且应该是有状态的。
  • 不明白为什么单例应该自动被认为是有状态的。在给定的 Java 和 Spring 示例中,Spring 的服务也是单例的,但必须保持无状态。

标签: angular angular2-services


【解决方案1】:

让组件无状态并将状态存储在服务中通常是个好主意,尤其是在路由器添加的组件中,这样导航离开并稍后返回路由不会丢失数据。

因此对于您的问题: 服务不应该是无状态的。它们通常是,但这不是必需的。

您可以改用NGRX Store 来存储状态,但这也是一项服务。

我必须关心服务在哪里提供才能知道该状态持续多长时间。

是的,这就是你必须做的。这通常很容易。如果您希望服务及其状态在整个应用程序生命周期内可用,则在 @NgModule() 中提供它(需要对延迟加载的模块进行一些特殊处理),否则您在组件中提供它,服务的生命周期将以组件实例被销毁结束。

【讨论】:

  • 我看到一篇文章说的完全相反——服务应该是无状态的(发布事件)。我可以看到这两种观点,但我认为服务方法应该是无状态方法。
  • 一个链接会很有趣看到这些论点。 “服务方式”是什么意思?如前所述,您可以在注入的服务类之外保持状态,但也可以将 rx 存储注入到服务中。我发现很难划清什么仍然被视为服务,什么只是模型。
  • Here is the article。我认为服务是执行任务的东西,而不是通常与用户直接交互的组件。
  • 文章中的论据是好的。如果正确使用可观察对象,并发访问就不是问题。在 Angular 中,将所有注入的东西都称为服务是很常见的。对于您和本文而言,服务似乎是提供某些功能的东西,例如获取数据。我可以同意这个观点。在我的回答中,我假设“Angular 服务”,也许这是含糊的。
  • 如果组件像一个容器,可以嵌套自己怎么办?服务会保留父母或孩子的状态吗?
猜你喜欢
  • 2012-01-04
  • 2021-01-02
  • 2012-12-23
  • 1970-01-01
  • 2011-08-28
  • 2011-09-04
  • 2010-10-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多