肉夹馍(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构造方法参数