角度 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作为引子..