捐赠 | 广告 | 注册 | 发布 | 上传 | 关于我们    
  沪ICP备05001939号 DELPHI盒子 | 盒子论坛 | 盒子文章 | 盒子问答悬赏 | 最新更新 | 论坛检索 | 下载中心 | 高级搜索    
  精品专区 | 繁體中文 | 奖励公告栏 | 直通车账号登陆 | 关闭GOOGLE广告 | 临时留言    
盒子资源分类
全部展开 - 全部合拢
Delphi AOP(Aspect Oriented Programming) Frame - MeAOP v0.5
关键字:DelphiAOP Featrure Aspect Oriented Programming MeAOP 代码注入
来 自:原创
平 台:Win9x,Win2k/XP/NT,Win2003 下载所需:0 火柴
深浅度:高级 完成时间:2006/5/14
发布者:riceball 发布时间:2006/5/14
编辑器:D7/D10 语  种:简体中文
分 类:对象 下载浏览:1320/16696
加入到我的收藏
下载错误报错
登陆以后才能下载
 用户名:
 密 码:
自动登陆(30天有效)
无图片
== 面向方面编程思想简介 ==
面向方面编程,正确的理解应该说是面向功能的一种编程方法。它作为对象建模的辅助,目的就是为了重用功能:
  1、将通用功能从不相关类之中分离出来;
  2、能够使得很多类共享一个功能,一旦功能发生变化,不必修改很多类,只要修改这个功能就可以了。

因此,我认为老外的定义并不妥当,故,我这里将其称之为 Feature 而不是 Aspect,也许说成是 Featrure Oriented Programming 更为恰当。

在我看来,它实现的核心思想就是对类(对象)的方法的拦劫和注入。

我的  AOP For Delphi Frame 是基于代码注入,核心也就是黑客的技能,对原始代码进行注入替换——通过对过程方法注入代码完成对方法的拦截处理!我对基于动态代理(对对象类进行包裹)的AOP形式不敢兴趣,这样性能太低,而代码注入则是速度最快的解决方案,内存开销也比动态代理小多了。

我希望我的AOP架构简单高效并且易于使用。随便提一句,我把我的AOP叫做MeAOP.

在MeAOP中,你不必去想什么joint, advise, cross-cut 等等莫名的概念。你只需要知道功能这个概念,
MeAOP的核心就是抽象出了定制功能类,你所做的开发就是围绕开发自己特有的功能类展开的。
你只要简单的调用 TMeCustomFeature 的类函数 AddTo 就可以将功能添加到你指定的类的方法上。 eg,
<code>
TMyFeature.AddTo(aClass, @aClass.aMethod, 'aMethod').
</code>

那么如何设计自己的功能类呢?
很简单,只需要在你的功能类中重载你需要拦截的位置的方法即可,如:BeforeExecute, AfterExecute 等等。
你的所有的功能类都应该从 TMeCustomFeature 派生.

注意:[Ver0.5] 现目前版本我只是实现了对于无参数的过程和方法(不包括有返回值函数)的支持。

<code>
  TMyFeature = class(TMeCustomFeature)
  protected
    {: 仅当返回为真才执行拦截的方法 MethodItem }
    { 如果你没有重载,它总是返回真.}
    function AllowExecute(Sender: TObject; MethodItem: TMeInterceptedMethodItem): Boolean;override;
    {: 在MethodItem被执行前被触发,发生在AllowExecute返回为真后 }
    procedure BeforeExecute(Sender: TObject; MethodItem: TMeInterceptedMethodItem);override;
    {: 在MethodItem被执行后被触发(即使MethodItem引发了异常也依然会被触发) }
    procedure AfterExecute(Sender: TObject; MethodItem: TMeInterceptedMethodItem);override;
    {: 执行MethodItem的过程中引发了异常后被触发。}
    procedure AfterException(Sender: TObject; MethodItem: TMeInterceptedMethodItem; E: Exception);override;
  end;
</code>

=== MeAOP 架构 ===
我的AOP 架构大致分为三层:
 1.底层核心:过程方法注入器: 提供最简单最轻巧的注入器(一个注入器大约仅占内存36个字节)
 2.中层核心:则是过程方法拦截器
    2.1. 只支持无参数的过程方法拦截器
    2.2. 支持带参数的过程方法拦截器
 3.上层核心:提供面向功能的编程类库,最终实现能够将很容易将新的功能附加到指定类的方法上。
Google
 
本站原创作品,未经作者许可,严禁任何方式转载;转载作品,如果侵犯了您的权益,请联系我们
龙脉加密锁 15元起 Grid++Report 报表 申请支付@网
 相关文章
