angular - 仍然需要 Angular 服务模块吗?

标签 angular dependency-injection angular-services

在 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/

相关文章:

javascript - 在 HTML 中使用 *ngfor 指令解析 JSON

c# - Entity Framework 4 DB-First 依赖注入(inject)?

javascript - 如何从模块实例[Angular]获取服务实例

angular - 在 Angular 2 中是否需要指定类型和默认值?

javascript - Angular 中的 Json 数据到 CSS

Angular : How to send JSONL String to a REST API endpoint (POST Method) that expects a file?

c# - 如何订阅依赖注入(inject)服务的事件

c# - 是否可以在创建 Autofac LifetimeScope 后向其添加注册?

javascript - Angular 服务返回未定义

javascript - Angular 从 Service.component 获取数据到 mat-table