我有一个TableComponent
,需要抽象服务才能进行一些异步调用。该模块如下所示:
@NgModule({
imports: [
CommonModule,
],
declarations: [
TableComponent
],
exports: [
TableComponent
]
})
export class TableModule {
static forRoot(tableService: Type<TableService>): ModuleWithProviders {
return {
ngModule: TableModule,
providers: [
{ provide: TableService, useClass: tableService }
]
};
}
}
并且我必须进一步模块化:EmployeeModule和LocalizationModule。看起来都一样:
@NgModule({
imports: [
CommonModule,
TableModule.forRoot(EmployeeTableService), <---- Injected EmployeeTableService
],
declarations: [
EmployeeComponent,
ModalEmployeeComponent
],
providers: [
EmployeeResource,
EmployeeRepository,
EmployeeTableService
]
})
export class EmployeeModule {
}
@NgModule({
imports: [
CommonModule,
TableModule.forRoot(LocalizationTableService),
],
declarations: [
LocalizationComponent
],
providers: [
LocalizationResource,
LocalizationRepository,
LocalizationTableService
],
})
export class LocalizationModule {
}
现在,我以order。将这两个模块导入AppModule。所以看起来像:
@NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule,
BrowserAnimationsModule,
HttpClientModule,
AppRoutes,
LocalizationModule,
EmployeeModule
],
providers: [
],
bootstrap: [AppComponent]
})
export class AppModule {
}
这里的问题是命令。取决于将服务注入TableComponent
的最后一个模块(雇员或本地化),该模块将抽象作为构造函数的参数。就是如果顺序如上,则仅注入EmployeeTableService
。否则会注入LocalizationTableService
-为什么以及如何更改它,以便TableComponent
始终采用正确的抽象?
TableComponent
看起来像:
@Component({
selector: 'sp-table[configuration]',
templateUrl: './TableComponent.html',
styleUrls: ['./TableComponent.scss'],
changeDetection: ChangeDetectionStrategy.OnPush
})
export class TableComponent implements OnInit {
constructor(
public readonly dialog: MatDialog,
private readonly tableService: TableService,
private readonly changeDetectorRef: ChangeDetectorRef
) {
super();
}
EmployeeTableService的示例:
@Injectable()
export class EmployeeTableService extends TableService {
constructor(
private readonly employeeResource: EmployeeResource
) {
super();
}
}
如果我理解正确,这里是stackblitz
在这种情况下,一个提供者优先于另一个提供者的原因是您定义它们的方式。通过模块的providers
数组定义提供程序时,它将在根注入器中注册。因此,我知道的唯一解决方案是每次使用组件时都在组件级别覆盖TableService
。另外,对于要直接使用TableService
的情况,您可以在根注入器中为TableService
定义default提供程序。