直接跳到内容

数据层

介绍

数据层用仓库做统一入口。上层业务只和 Repository 打交道,不直接碰 network、database 或 datastore。这样可以让数据来源更好管理,也方便后续替换实现。

模块职责

  • data 模块只做一件事:对外提供统一的数据入口。
  • 上层业务只调用 Repository,不直接依赖 network/database/datastore。
  • Repository 内部负责组合数据源与处理读取策略。

使用示例

下面示例展示 ViewModel 调用仓库获取数据的常见写法。

ViewModel

ts
import { BaseNetWorkViewModel } from "base";
import { GoodsRepository } from "data";
import { Goods, NetworkResponse } from "model";

/**
 * @file 商品详情 ViewModel
 */
@ObservedV2
export default class GoodsDetailViewModel extends BaseNetWorkViewModel<Goods> {
  /**
   * 商品仓库
   */
  private repository: GoodsRepository = new GoodsRepository();

  /**
   * 请求商品详情
   * @returns {Promise<NetworkResponse<Goods>>} 网络请求 Promise
   */
  protected requestRepository(): Promise<NetworkResponse<Goods>> {
    return this.repository.getGoodsInfo("1");
  }
}

如何新增仓库

新增仓库时,保持统一命名与结构,流程如下:

  1. core/data/src/main/ets/repository/ 新建 XXXRepository.ets
  2. 通过构造函数注入对应的数据源(network/database/datastore)。
  3. 对外只暴露业务语义的方法,不暴露数据源细节。
  4. core/data/Index.ets 里新增导出,保证上层可以统一从 data 模块引入。
  5. 在 ViewModel 中只依赖该仓库,保持上层不直接依赖数据源。

示例:新建一个 OrderRepository,只对外提供订单相关方法。

ts
import { OrderNetworkDataSource, OrderNetworkDataSourceImpl } from "network";
import { NetworkResponse, Order } from "model";

/**
 * @file 订单仓库,封装订单模块请求
 */
export class OrderRepository {
  /**
   * 订单网络数据源
   */
  private dataSource: OrderNetworkDataSource;

  /**
   * 构造函数
   * @param {OrderNetworkDataSource} [dataSource] 可选的网络数据源
   */
  constructor(dataSource?: OrderNetworkDataSource) {
    this.dataSource = dataSource ?? new OrderNetworkDataSourceImpl();
  }

  /**
   * 获取订单详情
   * @param {string} id - 订单 ID
   * @returns {Promise<NetworkResponse<Order>>} 订单详情
   */
  async getOrderDetail(id: string): Promise<NetworkResponse<Order>> {
    return this.dataSource.getOrderDetail(id);
  }
}

同时在 core/data/Index.ets 里补充导出,例如:

ts
export { OrderRepository } from "./src/main/ets/repository/OrderRepository";

注意事项

  • 业务层不要直接依赖 network/database/datastore。
  • 数据源变化时只改 Repository,避免影响上层业务。