仍然需要角度服务模块



在角文档中,它列出了可以实现的特征模块的类型。其中之一是服务模块。

https://angular.io/guide/module-types

在Angular的早期版本中,您将创建您的服务并将其列出在服务NGMODULE的提供商数组中。然后,将通过消费应用程序导入此NGMODULE,该应用程序将在应用程序根喷油器中提供该服务。

Injectable()
export class MyService {}
NgModule({
    providers: [MyService]
})
export class MyServicesModule {}
NgModule({
    imports: [MyServicesModule]
})
export class AppModule {}

最新的角度建议是使用可注射的注释,您不再需要在提供者的定义中列出它。

Injectable({ providedIn: 'root'})
export class MyService {}

因此,创建服务模块有任何意义吗?您是否只使用上述注释创建要在根喷油器中提供的服务,然后直接导入服务类并注入accoridngly?

如果您使用的是仅在该模块内提供的特定服务的懒惰的模块,则需要一个服务模块。

您无法在该模块的组件中提供服务的同一模块中提供服务。

所以假设您有MyLazyFeatureModule

@NgModule({
  imports:      [ ],
  providers:    [ ],
  declarations: [ MyFeatureComponent ],
  exports:      [ ],
})
export class MyLazyFeatureModule { }

您有一项仅包含功能逻辑的服务,然后您无法执行以下操作:

Injectable({ providedIn: MyLazyFeatureModule})
export class MyFeatureService {}

您会得到一个周期!

要解决您需要创建特定服务模块的问题,并导入该模块到功能模块中:

@NgModule({
  imports:      [ ],
  providers:    [ ],
  declarations: [ ],
  exports:      [ ],
})
export class MyLazyFeatureServiceModule { }
Injectable({ providedIn: MyFeatureServiceModule})
export class MyFeatureService {}
@NgModule({
  imports:      [ MyLazyFeatureServiceModule ],
  providers:    [ ],
  declarations: [ MyFeatureComponent ],
  exports:      [ ],
})
export class MyLazyFeatureModule { }

请看一下这篇文章(三个可动的提供商,曼弗雷德·史蒂尔(Manfred Steyer(的方式,如何和周期,其中解释了为什么深度有一个周期的细节。

除了该用例外,如果您只有root提供的服务,则可能不需要服务模块。您可以创建一个实际上在一个地方拥有所有服务。但是,也许核心模块也会为此做。这取决于您。

单身服务是providedIn: 'root'利用树木震动的服务。

服务文件的位置:

  • 在功能模块的 services 文件夹中,您可以在此处放置A.Service.ts文件
  • 对于似乎不属于特定功能模块的服务(例如,许多模块使用的记录器服务(,您可以将服务组织到没有 a core.module.ts 。请参阅《编码样式指南》中的Angular Doc。

但是,根据情况,如果您使用的是NGRX Store或类似的LIB,则可能需要Coremodule或某些ServiceModule(S(将文件(NGRX模块(导入那里。请参阅《编码样式指南》中的Angular V6 DOC。

P.S。为了共享应用程序范围内的内容,考虑了用于管道,指令和组件的共享模块,但不用于服务。 sharone.module.ts 可能在其@ngmodule装饰器中没有提供者属性。请参阅共享模块上的Angular Doc。

此命名公约1的根本原因是所有Singleton服务都有根喷油器(用于急切的模块和懒惰的负载模块(,因此您通常不想创建另一个喷油器(除非您知道自己在做什么,例如Forroot模式2 Eg< - 顺便说一句,请记住,如果您已经让所有服务providedIn: 'root'都避免了这种麻烦(。

总结一下,Angular Doc建议为所有服务提供Singleton和Tree-akakable 3 4;该服务适合3个位置:功能模块的服务文件夹或一个核心模块/服务模块,尤其是在使用NGRX或Core文件夹时,仅用于组织和整理。


相关文档和参考

https://angular.io/guide/singleton-services

https://angular.io/guide/providers

https://angular.io/guide/router

https://angular.io/guide/lazy-loading-ngmodules

https://v6.angular.io/guide/styleguide coremodule 1 2 3

https://angular.io/guide/styleguide

https://angular.io/guide/module-types

最新更新