角度 6 依赖注入

Posted

技术标签:

【中文标题】角度 6 依赖注入【英文标题】:angular 6 dependency injection 【发布时间】: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数组方法会被弃用吗?

【问题讨论】:

这里解释了angular.io/guide/… 【参考方案1】:

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

#providedIn

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

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

更多信息请参考这里

https://blog.ninja-squad.com/2018/05/04/what-is-new-angular-6/ https://angular.io/guide/dependency-injection#injectable-ngmodule-or-component https://angular.io/guide/hierarchical-dependency-injection#moduleinjector [根据 Tuan-Tu 在下面评论中的建议]

【讨论】:

另请注意,如果您没有正确标记引号,则它看起来像抄袭。 @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 功能会在生产时移除未使用的依赖项。

【讨论】:

以上是关于角度 6 依赖注入的主要内容,如果未能解决你的问题,请参考以下文章

都说依赖注入,我就从实现的角度来一发,以android作为引子..

Android依赖注入Dagger的使用和源码解析(上篇)

手动TypeScript角度依赖注入在ChangeDetectorRef上失败

角度依赖注入 - 使用T?

如何理解 PHP的依赖注入(DI) 和 控制反转(IoC)

Java习题练习