在角文档中,它列出了可以实现的特征模块的类型。其中之一是服务模块。
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