我有一个基本的视图服务,在整个应用程序中充当单例。一个实例,它使视图状态保持同步。界面非常简单:
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,
) {
}
}
有什么办法解决这个问题,还是我走错了方向?
答案 0 :(得分:0)
我最终添加了一个虚拟服务,该服务仅使调用变通,并在使用事务的模块中被覆盖,因此DummyViewService
和TransactionsViewService
都需要@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 },
],
}