肉夹馍3.0版本更新:静态代码织入AOP组件的变化与影响

肉夹馍(https://GitHub.com/inversionhourglass/Rougamo)是一个通过静态代码织入方式实现AOP的组件。其主要特点是在编译时完成AOP代码织入,相比动态代理可以减少应用启动的初始化时间使得服务更快可用,同时还能对静态方法进行AOP操作。

正文

本次3.0版本的更新并没有带来重大的功能上线,而是改变了代码织入方式,这样的改动牵扯到一些现有功能。

代码织入方式变化

在3.0版本之前的版本中采用的是代码内嵌的方式进行织入。从3.0版本开始,采用代理调用的方式进行代码织入。这意味着将原方法拷贝为一个新方法$Rougamo_M,然后修改原方法进行代码织入后调用$Rougamo_M。

不同织入方法带来的影响

在之前的版本中,引入了ExMoAttribute来解决使用和不使用async/await语法所带来的差异。在3.0版本中,由于使用代理调用的方式,ExMoAttribute被标记为Obsolete并将在4.0版本中直接删除。

另外,3.0版本支持步入调试,而在之前的版本中无法进行步入调试。

async void 弱支持

在3.0版本中,对于async void方法的织入方式仍在讨论中。这种方法无法进行await操作,也就无法等待该方法实际执行完毕。为了让开发者参与讨论,已在GitHub发布了相关issue进行投票统计。

仅ref/out支持刷新参数

在3.0版本之后,由于织入代码方式的改变,刷新参数功能仅支持ref和out参数。

构造方法织入方式不变

由于构造方法较为特殊,readonly字段仅可在构造方法中初始化,所以无法使用代理调用的织入方式。这也表示使用肉夹馍代码织入的构造方法无法支持步入调试。

织入方式切换

新的编织方式涉及众多代码,代码织入部分的代码近乎重写。为了保证稳定性提供了降级配置,通过设置FodyWeavers.xml文件中Rougamo节点配置proxy-calling="false",将织入方式改回3.0版本之前的内嵌织入方式。需要注意的是,该配置仅为过渡配置,并将在4.0版本中移出并最终仅保留代理织入的方式。

其他更新

以下列出3.0版本相关的所有issue,有兴趣的可以直接移步GitHub查看issue中的回复。

  • #36 应用Rougamo的方法支持步入调试
  • #54 解决snupkg报checksum错误的问题,需直接依赖Fody,详见issue回复
  • #60 支持自定义AsyncMethodBuilder
  • #63 支持泛型Attribute
  • #65 修复特定Type类型无法作为MoAttribute构造方法参数
热门手游下载
下载排行榜