news 2026/5/26 4:49:52

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/5/26 4:00:28

多智能体协同系统

多智能体协同系统的核心概念 多智能体协同系统(Multi-Agent Systems, MAS)通过多个自主智能体的交互实现复杂任务,广泛应用于机器人协作、自动驾驶、游戏AI等领域。核心特性包括分布式决策、通信协议、任务分配与冲突解决。典型应用案例 1. 无…

作者头像 李华
网站建设 2026/5/26 4:02:24

多角度关于人的本质的论述,你怎么思考?

第六章:多角度关于人的本质的论述人的本质,人和动物的区别是什么,此文可以参考。这个问题很深奥,历来人类试图回答。比如中国古代对于人,有善恶之分,但这显然不具有说服力。以下是马克思哲学关于人本质的思…

作者头像 李华
网站建设 2026/5/25 6:50:10

Flutter 实现一个容器内部元素可平移、缩放和旋转等功能(六)

Flutter 实现一个容器内部元素可平移、缩放和旋转等功能(六) Flutter: 3.35.6 前面有人提到在元素内部的那块判断怎么那么写的,看来对知识渴望的小伙伴还是有,这样挺好的。不至于说牢记部分知识,只需要大致了解一下有…

作者头像 李华
网站建设 2026/5/26 3:59:07

python作业4

a 56 b -18# 1. 按位与(&):对应位都为1则为1,否则为0 # 56: 00111000 # -18补码: 11101110 # 按位与: 00101000 → 十进制40 bit_and a & b print(f"按位与(&): {a} & {b} {bit_and}")# 2. 按位或(|):对应位有…

作者头像 李华
网站建设 2026/5/26 2:43:31

今天教大家免费使用先进的AI大模型,非常详细收藏这一篇就够了

为什么要使用ai模型? 用好ai可以解决你想做的事情比如数据录入、数据整理、数据分析、数据报告等等问题。只要你想好规则,他都可以给你生成,而且你要担心数据泄露问题,完全可以让他给你生成一个离线的app或者exe程序或者前端程序&…

作者头像 李华
网站建设 2026/5/26 2:43:29

边缘AI与端云协同架构

边缘AI与端云协同架构概述 边缘AI将人工智能模型部署在边缘设备(如手机、传感器、嵌入式设备)上,实现本地实时处理;端云协同通过边缘与云计算的协作,平衡计算负载、隐私与延迟。典型应用包括智能家居、工业检测、自动驾…

作者头像 李华