Angular 是否仍需要角维修模块?

Angular 是否仍需要角维修模块?,angular,dependency-injection,angular-services,Angular,Dependency Injection,Angular Services,在angular文档中,它列出了可以实现的功能模块的类型。其中一个是服务模块 在Angular的早期版本中,您将创建服务并将其列在服务模块的providers数组中。然后,该模块将由消费应用程序导入,服务将在应用程序根注入器中提供 Injectable() export class MyService {} NgModule({ providers: [MyService] }) export class MyServicesModule {} NgModule({ imp

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

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

Injectable()
export class MyService {}

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

NgModule({
    imports: [MyServicesModule]
})
export class AppModule {}
最新的建议是使用可注入注释,不再需要在提供者定义中列出它

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

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

如果您使用的是延迟加载的模块,而这些模块仅在该模块中提供特定的服务,则需要服务模块

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

因此,假设您有一个
MyLazyFeatureModule

@NgModule({
  imports:      [ ],
  providers:    [ ],
  declarations: [ MyFeatureComponent ],
  exports:      [ ],
})
export class MyLazyFeatureModule { }
如果您的服务仅包含功能的逻辑,则无法执行以下操作:

Injectable({ providedIn: MyLazyFeatureModule})
export class MyFeatureService {}
你会骑自行车的

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

@NgModule({
  imports:      [ ],
  providers:    [ ],
  declarations: [ ],
  exports:      [ ],
})
export class MyLazyFeatureServiceModule { }
请看一下曼弗雷德·斯泰尔(Manfred Steyer)的作品,其中详细解释了为什么会有一个相当深入的循环


除此之外,如果您只在根目录中提供服务,您可能不需要服务模块。您可以创建一个,将所有服务实际放在一个位置。但也许一个核心模块也可以做到这一点。这取决于您。

如果不导入服务模块,那么我认为拥有一个模块是没有意义的,似乎是多余的。您能解释一下核心模块是什么意思吗?您必须将该服务模块导入功能模块。我将在回答中添加一个结构概述。Maxbe然后它有点清楚更新了我的答案希望现在它有点清楚为什么你会需要那个服务module@FergalRooney之所以会出现这种循环,是因为当编译器尝试创建模块时,它会在组件中运行,并创建注入到组件中的服务实例(如果还不存在的话)。当编译器遇到它当前试图创建的同一模块中提供的服务时,编译器在一个周期内运行,因为他需要创建服务才能创建模块,但也需要创建模块才能创建服务。@Mahi服务模块是一种模式,用于将服务分组到自己的功能相关模块中,以便路由模块更具可读性,因为提供程序列表并非如此长的这里的问题是,随着树摇动提供者(providedIn声明)的引入,这种模式是否已经过时,或者当这些模块开始使用时,是否仍然存在一个用例它可能会有所帮助:-
Injectable({ providedIn: MyFeatureServiceModule})
export class MyFeatureService {}
@NgModule({
  imports:      [ MyLazyFeatureServiceModule ],
  providers:    [ ],
  declarations: [ MyFeatureComponent ],
  exports:      [ ],
})
export class MyLazyFeatureModule { }