Angular 6服务:providedIn:'root'与CoreModule

Man*_*ain 25 angular angular6

使用Angular 6,下面是创建单例服务的首选方法:

import { Injectable } from '@angular/core';

@Injectable({
  providedIn: 'root',
})
export class UserService {
}
Run Code Online (Sandbox Code Playgroud)

来自Angular doc:当您在根级别提供服务时,Angular会创建一个HeroService的单个共享实例,并注入任何要求它的类.在@Injectable元数据中注册提供程序还允许Angular通过删除服务来优化应用程序(如果事实证明它不会被使用).

也,

providers: [
    // no need to place any providers due to the `providedIn` flag...
  ]
Run Code Online (Sandbox Code Playgroud)

那么,这是否意味着我们不再需要CoreModule?我们可以将服务和其他常用模块直接导入AppModule.

Ott*_*ley 6

好吧,我将其视为创建 CoreModule 的替代方案,文档明确指出:

在 Angular 中有两种方法可以使服务成为单例: 为 @Injectable() providedIn 属性的值声明根

将服务包含在 AppModule 或仅由 AppModule 导入的模块中

我在这里找到了单例服务文档

如果你的应用程序有一个 CoreModule 的纯服务,你可以简单地摆脱它(如果你认为当然没有必要),虽然我不推荐它,但对我来说,我认为拥有一个 CoreModule 更容易维护,因为我可以很容易地在项目中找到它并告诉我哪些服务是应用程序的基础,我们只需要它们中的一个实例,而不必在 IDE 中打开搜索对话框并查找所有已providedIn: 'root'设置的服务。


ahm*_*aad 5

我仍然保留 CoreModule 作为一次性组件和 Http 拦截器,该 providedIn属性现在是注册单例服务的推荐方法,为了清楚起见,我将把所有单例服务放在 core/services 目录下


m4d*_*ign 1

如果 CoreModule 仅包含服务,情况就是如此。然而,它确实包括其他东西,例如一次性组件。

来自角度文档:

请在 CoreModule 中收集应用程序范围内的一次性组件。当应用程序启动时将其导入一次(在 AppModule 中),并且永远不要将其导入到其他任何地方。(例如 NavComponent 和 SpinnerComponent)。

  • 关于将组件放置在核心模块中仍然存在争议。[文档还指出](https://angular.io/guide/ngmodule-faq#what-kinds-of-modules-should-i-have-and-how-should-i-use-them):“考虑使 CoreModule 成为一个没有声明的纯服务模块。” (6认同)