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

Bee*_*ice 12 dependency-injection angular-module angular

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

@NgModule({
  providers: [
    {provide: AbstractClassService, useClass: ExtendedClassService}
  ]
})
export class AppModule {}
Run Code Online (Sandbox Code Playgroud)

这将允许我切换ExtendedClassService到另一个进行测试或任何非常容易的.这仍然可以使用Angular 6完成,但是providedIn可以在服务本身中设置新选项以减少包大小:

@Injectable({providedIn: 'root'})
export class ExtendedClassService extends AbstractClassService {}
Run Code Online (Sandbox Code Playgroud)

有没有办法让我在使用新的时候完成与Angular 5相同的操作providedIn?像这样的东西:

@Injectable({providedIn: 'root', provide: AbstractClassService})
export class ExtendedClassService extends AbstractClassService {}
Run Code Online (Sandbox Code Playgroud)

Bee*_*ice 13

我需要做两件事.

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

@Injectable() // removed providedIn
export class ExtendedClassService implements AbstractClassService {}
Run Code Online (Sandbox Code Playgroud)

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

@Injectable({providedIn: 'root', useClass: ExtendedClassService})
export abstract class AbstractClassService {}
Run Code Online (Sandbox Code Playgroud)

其他供应商的配置(useValue,useExisting,useFactory),也可以在那里使用.

通过这条评论,Abinalh获得了信用,这使我进入了链接的博客文章.非常感谢博客作者!