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)
因此,创建服务模块有什么意义吗?您是否只是使用上述注释在根注入器中创建您想要提供的服务,然后直接导入服务类并相应地注入?
如果您使用延迟加载模块,这些模块仅在该模块内部提供特定服务,则需要一个服务模块。
您不能在同一模块中提供服务,该模块的组件将服务注入。
所以假设你有一个 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 中提供服务,您可能不需要服务模块。您可以创建一个,将所有服务都放在一个地方。但也许核心模块也可以做到这一点。随你(由你决定。
| 归档时间: |
|
| 查看次数: |
2424 次 |
| 最近记录: |