首页 > 解决方案 > Angular 6 providedIn - 如何自定义 @Injectable() 提供程序以进行依赖注入?

问题描述

在 Angular 5 中,如果我有AbstractClassService并且ExtendedClassService扩展了抽象,我可以在 NgModule 的 providers 数组中执行此操作:

@NgModule({
  providers: [
    {provide: AbstractClassService, useClass: ExtendedClassService}
  ]
})
export class AppModule {}

这将使我可以ExtendedClassService很容易地切换到另一个进行测试或其他任何事情。这仍然可以使用 Angular 6 完成,但是providedIn可以在服务本身中设置新选项以减少包大小:

@Injectable({providedIn: 'root'})
export class ExtendedClassService extends AbstractClassService {}

有没有办法让我在使用新的 Angular 5 时完成同样的事情providedIn?像这样的东西:

@Injectable({providedIn: 'root', provide: AbstractClassService})
export class ExtendedClassService extends AbstractClassService {}

标签: angulardependency-injectionangular-module

解决方案


我需要做两件事。

首先,在创建继承类时使用implements而不是,不要在那里使用密钥:extendsprovidedIn

@Injectable() // removed providedIn
export class ExtendedClassService implements AbstractClassService {}

其次,将提供者指令添加到抽象类中:

@Injectable({providedIn: 'root', useClass: ExtendedClassService})
export abstract class AbstractClassService {}

其他提供者配置 ( useValue, useExisting, useFactory) 也可以在那里使用。

这篇评论归功于 Abinesh,这让我看到了链接的博客文章。非常感谢博主!


推荐阅读