Angular 服务 providedIn VS forRoot

17

我想知道这两个代码块是否相等。

我可以使用providedIn来达到与forRoot相同的结果吗?

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

@NgModule({
  imports: []
})
export class MyModule {
  static forRoot(): ModuleWithProviders {
    return {
      ngModule: MyModule,
      providers: [
        MyService
      ]
    };
  }
}

@NgModule({
  imports: [
    MyModule.forRoot()
  ],
  bootstrap: [AppComponent]
})
export class AppModule { }

[我仍然会保留我的MyModule,以便单独使用带有providedId单例服务]

3个回答

18

使用 providedInproviders[] 的区别:

  1. providedIn 是 Angular 中进行 DI 的新方式。自 Angular 6 开始引入了 providedIn

  2. 官方名称为“可摇树的提供商” - 而不是模块提供所有服务,现在是服务本身声明它应该提供哪些内容

  3. 使用 providedIn: 'root' 可以完全避免导入库模块的需要,我们可以直接注入所需的服务,它就可以正常工作


是的,使用 providedInforRoot 更好,因为它更容易进行树摇优化。 - Pace
2
那么为什么我们仍然要使用带有forRoot模式的RouterModule呢? - saivishnu tammineni
1
@saivishnutammineni,我认为是因为使用providedIn时无法配置自定义配置提供程序,我们需要为Router服务提供自定义路由。 - axk

7

4

providedIn 属性可以直接根据其值注入 service,如果它的值是 'root',则会在根 module 中直接进行注入 - 这将帮助您停止在模块 [providers] 中添加 service

Angular 将在 module 中注入服务 - 如果您使用了懒加载模块,则每次加载其他模块时 Angular 将创建新的注入器

如果您使用了懒加载,则最好在模块上使用 forRoot() 注入,并确保您的 service 不会创建多个注入器

希望这能帮到您 - 开心编程!

查看此链接了解更多信息


所以,如果使用懒加载,您确定使用provideIn不会给您提供单例吗?如果您能构建一个简单的运行示例,我将不胜感激:) 感谢您的帮助。 - user3887366
您可以查看该链接以获得进一步的澄清 - 谢谢 :) - Rahul
在懒加载组件中使用单例服务实例时,providedIn 的工作非常好。我真的不明白为什么 Angular 引入了 providedIn,而 forRoot 已经存在了!请查看此链接:https://stackblitz.com/edit/angular-treeshakable-providedin-3pbafd - anusreemn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接