Angular 6 providedIn - 如何自定义 @Injectable() 提供程序以进行依赖注入(inject)?

标签 angular dependency-injection angular-module

在 Angular 5 中,如果我有扩展抽象的 AbstractClassServiceExtendedClassService,我可以在我的 NgModule 的提供者数组中这样做:

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

这将允许我很容易地将 ExtendedClassService 与另一个切换以进行测试或其他任何操作。这仍然可以通过 Angular 6 完成,但是有一个新的 providedIn 选项可以在服务本身中设置以减少包大小:

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

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

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

最佳答案

我需要做两件事。

首先,在创建继承类时使用 implements 而不是 extends 并且不要使用 providedIn 键那里:

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

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

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

其他提供者配置(useValueuseExistinguseFactory)也可以在那里使用。

感谢 Abinesh 的 this comment这让我找到了the linked blog post .非常感谢博主!

关于Angular 6 providedIn - 如何自定义 @Injectable() 提供程序以进行依赖注入(inject)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50489412/

相关文章:

angular - NGRX 效果调度了一个无效的 Action

unit-testing - 使用原生 View 封装时访问嵌套组件的DebugElement

java - 如何将 Spring @Autowired 所需的属性设置为 false 以进行测试?

angular - PlatformRef.bootstrapModule(...) 抛出错误,显示 "No ResourceLoader implementation has been provided."

javascript - Angular 8 - @ViewChild 在父组件上返回未定义。 (没有嵌套的 ngIf 并在 ngAfterViewInit 中调用)

angular - 从 Angular 2 上的查询参数中预填充输入文本框

javascript - 缩小 httpInterceptor AngularJS $injector 错误

c# - 是否有像Unity这样的东西可以用于不需要界面的简单事物?

angular - 如何使用 Angular Module Federation 导入整个应用程序

javascript - 如何为现有的 Javascript 库创建 Angular 库包装器?