angular - 导入模块的顺序将注入的抽象覆盖到模块中
问题描述
我有一个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 {
}
现在我按顺序将这两个模块导入 AppModule 。. 所以它看起来像:
@NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule,
BrowserAnimationsModule,
HttpClientModule,
AppRoutes,
LocalizationModule,
EmployeeModule
],
providers: [
],
bootstrap: [AppComponent]
})
export class AppModule {
}
这里的问题是订单。取决于哪个模块(员工或本地化)是服务注入的最后一个TableComponent
,它将抽象作为构造函数的参数。IE。如果订单像上面那样只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();
}
员工表服务示例:
@Injectable()
export class EmployeeTableService extends TableService {
constructor(
private readonly employeeResource: EmployeeResource
) {
super();
}
}
解决方案
如果我理解正确,这里是stackblitz
在这种情况下,一个提供者覆盖另一个提供者的原因是您定义它们的方式。当您通过providers
模块数组定义提供者时,它将在根注入器中注册。所以我知道的唯一一个解决方案是TableService
每次你要使用它时都在组件级别上覆盖它。您也可以为根注入器定义默认提供程序,以供您直接使用。TableService
TableService
推荐阅读
- java - 在 Java 中设置分辨率大小
- java - ArrayList 允许我将项目存储到其中但不使用 .get() 调用它们,说它不是 ArrayList
- java - 在不改变方法的情况下改变数据字段的数量和种类?
- python - 从 recv 函数读取的字节数
- python - .sort() 给我的函数一个 NonType 错误
- java - Jersey REST 查询参数组合验证
- android - Flutter 无法运行 Android
- javascript - 将 css 文件的选择保存到 LocalStorage,在页面刷新或重新打开时记住此选择
- ios - 颤振无法使用 Xcode11.3 构建
- java - NetHttpTransport 无法解析为 Google api 实现类型