Angular 6 ProviderIn-如何为依赖项注入定制@Injectable()提供程序?

Angular 6 ProviderIn-如何为依赖项注入定制@Injectable()提供程序?,angular,dependency-injection,angular-module,Angular,Dependency Injection,Angular Module,在Angular 5中,如果我有扩展抽象的AbstractClassService和ExtendedClassService,我可以在我的NgModule的providers数组中这样做: @NgModule({ providers: [ {provide: AbstractClassService, useClass: ExtendedClassService} ] }) export class AppModule {} 这将允许我切换ExtendedClassServic

在Angular 5中,如果我有扩展抽象的
AbstractClassService
ExtendedClassService
,我可以在我的NgModule的providers数组中这样做:

@NgModule({
  providers: [
    {provide: AbstractClassService, useClass: ExtendedClassService}
  ]
})
export class AppModule {}
这将允许我切换
ExtendedClassService
到另一个,以便进行测试或其他任何非常容易的操作。这仍然可以通过Angular 6完成,但是在中提供了新的选项,可以在服务本身中设置该选项以减少捆绑包大小:

@Injectable({providedIn: 'root'})
export class ExtendedClassService extends AbstractClassService {}
在使用新版
时,是否有办法实现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 {}
其他提供程序配置(
useValue
useExisting
useFactory
)也可以在那里使用


这归功于阿比内斯,正是他让我这么做的。非常感谢博客作者

providedIn
仅用于定位负责注入类的实例的注入器
ExtendedClassService
,因此它将是根注入器。如果不希望根注入器用于此目的,则可以指定任何其他模块。然后服务实例将由包含该模块的注入器创建。如果要动态创建实例,可以使用
useFactory
提供负责创建实例的工厂函数。我认为不可能这样做以较新的树可访问提供程序创建语法(provideIn)为现有提供程序提供替代实现。。。请查看这个博客,它涵盖了大部分内容@Niladri我确实希望根注入器负责注入服务,但是我希望它使用标记
AbstractClassService
——因为这是注入组件中的东西——而不是
ExtendedClassService
,如果
ExtendedClassService
有任何依赖项,例如
HttpClient
,则必须将它们添加到
AbstractClassService
装饰器:
deps:[HttpClient]
如果将服务放在单独的文件中,则会生成循环引用。如果基类不是我们的,比如说
angularcore
ErrorHandler
类,比如@EvAlex,那该怎么办呢。如果只在单独的文件中导出/导入类名,则可以避免循环引用(依赖项)。如果您尝试共享变量或枚举,您将得到循环。我遇到了这个问题,并通过将任何共享变量移动到单独的文件来解决它。(在我的例子中,它只是一个我移动到它自己的文件中的枚举)。您甚至可以完全省略
扩展类服务中的
@Injectable()