导入模块的顺序将注入的抽象覆盖到模块中

问题描述 投票:0回答:1

我有一个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();
    }

}
angular dependency-injection abstract-class abstract
1个回答
0
投票

如果我理解正确,这里是stackblitz


在这种情况下,一个提供者优先于另一个提供者的原因是您定义它们的方式。通过模块的providers数组定义提供程序时,它将在根注入器中注册。因此,我知道的唯一解决方案是每次使用组件时都在组件级别覆盖TableService。另外,对于要直接使用TableService的情况,您可以在根注入器中为TableService定义default提供程序。

© www.soinside.com 2019 - 2024. All rights reserved.