Delphi中的AOP支持

12

在Delphi中进行面向切面编程(AOP)是否可能?我对本地支持以及第三方解决方案都感兴趣。

我没有特定的问题需要使用AOP解决,只是对研究AOP感兴趣。

3个回答

12
AOP有两个依赖:
  • 注入额外代码到现有代码单元的能力
  • 在何处注入代码的机制。
这通常称为代码织入。它是程序转换研究中的一个专业领域。
JIT编译语言比静态编译程序有更多实现代码织入的选项,因为字节码/IL中保留了更多信息。它们还支持反射,提供了在运行时操作代码的能力。
Delphi.NET和Prism与任何其他.NET语言一样具有访问这些功能的权限。
我知道两个适用于Delphi Win32的AOP框架。第一个是MeAOP,已经提到过了。第二个是Infra。这两个项目对AOP采用类似的方法。它们使用RTTI和巧妙的指针操作相结合来拦截方法调用,以便在方法调用之前或之后运行其他代码。您将交叉特性定义为框架AOP类的子类。通过将方法名称作为字符串参数传递给AOP框架来注册要拦截的方法。
这两个框架仍在积极开发中,实际上比AOP更广泛。不幸的是,文档有些稀少(Infra的情况下主要是葡萄牙语)。
另一个项目在2004年通过源代码织入尝试了AOP,并取得了一些成功。基本上,他们在通用程序转换工具DMS之上构建了一个方面编织器,并将其用于在编译之前将代码注入到Delphi源文件中。他们的面向方面的语言主要受AspectJ的影响。

http://www.gray-area.org/Research/GenAWeave/提供了原始论文和演示的链接,以及一些转换过程的视频。

也可能可以使用运行时代码插桩来实现这一点。这是一种由一些分析工具使用的技术,可以在不修改原始源代码的情况下将计数器和堆栈跟踪注入到正在运行的代码中。类似的技术可以用于在静态编译的可执行文件中注入横切关注点。PinTool项目就是一个很好的例子。


对于Delphi Prism,现在有开箱即用的AOP支持:http://prismwiki.codegear.com/en/Cirrus - Miel
AOP也可以使用影子虚拟方法表(VMT)来完成,编织不是唯一的选择。 - Johan

4

4

Delphi中的ClassHelpers可以实现一定程度的面向切面编程(AOP)。您可以使用ClassHelpers向其他类注入行为,而无需从它们继承。它允许重写现有方法,然后选择性地调用该现有方法。

限制在于您必须为特定类及其子类声明ClassHelper。此外,一个类只能有一个ClassHelper。

这与C#中的扩展方法类似。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接