【问题标题】:AOP support in DelphiDelphi 中的 AOP 支持
【发布时间】:2015-06-10 22:22:59
【问题描述】:

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

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

【问题讨论】:

    标签: delphi aop


    【解决方案1】:

    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 支持:prismwiki.codegear.com/en/Cirrus
    • AOP 也可以使用影子虚拟方法表 (VMT) 来完成,编织并不是唯一的选择。
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      DSharp 库具有 AOP:
      https://bitbucket.org/sglienke/dsharp
      更多信息请访问:https://bitbucket.org/sglienke/dsharp

      也可以看看TVirtualMethodInterceptor
      它自 Delphi 2010 起就在 RTL 中,允许您对类的所有虚拟方法进行 OnBefore、OnAfter 等调用。
      仅此调用就应该涵盖您使用Rtti 所需的内容,而不是比运行时编织快得多的编织。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-09-22
        • 1970-01-01
        • 2019-10-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多