文档管理中心
我的

ArkTs中如何使用切面编程

问题现象

如何在rcp.createSession方法执行前,执行相关逻辑?

背景知识

应用切面编程(AOP)是一种通过在不修改业务逻辑代码的前提下,将通用功能(如日志、埋点、安全等)动态插入方法执行流程中的编程范式。HarmonyOS主要通过插桩机制来实现切面编程,并提供了Aspect类,该类包含addBefore、addAfter和replace接口。

解决方案

  1. 创建一个proxy.ts作为rcp的封装代理函数。
    收起
    自动换行
    深色代码主题
    复制
    1. export function createSessionProxy(config: rcp.SessionConfiguration): rcp.Session {
    2. return rcp.createSession(config);
    3. }
  2. 在业务需要采用拦截器的模块调用该方法。
    收起
    自动换行
    深色代码主题
    复制
    1. export function injectRcpAspect(): void {
    2. util.Aspect.addBefore(
    3. createSessionProxy,
    4. 'createSession',
    5. false,
    6. // 下面函数是在createSession方法前执行。
    7. (target: object, config: rcp.SessionConfiguration) => {
    8. console.info(`[切面] 创建 Session,目标为:${target},配置为:${config}`);
    9. }
    10. );
    11. }

总结

util.Aspect.addBefore()只能对ArkTS的类或对象方法做切面,不能作用于native层或系统模块。而rcp其大多方法是native实现,所以不能直接做切面,推荐使用封装代理函数然后插桩做切面。