数据层
介绍
数据层用仓库做统一入口。上层业务只和 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");
}
}如何新增仓库
新增仓库时,保持统一命名与结构,流程如下:
- 在
core/data/src/main/ets/repository/新建XXXRepository.ets。 - 通过构造函数注入对应的数据源(network/database/datastore)。
- 对外只暴露业务语义的方法,不暴露数据源细节。
- 在
core/data/Index.ets里新增导出,保证上层可以统一从 data 模块引入。 - 在 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,避免影响上层业务。