Angular 6依赖注入:服务注册的两种方式该如何选择?
该选哪种方式注册Angular服务?
两种方式都能让注入器正确识别并提供HeroService,但优先推荐Angular 6+引入的providedIn: 'root'方式,下面给你拆解两者的区别和适用场景:
为什么优先用providedIn: 'root'?
- 树摇优化:这种方式会把服务标记为"树可摇"的依赖,打包工具会自动移除那些在应用中没被实际使用的服务,有效减小最终包的体积,这是Angular官方主推的优化点。
- 更少的维护成本:不需要在任何
NgModule的providers数组里手动添加服务,避免了模块文件的冗余修改,也不会因为漏加导致服务无法注入的问题。 - 默认单例:注册在
root的服务默认是应用级单例,整个应用中只会存在一个实例,完全满足绝大多数业务服务的需求(比如数据请求、状态管理类服务)。
对应的代码示例:
@Injectable({ providedIn: 'root', }) export class HeroService {}
什么时候需要用NgModule的providers数组?
虽然新方式更省心,但旧的模块注册方式依然有它的适用场景:
- 模块级别的服务隔离:如果你希望服务只在某个特定模块及其子组件/子模块中可用,或者需要为不同模块提供该服务的不同实例,就适合用这种方式。比如在一个Feature模块的
providers里注册服务,那只有这个模块内部的组件能注入到该服务的实例,其他模块无法访问。 - 服务与模块生命周期绑定:当服务的生命周期需要和某个模块保持一致(模块销毁时服务也被销毁),也可以选择在模块的
providers里注册。
对应的代码示例:
@NgModule({ providers: [HeroService], }) export class AppModule {}
总结
日常开发中,providedIn: 'root'是首选方案,既优化了打包体积又简化了配置;只有当你需要对服务的作用域或实例数量做精细化控制时,再考虑使用NgModule的providers数组注册方式。
内容的提问来源于stack exchange,提问作者Hamed
相关产品推荐
相关产品推荐

