是否可以在 Delphi 中进行面向方面的编程?我会对本机支持以及第三方解决方案感兴趣。
我没有想用 AOP 解决的具体问题,只是对学习 AOP 感兴趣。
AOP 依赖于两件事:
这通常称为代码编织。它是更大范围的程序转换研究中的一个专业。
JIT 编译语言比静态编译程序有更多的代码编织选项,因为更多信息保留在字节码/IL 中。它们还支持反射,它提供了在运行时操作代码的能力。
Delphi.NET 和 Prism 与任何其他 .NET 语言一样可以访问这些功能。
我知道有两个用于 Delphi Win32 的 AOP 框架。第一个是MeAOP,已经提到过。第二个是基础设施。这两个项目都采用了与 AOP 类似的方法。它们结合使用 RTTI 和巧妙的指针操作来拦截方法调用,因此您可以在方法调用之前或之后运行其他代码。您将横切功能定义为框架的 AOP 类的子类。您通过将方法名称作为字符串参数传递给 AOP 框架来注册要拦截的方法。
这两个框架仍在积极开发中,实际上范围比 AOP 更大。不幸的是,文档有些稀疏(在 Infra 的情况下,主要是葡萄牙语)
另一个项目在 2004 年通过源代码编织尝试 AOP,并取得了一些成功。基本上,他们在一个名为 DMS 的通用程序转换工具之上构建了一个方面编织器,并在编译之前用它来将代码注入到 delphi 源文件中。他们面向方面的语言主要受 AspectJ 的影响。
http://www.gray-area.org/Research/GenAWeave/有原始论文和演示文稿的链接,以及一些转换过程的视频。
也可以使用运行时代码检测来完成此操作。它是一些分析器使用的一种技术,用于在不修改原始源代码的情况下将计数器和堆栈跟踪注入正在运行的代码中。可以使用类似的技术将横切关注点注入静态编译的可执行文件。PinTool项目就是一个很好的例子。
The DSharp library features AOP:
https://bitbucket.org/sglienke/dsharp
More info can be found at: https://bitbucket.org/sglienke/dsharp
Also have a look at TVirtualMethodInterceptor.
It's in the RTL since Delphi 2010 and allows you to do OnBefore, OnAfter, etc. calls on all virtual methods on a class.
This call alone should cover must of what you need using Rtti, not weaving which is much faster than run-time weaving.
Delphi 后期版本中的 ClassHelper 允许一些非常有限级别的 AOP 类型行为。您可以使用 ClassHelpers 将行为注入其他类,而无需从它们继承。它允许覆盖现有方法,然后可选地调用该现有方法。
限制是您必须为特定类及其后代声明 ClassHelper。此外,一个类只能有一个 ClassHelper。
这些类似于 C# 中的扩展方法。