当前位置: 首页 > news >正文

AOP编程有三大场景:控制器切面,内部切面,外部切面,你get到了吗?

果用过NestJS框架都知道,在NestJS框架中AOP编程包括以下几个能力:Middleware、Guard、Interceptor、Pipe、Filter。事实上AOP编程的应用场景更广泛,上述所列5个能力仅仅是AOP编程的子集。下面,我们看看在VonaJS框架中,AOP编程是怎样的。

VonaJS AOP编程

VonaJS AOP 编程包括三个方面的能力:

控制器切面: 为 Controller 方法切入逻辑

内部切面: 在 Class 内部,为任何 Class 的任何方法切入逻辑

外部切面: 在不改变 Class 源码的前提下,从外部为任何 Class 的任何方法切入逻辑

控制器切面

控制器切面清单

Middleware

Guard

Intercepter

Pipe

Filter

执行时序图

控制器切面的执行时序图如下:

aspect-controller

洋葱模型: Middleware和Intercepter支持洋葱模型,允许在Controller Action之前和之后执行切面逻辑

Middleware: 针对不同的执行时序节点,系统提供了三种 Middleware: Middleware System、Middleware Global和Middleware Local,从而可以实现更精细化的切面逻辑

Route Match: 只有Middleware System在路由匹配之前执行,其余在路由匹配之后执行

Filter: 任何环节抛出异常,都会执行Filter,从而自定义错误信息和错误日志的处理逻辑

内部切面

内部切面提供两个机制:AOP Method和魔术方法

1. AOP Method

直接在 Class Method 上通过装饰器切入逻辑

举例:数据库事务

class ServiceStudent {

+ @Database.transaction()

async update(id: TableIdentity, student: DtoStudentUpdate) {

return await this.scope.model.student.updateById(id, student);

}

}

@Database.transaction:通过AOP Method机制实现的装饰器,可以直接提供数据库事务能力

举例:日志

class ServiceStudent {

+ @Log()

async update(id: TableIdentity, student: DtoStudentUpdate) {

return await this.scope.model.student.updateById(id, student);

}

}

@Log:通过AOP Method机制实现的装饰器,可以直接提供日志能力

2. 魔术方法

可以在 Class 内部通过__get__和__set__切入动态属性或方法

举例:获取 model 实例

class ServiceStudent {

async update(id: TableIdentity, student: DtoStudentUpdate) {

+ return await this.scope.model.student.updateById(id, student);

}

}

this.scope.model.xxx: 没有使用依赖注入,而是使用依赖查找,直接通过 scope 对象获取 model 实例,从而简化代码的书写风格

实现思路

系统提供了一个 Class ServiceModelResolver,用于实现 model 实例的动态解析,代码如下:

class ServiceModelResolver {

protected __get__(prop: string) {

const beanFullName = `${this[SymbolModuleScope]}.model.${prop}`;

return this.bean._getBean(beanFullName as any);

}

}

当调用this.scope.model.student时,会自动执行__get__方法,并且传入参数prop: 'student'

将参数prop与当前模块名称合并成beanFullName

通过beanFullName从全局容器中获取 model 实例,并返回给调用者

外部切面

仍以 Class ServiceStudent的update方法为例,通过外部切面来实现日志能力:

import { Aop } from 'vona-module-a-aspect';

@Aop({ match: 'demo-student.service.student' })

class AopLog {

async update(_args: Parameters<any>, next: Function, _receiver: any) {

const timeBegin = Date.now();

const res = await next();

const timeEnd = Date.now();

console.log('time: ', timeEnd - timeBegin);

return res;

}

}

@Aop: 此装饰器用于实现外部切面

match: 用于将 Class AopLog与 Class ServiceStudent关联,ServiceStudent的 beanFullName 是demo-student.service.student

update: 在AopLog中提供与ServiceStudent同名的方法update,实现自定义逻辑即可

http://www.cnnetsun.cn/news/116817.html

相关文章:

  • ADC调试踩坑:一个printf引发的“血案“
  • 关键词:一致性算法;直流微电网;下垂控制;分布式二次控制;电压电流恢复与均分;非线性负载
  • ComfyUI-Manager安全权限终极指南:快速解决权限问题
  • Electronic WeChat个性化配置完全指南:从入门到精通
  • I2C总线:时序结构与数据帧
  • 适合新手的电脑版AI编曲软件快速根据哼唱清唱主旋律作伴奏
  • ZW3D二次开发_分享一个通过命令按钮查找关联API函数的插件
  • 【光照】Unity[光照探针]的作用与工作原理
  • 你有没有想过,像 ChatGPT 这样聪明的 AI,它是怎么“出生”的?
  • 基于单片机的数字电压表设计
  • 强化学习系统性学习笔记(二):策略优化的理论基础与算法实现
  • 基于STM32银行医院柜台叫号排队系统语音播报设计
  • c#造个轮子--GIF录制工具
  • 专利申请怕驳回、分类难?别担心!星河智源申请前评估来帮你
  • 【EF Core】通过 DbContext 选项扩展框架
  • 新用户免费试用EmotiVoice 1000个token
  • 免费视频增强神器:3步将模糊视频升级4K超清画质
  • dp 总结 1
  • 5大核心参数精准调优:从理论到实践的Faiss HNSW索引优化指南
  • LeetCode 最小覆盖子串:滑动窗口 + 哈希表高效解法
  • Meta AR眼镜双线布局引关注,各巨头加码XR赛道看重市场潜力谋战略先机!
  • BuildKit配置文件全方位调优:从入门到精通实战手册
  • Netcode for GameObjects Boss Room 多人RPG战斗(19)
  • 深度学习优化器算法巧思速览
  • macOS上优雅运行Docker容器
  • XXL-JOB分布式任务调度
  • MYSQL与B+树与索引相关面试题
  • PostgreSQL pgvector扩展Windows环境完整安装指南
  • Steam游戏挂机神器:3分钟学会自动刷时长和交易卡
  • F5 Big-IP by SNMP.硬件负载均衡