是否可以在Delphi中进行面向方面编程?我会对原生支持以及第三方解决方案感兴趣。
我没有一个我想用AOP解决的具体问题,但我只是对研究AOP感兴趣。
答案 0 :(得分: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项目就是一个很好的例子。
答案 1 :(得分:4)
Delphi更高版本中的ClassHelpers允许一些非常有限的AOP类型行为。您可以使用ClassHelper将行为注入其他类而不从它们降序。它允许重写现有方法,然后可选地调用现有方法。
限制是您必须为特定类及其后代声明ClassHelper。另外,一个类只能有一个ClassHelper。
这些类似于C#中的扩展方法。
答案 2 :(得分:4)
DSharp库具有AOP:
https://bitbucket.org/sglienke/dsharp
有关详细信息,请访问:https://bitbucket.org/sglienke/dsharp
另请查看TVirtualMethodInterceptor
它是自Delphi 2010以来的RTL中,允许您对类中的所有虚拟方法执行OnBefore,OnAfter等调用。
仅此调用应该涵盖使用Rtti所需的内容,而不是编织比运行时编织快得多。