在 Angular 文档中,它列出了可以实现的功能模块的类型。其中一个是服务模块。
https://angular.io/guide/module-types
在早期版本的 Angular 中,您将创建服务并将其列在服务 NgModule 的 providers 数组中。然后,这个 NgModule 将由消费应用程序导入,服务将在应用程序根注入(inject)器中提供。
Injectable()
export class MyService {}
NgModule({
providers: [MyService]
})
export class MyServicesModule {}
NgModule({
imports: [MyServicesModule]
})
export class AppModule {}
最新的 Angular 建议是使用 Injectable 注解,您不再需要在提供程序定义中列出它。
Injectable({ providedIn: 'root'})
export class MyService {}
因此,创建服务模块有什么意义吗?您是否只是使用上述注释在根注入(inject)器中创建您想要提供的服务,然后直接导入服务类并相应地注入(inject)?
最佳答案
如果您使用的延迟加载模块仅在该模块内提供特定服务,则需要服务模块。
您不能向该模块的组件注入(inject)服务的同一模块提供服务。
所以假设你有一个 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 { }
请查看this article (three shakable providers why, how and cycles由 Manfred Steyer 撰写,其中详细解释了为什么存在一个非常深入的循环。
除了那个用例之外,如果您只在根目录中提供服务,您可能不需要服务模块。您可以创建一个以在一个地方实际拥有所有服务。但也许核心模块也可以做到这一点。这取决于你。
关于angular - 仍然需要 Angular 服务模块吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57289971/