【问题标题】:angular 6 dependency injection角度 6 依赖注入
【发布时间】:2018-10-16 22:21:22
【问题描述】:

在最新版本的 Angular 6 中,使用服务元数据中的 providedIn 属性在模块中注册服务:

@Injectable({
  providedIn: 'root',
})
export class HeroService {}

但是文档仍然提到在模块元数据中的模块providers 数组中注册服务,就像我们在 Angular 5 中所做的那样:

@NgModule({
  providers: [HeroService],
})
export class AppModule {}

所以,

  • 应该使用哪种方法让注入器知道它应该注入的服务?
  • 模块providers数组方法会被弃用吗?

【问题讨论】:

标签: javascript angular typescript angular-cli angular6


【解决方案1】:

基本上你都可以使用,但是根据新的 CLI provideIn 将在创建 service 时自动添加

#providedIn

现在有一种新的推荐方式可以直接注册提供程序 在@Injectable() 装饰器中,使用新的providedIn 属性。它接受'root' 作为值或您的任何模块 应用。当您使用'root' 时,您的注射剂将被注册 作为应用程序中的单例,您无需将其添加到 根模块的提供者。同样,如果你使用providedIn: UsersModule, 注射剂被注册为提供者 UsersModule 不添加到模块的提供者中。

引入了这种新方法,以便在 应用。当前添加到模块提供者的服务 最终会出现在最终的捆绑包中,即使它没有在 申请,有点遗憾。

更多信息请参考这里

【讨论】:

  • 另请注意,如果您没有正确标记引号,则它看起来像抄袭。
  • @jonrsharpe 是的,我复制了大部分内容,这就是为什么也发布链接
  • 实际上我觉得很奇怪服务知道使用它的模块,反之亦然。这样的服务如何可重用?如果我添加一个需要使用服务的新模块,我需要更改服务本身吗?听起来比较嘲讽
  • @DenisItskovich - 单例可重用服务只需 @Injectable({providedIn: 'root'... - 这也可用于服务到服务的依赖关系(如果不是单例,则 DI in每个组件的提供程序数组将被重用)。所以基本上根据 JEY 在这里的另一个答案,不同的选项适用于不同的用例
  • 作为参考,这里有一些更新的文档链接,因为引用似乎来自博客文章并且文档链接现在不正确angular.io/guide/…
【解决方案2】:

与往常一样,当有多种解决方案可用时,这取决于您想要实现的目标。但是the documentation 给了你一些指令来选择。

有时不希望始终提供服务 应用程序根注入器。也许用户应该明确选择加入 使用该服务,或该服务应以 延迟加载的上下文。在这种情况下,提供者应该关联 具有特定的@NgModule class,并将由任何人使用 注入器包含该模块。

因此,基本上您将providedIn: 'root' 用于应用程序范围内的任何服务。对于其他服务,请继续使用旧版本。

不要忘记,您已经可以选择以不同的方式提供服务。例如,也可以在组件级别声明 Injectable(这在 V6 中没有改变)。

  @Component({
    selector: 'app-my-component',
    templateUrl: './my.component.html',
    providers: [ MyService ]
  })

这样,服务仅在MyComponent 及其子组件树中可用。

【讨论】:

    【解决方案3】:

    如果您使用 Angular 5+ 开发人员,它会在声明为 providedIn: 'root' 时自动创建可注入服务,在这种情况下,您不需要在 app.module.ts 中导入服务。您可以直接在其他组件中使用它。

    【讨论】:

      【解决方案4】:

      @NgModule()@Component() 装饰器具有提供程序元数据选项,您可以在其中为 NgModule 级或组件级注入器配置提供程序。

      @Injectable() 装饰器具有 providedIn 元数据选项,您可以在其中使用根注入器或特定 NgModule 的注入器指定装饰服务类的提供者。

      在您的情况下,由于它已在“根”级别提供,因此无需再次将其添加为模块中的提供程序。

      更多关于Dependency Injection Here

      【讨论】:

        【解决方案5】:

        当我们在@injectable 中使用providedIn: 'root' 属性时,我们不需要进入提供者的数组。

        通过使用providedIn 将有利于tree shakable 功能。

        Tree shakable 功能会在生产时移除未使用的依赖项。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-03-04
          • 2019-04-02
          • 1970-01-01
          相关资源
          最近更新 更多