鸿蒙(HarmonyOS)开发中分层架构设计

本文同步发表于我的微信公众号,微信搜索 程语新视界 即可关注,每个工作日都有文章更新

在鸿蒙(HarmonyOS)开发中,分层架构设计是提升代码复用性、可维护性和跨设备适配能力的关键。

一、鸿蒙分层架构核心思想

1. 推荐分层模型(三层架构)
层级职责技术实现对应目录
表现层(UI)处理设备差异化UI渲染和交互逻辑ArkUI声明式开发、响应式布局entry/src/main/ets/pages/
领域层(Domain)核心业务逻辑和数据处理状态管理、Service Abilityfeatures/模块名/
数据层(Data)数据获取与持久化数据库、网络请求、分布式数据管理common/data/
2. 跨层通信原则
  • 单向数据流:数据层 → 领域层 → 表现层(通过@State/@Prop/@Link传递)。
  • 依赖倒置:高层模块不直接依赖低层实现,通过接口抽象(如Repository模式)。

二、分层实现与示例

1. 数据层(Data Layer)

职责:统一管理数据源(本地、网络、设备间同步)。

常用API与工具
功能API/组件说明
本地数据库@ohos.data.relationalStore关系型数据库操作
网络请求@ohos.net.http封装HTTP请求
分布式数据@ohos.distributedKVStore跨设备数据同步
数据缓存@ohos.data.preferences轻量级键值存储
示例:数据仓库封装
// common/data/repository/UserRepository.ts
import { relationalStore } from '@ohos.data.relationalStore';
import { http } from '@ohos.net.http';

export class UserRepository {
  private db: relationalStore.RdbStore;

  constructor() {
    this.initDB();
  }

  // 初始化数据库
  private async initDB() {
    const config = { name: 'user.db' };
    this.db = await relationalStore.getRdbStore(this.context, config);
  }

  // 网络请求获取用户数据
  async fetchUserFromRemote(userId: string): Promise<User> {
    let httpRequest = http.createHttp();
    let response = await httpRequest.request(`https://api.example.com/users/${userId}`);
    return JSON.parse(response.result.toString());
  }

  // 本地存储用户数据
  async saveUser(user: User): Promise<void> {
    await this.db.insert('user_table', user);
  }
}
2. 领域层(Domain Layer)

职责:处理业务逻辑,协调数据层与表现层。

核心设计模式
  • 用例(UseCase):封装单一业务逻辑。
  • 依赖注入(DI):通过构造函数注入数据层实例。
示例:用户登录用例
// features/account/usecase/LoginUseCase.ts
import { UserRepository } from '../../../common/data/repository/UserRepository';

export class LoginUseCase {
  constructor(private userRepo: UserRepository) {}

  async execute(username: string, password: string): Promise<boolean> {
    const user = await this.userRepo.fetchUserFromRemote(username);
    if (user.password === password) {
      await this.userRepo.saveUser(user);
      return true;
    }
    return false;
  }
}
3. 表现层(UI Layer)

职责:渲染UI并处理用户交互。

常用API与组件
功能API/组件说明
状态管理@State@Prop@Link组件内状态管理
页面路由@ohos.router跨页面导航
响应式布局GridRowGridColmediaQuery多端UI适配
示例:登录页面
// entry/src/main/ets/pages/LoginPage.ets
import { LoginUseCase } from '../../../features/account/usecase/LoginUseCase';
import { UserRepository } from '../../../common/data/repository/UserRepository';

@Entry
@Component
struct LoginPage {
  @State username: string = '';
  @State password: string = '';
  private loginUseCase: LoginUseCase = new LoginUseCase(new UserRepository());

  build() {
    Column() {
      TextInput({ placeholder: '用户名' })
        .onChange((value: string) => this.username = value)
      
      TextInput({ placeholder: '密码', type: InputType.Password })
        .onChange((value: string) => this.password = value)

      Button('登录')
        .onClick(async () => {
          const success = await this.loginUseCase.execute(this.username, this.password);
          if (success) {
            router.pushUrl({ url: 'pages/HomePage' });
          }
        })
    }
  }
}

三、分层架构的鸿蒙特性适配

1. 多设备UI适配
  • 资源分级:在resources/base/resources/[device-type]/中存放差异化资源。
  • 条件渲染:通过@Builderif-else实现设备专属UI。
    @Builder deviceSpecificButton() {
      if (deviceInfo.deviceType === 'phone') {
        Button('手机按钮').width('100%')
      } else {
        Button('平板按钮').width('50%')
      }
    }
2. 跨设备能力调用
  • 分布式Service Ability:通过featureAbility.connectService()调用其他设备的服务。
    // 连接智慧屏的播放服务
    const connectionId = featureAbility.connectService(
      { deviceId: '123', bundleName: 'com.smarttv', abilityName: 'PlayService' },
      (err, data) => {}
    );

四、总结

  1. 依赖注入优化 使用@Inject装饰器(需配合DI框架如ohos/di)解耦模块:

    @Inject
    private userRepo: UserRepository;
  2. 性能监控 通过@ohos.hiviewdfx.hiTraceMeter跟踪跨层调用耗时:

    hiTraceMeter.startTrace('login_use_case', 1000);
    await loginUseCase.execute();
    hiTraceMeter.finishTrace('login_use_case');
  3. 分层调试

    • 数据层:使用hdc命令行工具直接操作数据库:
      hdc shell aa dump -a com.example.app | grep 'RdbStore'
    • 领域层:编写单元测试验证业务逻辑(使用ohos/unitTest)。

五、完整项目结构示例

myApp/
├── common/                  # 公共层
│   ├── data/                # 数据层实现
│   │   ├── repository/      # 数据仓库
│   │   └── model/           # 数据模型
│   └── utils/               # 工具类
├── features/                # 领域层
│   ├── account/             # 账号模块
│   │   ├── usecase/         # 业务用例
│   │   └── service/         # 领域服务
├── entry/                   # 表现层
│   ├── src/main/ets/
│   │   ├── pages/           # 页面组件
│   │   └── components/      # 共享UI组件
└── resources/               # 多端资源
    ├── base/
    └── tablet/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值