我有一个服务,该服务实现IDatabase
接口并使用Firebase保存数据(例如)。我希望它可以被实现IDatabase
接口(例如,couchDb)的另一个服务替换。并且有几个存储库服务(取决于数据类型)将使用此根db服务。
所以我决定使用角度自定义提供程序:
在这里,我创建了一个与IDatabase界面相关的 APP_DB Injection Token
。
export const APP_DATA_DB = new InjectionToken<IDatabase>('app-data-delta-db');
然后我使用此令牌声明将在应用程序的所有子模块中可用的根DB服务。
// app.module.ts:
@NgModule({
providers: [{ provide: APP_DB, useClass: AppDataFirebaseService }]
在其中一个子模块(users-repository.module
)中,我还使用了useFactory
选项为存储库模块定制了提供程序:
//users-repository.module.ts:
@NgModule({
providers: [
{ provide: USERS_REPOSITORY_SERVICE,
useFactory: (appDb: IDatabase, store: Store<any>) => {
return new VehicleRepositoryService(appDb, store),
deps: [APP_DB, Store]
}]
但是,当我在users-repository.module.ts顶部查看导入时,我看到我是从“ Firbase”服务所在的文件中导入APP_DB的。
然后一个问题是当所有子模块中的注入令牌都指向时,如何将CouchDb
中的useClass
的根DB服务更改为app.module.ts
服务从Firestore
服务到 APP_DB ?
答案 0 :(得分:0)
我认为应该在使用该组件的组件级别上,在users-repository.module.ts或更高版本中重新提供APP_DB。因此,通过这种方式,您将能够使用该服务的更具体的实现(可能会稍稍更改架构)。请考虑查看下一篇文章:Hierarchical Dependency Injectors。