wansenai / summer-boot

Summer Boot (async web framework)
https://crates.io/crates/summer-boot
Apache License 2.0
128 stars 27 forks source link

AOP 初步探索以及方案 #60

Open Jzow opened 2 years ago

Jzow commented 2 years ago

这块目前team里没有member负责研究,这是个公开讨论的问题,aop实现可以看看 crates.io 是否有一些crate支持

Yangandmore commented 2 years ago

以下是我的个人想法, 目前如果需要实现aop大致需要解决三个问题: 1.文件扫描,能完成指定宏扫描功能。用于发现或补充struct(假设)。 2.容器ioc,这些类型发现后创建这些类型对象,并保存到集合中。 3.切入点,完成了发现类型,创建该类型的对象,则需要将这些对象注入到指定的切片层中。此时就需要完成的切入功能,例如针对函数的:环绕,before,after,return、returnError。

完成上述实现后,既可以在此基础上完善项目的aop封装。

Jzow commented 2 years ago

容器ioc那一步是有点复杂,后面切入点 在方法之前 之后执行 可以通过属性宏

Yangandmore commented 2 years ago
image

这是最终需要实现的效果,可以看一下图片。 开发者调用过程如下:

  1. 使用create_aspect构建开发者自己的切点
  2. 使用before宏来设置切入点类型为前置,切入点的名字就是上面构建的切点
  3. 最后使用构建的切点,将函数切入到指定的目标函数中
Jzow commented 2 years ago

最后使用构建的切点,将函数切入到指定的目标函数中

before_test 这里是指定的函数名称吗,意味着定义任何name,#[package_lib::xxxxxx] 执行?

Yangandmore commented 2 years ago

是的,我的想法是,具有一个基础的aop功能,供开发者使用,而具体功能性的aop,则在这个基础上二次开发

Jzow commented 2 years ago

我们可以先把aop的之前之后可以先做好,织入点和环绕可以后面进行,但是我目前不清楚rust动态代理怎么实现

Jzow commented 2 years ago

则在这个基础上二次开发

之前执行和之后执行,有点像动态代理模式,我们后面需要考虑到实现动态代理嘛