Delphi中的AOP支持

Mie*_*iel 12 delphi aop

是否可以在Delphi中进行面向方面编程?我会对原生支持以及第三方解决方案感兴趣.

我没有想要用AOP解决的具体问题,但我只是对学习AOP感兴趣.

Ken*_*ran 12

AOP取决于两件事:

  • 将附加代码注入现有代码单元的能力
  • 一种在应该注入代码的位置放置条件的机制.

这通常被称为代码编织.它是大型项目转型研究的专业化.

由于在字节码/ IL中保留了更多信息,因此JIT编译语言具有更多用于实现代码编织的选项,而不是静态编译的程序.它们还支持反射,它提供了在运行时操作代码的能力.

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项目就是一个很好的例子.


Jim*_*eth 4

Delphi 更高版本中的 ClassHelpers 允许一些非常有限级别的 AOP 类型行为。您可以使用 ClassHelpers 将行为注入到其他类中,而不需要从它们继承。它允许覆盖现有方法,然后有选择地调用该现有方法。

限制是您必须为特定类及其后代声明 ClassHelper。另外,一个类只能有一个 ClassHelper。

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