Angular 7+:使用应用程序子模块的适配器覆盖服务

时间:2019-02-12 15:37:22

标签: angular

我有一个基本的视图服务,在整个应用程序中充当单例。一个实例,它使视图状态保持同步。界面非常简单:

items$: Observable<Item[]>;
add(item: Item): Promise<void>;
remove(id: string): Promise<void>;
load(id: string): Promise<ItemDetail>;

我希望应用程序的某个部分在此服务上创建一个适配器,以添加一个新方法:

beginTransaction(): {commit: () => Promise<void>, cancel: ()=>void; };

这个想法是,一旦进入事务,添加和删除项目会将它们添加到待处理列表中,直到您提交/取消事务。 我希望所有客户端都保持不变(因为它们也在其他上下文中使用),在没有事务的情况下,所有这些都保持了ViewService的单个实例。

我尝试在具有事务之类的应用程序模块中使用注入令牌,因为问题在于这导致有2个ViewService实例(该模块有1个全局实例):

export const VIEW_SERVICE = new InjectionToken<ViewService>('view-service');

@NgModule({
  providers: [
    { provide: VIEW_SERVICE, useClass: ViewService },
    { provide: ViewService, useClass: TransactionViewService },
  ],
 }

所以我的TransactionViewService变成:

@Injectable()
export class TransactionViewService {

    // add to pending if transaction. call inner viewService on commit

    constructor(
        @Inject(VIEW_SERVICE) private viewService: ViewService,
    ) {
    }
}

有什么办法解决这个问题,还是我走错了方向?

1 个答案:

答案 0 :(得分:0)

我最终添加了一个虚拟服务,该服务仅使调用变通,并在使用事务的模块中被覆盖,因此DummyViewServiceTransactionsViewService都需要@Inject(VIEW_SERVICE)来获取基数查看服务:

export const VIEW_SERVICE = new InjectionToken<ViewService>('view-service');

//root module:
@NgModule({
  providers: [
    { provide: VIEW_SERVICE, useClass: ViewService },
    { provide: ViewService, useClass: DummyViewService },
  ],
 }

//module that supports transactions:
@NgModule({
  providers: [
    { provide: ViewService, useClass: TransactionViewService },
  ],
 }