角度服务:单例,非单例,延迟加载和ngrx。如何提供?

时间:2018-06-14 03:03:01

标签: angular ngrx

我试图了解在Angular应用程序中声明服务的不同方式以及何时使用它们,以及如何通过ngrx处理存储切片。

在Angular 6中,推荐的方法是使用provideIn:' root'单身人士服务:https://angular.io/guide/singleton-services 通过这种方式,它们将是树可动的,并且当应用程序引导时将只创建一个实例。

我不明白的是:

  • 根本没有使用非单身人士服务吗? 我知道您可以将服务添加到组件的提供者列表中,并且每当创建组件时都将创建新的服务实例,并在组件被销毁时销毁。我看到的优点是内存释放,但另一方面,Angular团队根本没有提到这一点,它建议在根模块中提供服务。

  • 在根注入器中,是否存在在功能模块中提供服务更有意义的情况? 据我了解,如果不是' root'如果选择另一个模块,则在加载此模块时将创建该服务。这似乎对延迟加载的模块有意义,以避免必须加载您在引导程序上不需要的服务。如果我尝试使用使用ngrx的模块执行此操作,则会收到循环依赖关系的警告,因为Admin效果需要导入Admin服务,而Admin服务定义为provideIn:' AdmimModule&#39 ;。我究竟做错了什么? 我也得到循环依赖,如下所示: AdminRoutingModule - > AdminComponent - > AdminService - > AdminModule - > AdminRoutingModule

另外,静态方法有空间吗?在我看来,单例服务的所有方法都可以声明为静态。我读过静态方法更难测试,这是不使用它们的唯一原因吗?

2 个答案:

答案 0 :(得分:0)

看看我正在处理的库,它提供了商店的基于推送的数据流优势,但是如果没有任何与ngrx相关的大量样板文件,那么设置和推理就会变得非常简单。

https://github.com/adriandavidbrand/ngx-rxcache

它基于RxJs行为主题,为您提供基于推送的数据流的所有好处,并且仍然允许您使用哑智能组件架构。

我在这里重做了官方的ngrx演示应用程序

https://stackblitz.com/edit/github-tsrf1f

如果您将其与

上的官方ngrx演示应用进行比较

https://stackblitz.com/github/ngrx/platform/tree/61cbfe537f9df8cef3dd4a6ee0b8f483e49653f4

您将看到设置和使用它的简单程度。

答案 1 :(得分:0)

在组件级别提供服务的原因是,该服务的唯一实例可用于提供该服务的组件下的层次结构中的所有组件。试想一下,如果页面上有两个组件需要跨组件层次结构共享数据。如果他们要使用应用程序范围内的单例服务,则这两个组件将相互干扰。在组件级别提供服务意味着他们可以使用自己的服务实例,而不会影响层次结构之外的任何其他组件。