0004 - Refactor State Service

ID:ADR-0004

状态:

进行中

发表于:

2022-06-30

背景和问题陈述​

此 ADR 建立在采用适用于 Angular 的可观察数据服务的基础上。

Bitwarden 客户端目前拥有相当复杂的状态架构,其中所有状态均由单个服务处理。这导致一切都与 StateService 紧密耦合,本质上使其成为上帝对象。

此外,任何服务或组件都可以使用状态服务直接访问任何状态。这使得跟踪每种数据类型的状态生命周期变得困难,并给数据访问方式带来了不确定性。

决策结果​

我们应该将状态服务重构为通用存储容器。

  • 优点:消除了状态服务的「good」功能

  • 优点:状态由拥有它的服务维护

  • 优点:不能任意访问数据

  • 缺点:返回必须是唯一的任意键

示例​

interface StateService {
  getAccountData<T>: (account: Account, key: string, options?: StorageOptions) => Promise<T>;
  saveAccountData: (account: Account, key: string, options?: StorageOptions) => Promise<void>;
  deleteAccountData: (account: Account, key: string, options?: StorageOptions) => Promise<void>;

  deleteAllAccountData: (account: Account);

  getGlobalData<T>: (key: string, options?: StorageOptions) => Promise<T>;
  saveGlobalData: (key: string, options?: StorageOptions) => Promise<void>;
  deleteGlobalData: (key: string, options?: StorageOptions) => Promise<void>;
}
// StorageKey is an internal constant, and should be prefixed with the domain.
//  DO NOT EXPORT IT.
const StorageKey = "organizations";

class OrganizationService {
  async save(organizations: { [adr: string]: OrganizationData }) {
    await this._stateService.saveAccountData(this._activeAccount, StorageKey, organizations);
    await this._organizations$.next(await this.decryptOrgs(this._activeAccount, organizations));
  }
}

最后更新于