Angular自定义提供程序取决于另一个自定义提供程序

时间:2019-03-03 13:04:00

标签: angular domain-driven-design angular-providers

我有一个服务,该服务实现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

1 个答案:

答案 0 :(得分:0)

我认为应该在使用该组件的组件级别上,在users-repository.module.ts或更高版本中重新提供APP_DB。因此,通过这种方式,您将能够使用该服务的更具体的实现(可能会稍稍更改架构)。请考虑查看下一篇文章:Hierarchical Dependency Injectors