毕业论文
您现在的位置: 框架 >> 框架发展 >> 正文 >> 正文

使用基于Roslyn的编译时AOP框架来

来源:框架 时间:2022/7/12
理想的代码优化方式

团队日常协作中,自然而然的会出现很多重复代码,根据这些代码的种类,之前可能会以以下方式处理

方式描述应用时可能产生的问题硬编码多数新手,或逐渐腐坏的项目会这么干,会直接复制之前实现的代码带来的问题显而易见的多,例如架构会逐渐随时间被侵蚀,例外越来越多提取函数提取成为函数,然后复用提取函数,然后复用,会比直接硬编码好些,但是仍然存在大量因“例外”而导致增加参数、增加函数重载的情况模板生成器CodeSmith/T4等因为是独立进程,所以对于读取用户代码或项目,实现难度较高,且需要现有用户项目先生成成功,再进行生成,或者是完全基于新项目代码片段VS自带的代码片段功能无法对复杂的环境或条件做出响应AOP框架面向切面编程,可以解决很多于用户代码前后增加操作的事情但是大多AOP框架都是基于透明代理形式实现的,对于相互调用较多的代码,但形成性能压力,而且因为要符合透明代理的规则,所以要提供相应的子类或接口。基于Rosyln的编译时插入代码

但以上这几种,AOP算是最理想的方式,但是感觉上还可以有更好的解决方案。

直到读到了这篇文章IntroducingC#SourceGenerators,文中提供了一种新的解决方案,即通过Roslyn的SourceGenerator在编译时直接读取当前项目中的语法树,处理并生成的新代码,然后在编译时也使用这些新代码。

那么如果可以读取现有代码的语法树,通过读取代码中的标记,那么在代码生成过程中是否就能直接生成。实现如下效果:项目中的源代码Program.cs

internalclassProgram{[Log]privatestaticintAdd(inta,intb){returna+b;}}

自动根据LogAttribute自动编译成的代码Program.g.cs

internalclassProgram{[Log]privatestaticintAdd(inta,intb){Console.WriteLine("Program.Add(int,int)开始运行.");intresult;result=a+b;Console.WriteLine("Program.Add(int,int)结束运行.");returnresult;}}

当然LogAttribute中需要去实现插入代码。然后项目自动使用新生成的Program.g.cs进行编译。这样就实现了基于编译时的AOP。

即实现以下流程

使用Metalama实现以上流程

经过寻找,发现其实已经有框架可以实现我上面说的流程了,也就是在编译时实现代码的插入。

转载请注明:http://www.0431gb208.com/sjszyzl/981.html