news 2026/7/17 11:59:37

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/7/16 13:20:39

9 个降AI率工具,MBA 必备避坑指南

9 个降AI率工具,MBA 必备避坑指南 AI降重工具:MBA论文的智能护航 MBA论文写作过程中,越来越多的学生开始依赖AI工具进行内容生成。然而,随着高校对AIGC率的严格管控,如何在保持论文原创性和学术规范的同时,…

作者头像 李华
网站建设 2026/7/17 6:39:11

Windows系统文件inetmib1.dll丢失损坏 下载修复方法

在使用电脑系统时经常会出现丢失找不到某些文件的情况,由于很多常用软件都是采用 Microsoft Visual Studio 编写的,所以这类软件的运行需要依赖微软Visual C运行库,比如像 QQ、迅雷、Adobe 软件等等,如果没有安装VC运行库或者安装…

作者头像 李华
网站建设 2026/7/17 2:43:54

Boost电路的右半平面零点

3.1、为什么存在这个右零点?(关键点:先储能再释放)答:右零点不是数学上的巧合,而是由Boost电路独特的能量传输方式决定的。其物理过程可以这样理解:假设电路已经稳定工作,此时我们突…

作者头像 李华
网站建设 2026/7/17 9:38:11

【全球AI伦理治理】

AI伦理治理框架的全球协同案例 欧盟《人工智能法案》提出基于风险分级的四层治理体系,禁止社会评分等高风险应用。OECD的AI政策观察站已收录全球700余项政策倡议,形成跨国数据库共享机制。新加坡的Model AI Governance Framework为亚洲企业提供可认证的伦…

作者头像 李华
网站建设 2026/7/14 11:26:45

毕业季必看!7款免费AI写论文神器实测,一站式搞定选题、大纲到降重

如果你是正在熬夜赶Deadline的毕业生,或是面临着科研压力、被导师催稿的研究生,又或是没钱又要写高质量论文的大学生,那么这篇文章简直就是为你量身打造的!在学术的道路上,我们都曾经历过论文选题的迷茫、写作过程的煎…

作者头像 李华
网站建设 2026/7/17 9:19:00

LLMs之Survey之Agent:《Measuring Agents in Production》翻译与解读

LLMs之Survey之Agent:《Measuring Agents in Production》翻译与解读 导读:本文是首个大规模系统性研究,深入剖析了生产环境中AI智能体的工程实践和技术方法。通过对306名从业者的调查和20个深度案例研究,该研究揭示了智能体采用的…

作者头像 李华