没有相关文章
相关评论
共有评论26条 当前显示最后6条评论
ralf_jones 2006/5/24 11:16:24
DELPHI现在走在MDA的路上,可能不会去特别打AOP和GP的大旗了.而且一般也会将MDA和AOP归到GP的下面,那么有MDA也就可以了,基本上都是基于代码生成的OO技术. 不知道为什么要骂人啊? 唉...
wu_yanan2003 2006/5/25 21:06:34
    加我聊聊吧,riceball。我专门研究网络,系统底层,和三层技术。
    QQ:11718111, 注明:riceball
    我掌握类似的技术及代码。最近准备用这个原理做一个AOP框架。目的是想实现DELPHI下三层真正技术。功能如下:
    1.支持o/pmaping映射。
    2.安全性,与业务无关的多种底层通信协议(http, tcp, udp等)
    3.元数据代码生成工具。
    4.远程调用采用动态代理技术,AOP技术。
    5.类似于spring的框架简单实现。
    6.客户端UI自动生成功能。
    等等,如果有兴趣。呵呵。加我吧。
wu_yanan2003 2006/5/26 12:54:17
    http://www.delphibbs.com/keylife/iblog_show.asp?xid=22250
基本原理,附简单代码实现。要想达到riceball 的实用程度,还需修改。
riceball 2006/5/26 16:38:38
to ralf
  唉,Delphi 的开发小组没有发挥它们的效力,可能和Borland公司管理层有关,所以要想能有高效(高速,占用内存下)的类库,只有自己写咯。
  也是因此FastCode, FastMM,FastObj等等一系列为底层提速的Library才被Delphi Fans开发出来。这些本来应该是Delphi Team的工作。
  举着MDA的大旗,就不管效率了?MDA(模型驱动技术)只是辅助生成源代码的手段而已。它再怎么牛,最终还是落实到底层类库上。
  说起类的Model架构,就是气,看看后来Delphi Team写的WebService,一来就是Interface,SOAP,XML!它倒是一下满足需求了,可它也就只能干这个!
  能卸能装,才是一个好的架构,就像工厂的车间生产标准化的零件,将不同的零件装配起来,就能够实现不同的功能。每个零件都能独立出来,
  另作它用,这才是Delphi的精髓。
  Delphi 的MDA我没有用过,我觉得MM就很好用,但是它的缺点就是不支持Object和条件编译令人烦恼。
  我依稀记得 RemObjects 就是写了一个工具,用来自动生成远程方法的源代码。看得我想吐。

to wu_yanan
  对,我在0.50版本用的就是这个技术手段:
    1、保存方法的入口代码(5字节)
    2、修改函数方法的入口代码为跳转到我的方法入口
    3、执行我自己的处理
    4、恢复原来方法的入口代码
    5、执行原始的方法
    7、再次修改函数方法的入口代码为跳转到我的方法入口
  这种方式的缺陷就是无法支持多线程,因为拦截的过程根本无法重入!
  所以在0.53版本我想到预先打洞的方式,来解决这个问题。
  后来我又在0.54版本想到(就是这个周)一招,嘿嘿,不用打洞,也能重入了!!这下全部搞定!不过,注入器的大小增加到了64个字节,
  幸好还是比TObject类占用的空间少(TObject至少占用了76个字节VMT)。
  
  抱歉,我基本上很少上qq,除非是工作上的原因,时间紧阿。
  有什么需要问的就问吧。对我来说技术不是问题,难的只是架构!

  O/R map: 是数据库记录和对象的映射,开发BO对象我也有这个打算,我目前用的InstantObjects。
  通信协议:我从来没有想过开发这个玩意,我只要我的零件能勾挂上我想用的通信协议类库就可以了(RealThinClientSDK, synapse, indy[越开发越忘记它的初衷被我枪毙了])
  安全性:我已经有了一个非常棒的Cipher 类库,我在此基础上开发了非对称加密算法RSA。
  元数据代码生成工具: 似乎没有这个必要,不过在未来漫长的日子,也许我会考虑编写一个针对EXE文件的工具:用于静态编织(weave).
  客户端UI自动生成功能:这个我从2004年开始就在构思中,但是还是我觉得我的构思还不是很完美,架构始终是最烦人的。Delphi RTTI信息太弱了!大部分都要靠自己。
  Spring的框架: 你指的是哪一部分? Core(Bean Container)? AOP? ORM? DAO? Web? MVC? 它真就有这么好么?它的缺点和短处你都明白了?
wu_yanan2003 2006/5/30 10:02:19
   谢谢指教。
yeeler 2007/2/10 9:02:27
说了这么多 演示代码是干嘛的啊,我是菜鸟, 学习中....... 惭愧
我要发表评论 查看全部评论
 
  DELPHI盒子版权所有 1999-2023 V4.01 粤ICP备10103342号-1 更新RSS列表