news 2026/9/3 1:25:00

VonaJS AOP编程:魔术方法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
VonaJS AOP编程:魔术方法

在VonaJS框架中,AOP编程包括三方面:控制器切面、内部切面和外部切面。内部切面包括两个能力:AOP Method和魔术方法。这里我们简要介绍一下魔术方法的用法。

魔术方法

魔术方法,允许我们在 Class 内部通过__get__和__set__切入动态属性或方法

举例:Module Scope

为了让 IOC 容器的使用更加简洁和直观,VonaJS 推荐优先使用依赖查找策略,从而使用更少的装饰器函数,使用更少的类型标注。通过Module Scope对象访问模块提供的资源,就是践行依赖查找策略的机制之一

参见: 模块Scope

比如,模块 demo-student 中有一个 model student,用于 crud 操作。可以这样使用 model:

import { ModelStudent } from '../model/student.ts';

async findMany(params) {

const model = this.bean._getBean(ModelStudent);

return await model.selectAndCount(params);

}

使用魔术方法:

async findMany(params) {

return await this.scope.model.student.selectAndCount(params);

}

this.scope.model.xxx: 通过魔术方法动态获取当前模块中的 model 实例

举例:CRUD(魔术方法)

Vona ORM 采用魔术方法的机制进一步简化操作数据的代码

参见: CRUD(魔术方法)

比如,通过字段id查询学生信息,代码如下:

async findOne(id) {

return await this.scope.model.student.get({ id });

}

使用魔术方法:

async findOne(id) {

return await this.scope.model.student.getById(id);

}

系统自动从 method name getById中解析出参数id,然后调用实际的 CRUD 方法,这里就是: get({ id })

创建Class

可以在任何 Class 中实现魔术方法。下面,以 Service 为例,在模块 demo-student 中创建一个 Service color,代码如下:

如何创建 Service,参见: Service

import { BeanBase } from 'vona';

import { Service } from 'vona-module-a-bean';

@Service()

export class ServiceColor extends BeanBase {}

__get__

然后,通过__get__实现颜色值的获取

1. 添加代码骨架

在 VSCode 编辑器中,输入代码片段aopmagicget,自动生成代码骨架:

@Service()

export class ServiceColor extends BeanBase {

+ protected __get__(prop: string) {}

}

2. 实现自定义逻辑

@Service()

export class ServiceColor extends BeanBase {

+ private _colors = {

+ red: '#FF0000',

+ green: '#00FF00',

+ blue: '#0000FF',

+ };

protected __get__(prop: string) {

+ return this._colors[prop];

}

}

3. 添加类型合并

通过接口类型合并的机制为颜色提供类型定义

export interface ServiceColor {

red: string;

green: string;

blue: string;

}

4. 使用魔术方法

async test() {

console.log(this.scope.service.color.red);

console.log(this.scope.service.color.green);

console.log(this.scope.service.color.blue);

}

__set__

然后,通过__set__实现颜色值的设置

1. 添加代码骨架

在 VSCode 编辑器中,输入代码片段aopmagicset,自动生成代码骨架:

@Service()

export class ServiceColor extends BeanBase {

+ protected __set__(prop: string, value: any): boolean {

+ return false;

+ }

}

2. 实现自定义逻辑

@Service()

export class ServiceColor extends BeanBase {

private _colors = {

red: '#FF0000',

green: '#00FF00',

blue: '#0000FF',

+ black: '',

};

protected __set__(prop: string, value: any): boolean {

+ if (this._colors[prop] === undefined) return false;

+ this._colors[prop] = value;

+ return true;

}

}

如果为prop设置了值,返回true,否则返回false

3. 添加类型合并

通过接口类型合并的机制为颜色提供类型定义

export interface ServiceColor {

red: string;

green: string;

blue: string;

+ black: string;

}

4. 使用魔术方法

async test() {

this.scope.service.color.black = '#000000';

console.log(this.scope.service.color.black);

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/1 23:26:43

动态 IP 在爬虫、跨境电商如何避开封禁陷阱

在数据驱动的时代,无论是爬虫采集还是跨境电商运营,都绕不开一个现实问题: 👉 IP 被封禁。从搜索引擎、社交媒体、电商平台到广告投放系统,反爬与风控机制日益成熟,单一 IP、高频请求、异常行为都会迅速触发…

作者头像 李华
网站建设 2026/9/2 19:29:10

我的256天创作纪念日

【摘要】 256天,正好是2的8次方。在计算机的世界里,它代表一个完整的字节(Byte)。于我而言,这也是一个从零散的技术点,向完整的架构知识体系汇聚的关键节点。本文回顾了从Flowable与AI实战,到拿…

作者头像 李华
网站建设 2026/9/2 14:07:27

智能AI图像识别之建筑物立面缺陷识别 小区违规搭建识别 小区垃圾堆积识别 违规停车识别 建筑物墙面缺陷识别yolo数据集10314期

数据集说明本数据集为计算机视觉领域目标检测任务提供支持,以下从核心信息表格与数据三要素概述两方面展开说明。 类别14 类别(14)1_受损建筑立面 2_不存在/破损/堵塞的门 3_破损/无防护的窗户 4 入口处无无障碍设施 5_缺乏体育活动空间 破损…

作者头像 李华
网站建设 2026/9/2 1:48:53

java计算机毕业设计网络流行语资源库建设及实现 网络热词共享与语义标注平台 互联网流行语知识图谱与检索系统

计算机毕业设计网络流行语资源库建设及实现f3fk69 (配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。网络热词三天一迭代,传统人工收集、Excel 归档的方式早已追不上“造…

作者头像 李华
网站建设 2026/9/2 23:17:48

Tableau入门指南:大数据可视化从零到精通

Tableau入门指南:大数据可视化从零到精通 关键词:Tableau、数据可视化、大数据分析、仪表盘、数据故事 摘要:本文是为零基础读者设计的Tableau入门指南,通过“奶茶店经营分析”的真实场景,用通俗易懂的语言讲解Tableau的核心概念(数据源、维度/度量、可视化图表、仪表盘、…

作者头像 李华