是否仍然需要 Angular 服务模块?

Fer*_*ney 3 dependency-injection angular-services angular

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

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

在早期版本的 Angular 中,您将创建您的服务并将其列在服务 NgModule 的 providers 数组中。然后这个 NgModule 将由消费应用程序导入,其中服务将在应用程序根注入器中提供。

Injectable()
export class MyService {}

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

NgModule({
    imports: [MyServicesModule]
})
export class AppModule {}
Run Code Online (Sandbox Code Playgroud)

最新的 Angular 建议是使用 Injectable 注释,您不再需要在提供程序定义中列出它。

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

因此,创建服务模块有什么意义吗?您是否只是使用上述注释在根注入器中创建您想要提供的服务,然后直接导入服务类并相应地注入?

Erb*_*nig 7

如果您使用延迟加载模块,这些模块仅在该模块内部提供特定服务,则需要一个服务模块。

您不能在同一模块中提供服务,该模块的组件将服务注入。

所以假设你有一个 MyLazyFeatureModule

@NgModule({
  imports:      [ ],
  providers:    [ ],
  declarations: [ MyFeatureComponent ],
  exports:      [ ],
})
export class MyLazyFeatureModule { }
Run Code Online (Sandbox Code Playgroud)

并且您的服务仅包含您的功能的逻辑,则您不能执行以下操作:

Injectable({ providedIn: MyLazyFeatureModule})
export class MyFeatureService {}
Run Code Online (Sandbox Code Playgroud)

你会得到一个循环!

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

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

请看一下这篇文章( Manfred Steyer撰写的三个可动摇的供应商为什么、如何和周期,其中详细解释了为什么存在周期的详细信息。

除了那个用例之外,如果您只在 root 中提供服务,您可能不需要服务模块。您可以创建一个,将所有服务都放在一个地方。但也许核心模块也可以做到这一点。随你(由你决定。