R
riceball
Unregistered / Unconfirmed
GUEST, unregistred user!
=>著者:Riceball LEE>=
声 明
一、关于在Internet 网上转发本文件的声明
任何个人或者机构可以在 Internet 上自由的转发和引用。但转发过程中必须保证本文的完整性,不得进行任何的修改。并需注明出处!作者允许任何个人或者机构在本文的转发过程中附带其它的文件来描述、补充或者评价本文。但不得在本文的原文中修改。
二、关于在传统媒体上刊载、使用、引用本文件的声明
禁止在未经本人书面(含电子邮件) 许可的情况下在传统媒体上刊载、使用、引用文件的部分或全部内容。如果确需刊载、使用、引用本文件, 请用 EMail 与本人联系。
== 面向方面编程思想简介 ==
Summary:面向方面编程,正确的理解应该说是面向功能的一种编程方法。它作为对象建模的辅助,目的就是为了重用功能:
1、将通用功能从不相关类之中分离出来;
2、能够使得很多类共享一个功能,一旦功能发生变化,不必修改很多类,只要修改这个功能就可以了。
因此,我认为老外的定义并不妥当,故,我这里将其称之为 Feature 而不是 Aspect.
也许说成是 Featrure Oriented Programming 更为恰当。
在我看来,它实现的核心思想就是对类(对象)的方法的拦劫和注入。
=== 举例 ===
举例:假设有在一个应用系统中,有一个共享的数据必须被并发同时访问,首先,将这个数据封装在数据对象中,称为Data Class,同时,将有多个访问类,专门用于在同一时刻访问这同一个数据对象。
为了完成上述并发访问同一资源的功能,需要引入锁Lock的概念,也就是说,某个时刻,当有一个访问类访问这个数据对象时,这个数据对象必须上锁Locked,用完后就立即解锁unLocked,再供其它访问类访问。
使用传统的编程习惯,我们会创建一个抽象类,所有的访问类继承这个抽象父类,如下:
<code>
TCustomVisiter = Class
protected
procedure Locked();virtual;abstract;
procedure Unlocked();virtual;abstract;
procedure AccessDataObject();virtual;
end;
}
</code>
缺点:
* AccessDataObject()方法需要有“锁”状态之类的相关代码。
* Delphi只提供了单继承,因此具体访问类只能继承这个父类,如果具体访问类还要继承其它父类,比如另外一个如Visiter的父类,将无法方便实现。
* 重用被打折扣,具体访问类因为也包含“锁”状态之类的相关代码,只能被重用在相关有“锁”的场合,重用范围很窄。
仔细研究这个应用的“锁”,它其实有下列特性:
* “锁”功能不是具体访问类的首要或主要功能,访问类主要功能是访问数据对象,例如读取数据或更改动作。
* “锁”行为其实是和具体访问类的主要功能可以独立、区分开来的。
* “锁”功能其实是这个系统的一个纵向切面,涉及许多类的方法。
因此,一个新的程序结构应该是关注系统的纵向切面,例如这个应用的“锁”功能,这个新的类就是 Feature(功能)
在这个应用中,“锁”这个功能(Feature)应该有以下职责:
* 对被访问对象实现加锁或解锁功能。
* 保证所有在修改数据对象的操作之前能够调用lock()加锁,在它使用完成后,调用unlock()解锁。
“锁”这个功能(Feature)类似于如下的代码:
<code>
TLockFeature = Class(TMeCustomFeature)
protected
procedure Locked();virtual;
procedure Unlocked();virtual;
function Islocked(): Boolean;virtual;
protected
function AllowExecute(Sender: TObject
MethodItem: TMeInterceptedMethodItem): Boolean;override;
procedure AfterExecute(Sender: TObject
MethodItem: TMeInterceptedMethodItem);override;
end;
function TLockFeature.AllowExecute(Sender: TObject
MethodItem: TMeInterceptedMethodItem): Boolean;
begin
Result := not IsLocked
//only not isLocked can be allow execute.
if Result then Locked;
end;
procedure TLockFeature.AfterExecute(Sender: TObject
MethodItem: TMeInterceptedMethodItem);
begin
Unlocked;
end;
</code>
设计好“锁”这个功能(Feature)后,只要将“锁”这个功能(Feature)添加你希望的类的相应方法上,该类的方法就自动加上了锁机制。
<code>
//将“锁”这个功能(Feature)添加到我们前面提到的TCustomVisiter.AccessDataObject
TLockFeature.AddTo(TCustomVisiter, @TCustomVisiter.AccessDataObject);
</code>
值得注意的是,由于我使用的是代码直接注入方式,所以“锁”这个功能(Feature)将只影响具体注入的那个类的方法,
对于其派生类不能施加影响,除非是在派生类的方法中调用了 inherited 方法。解决办法由二:
方法1:规定在派生类的方法中必须调用父类的方法:
<code>
TMyVisiter = Class
protected
procedure AccessDataObject();override;
end;
procedure TMyVisiter.AccessDataObject();
begin
inherited AccessDataObject();
.....
end;
</code>
方法2:将其添加到每一个具体需要该功能的类上。
<code>
TLockFeature.AddTo(TMyVisiter, @TMyVisiter.AccessDataObject);
TLockFeature.AddTo(TOtherVisiter, @TOtherVisiter.AccessDataObject);
</code>
=== AOP应用范围 ===
凡是能够将功能抽象出来,独立于对象存在的,都是AOP的应用范畴:
|| * Authentication || 权限功能 ||
|| * Caching || 缓存 ||
|| * Context passing || 内容传递 ||
|| * Error handling || 错误处理 ||
|| * Lazy loading || 懒加载 ||
|| * Debugging || 调试 ||
|| * logging, tracing || 记录跟踪 ||
|| * profiling || 性能评估 ||
|| * monitoring || 监视 ||
|| * Performance optimization || 性能优化 ||
|| * Persistence || 持久化 ||
|| * Resource pooling || 资源池 ||
|| * Synchronization || 同步 ||
|| * Transactions || 事务 ||
|| * RPC || 远程过程方法调用 ||
== My AOP For Delphi Frame - MeAOP ==
我的 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.底层核心:过程方法注入器: 提供最简单最轻巧的注入器(一个注入器大约仅占内存32个字节)
2.中层核心:则是过程方法拦截器
2.1. 只支持无参数的过程方法拦截器
2.2. 支持带参数的过程方法拦截器
3.上层核心:提供面向功能的编程类库,最终实现能够将很容易将新的功能附加到指定类的方法上。
==== 底层核心(注入器) ====
包括底层的函数库和注入器。
===== 函数库 =====
单元: uMeTypInfo
提供了对 VMT(虚方法表), DMT(动态方法表), PMT(发布的方法表) 表的类型结构,以及访问相应函数。
提供对各类方法的地址查找访问的函数。
提供直接读取修改程序内存的函数。
状态:已完成(初测通过:仅限于我用到的函数)。
===== 过程方法注入器:TMeInjector =====
TMeInjector 提供最简单最轻巧最易于使用维护的注入器(一个注入器大约仅占内存36个字节)。
状态:已完成(初测通过)。
==== 中层核心(拦截器) ====
===== 基本拦截器 =====
是无参数的过程方法拦截器,它是最底层的拦截器原型抽象,只支持无参数的方法和过程,是AOP的核心类。
状态:已完成(基本测试通过)。
===== 拦截器 =====
支持带参数的过程方法拦截器
状态:设计构思阶段。
难点:参数,调用约定
==== 上层核心(面向功能类库) ====
提供面向功能的编程类库,最终实现能够将很容易将新的功能附加到指定类的方法上。
状态:设计构思阶段。
===== TMeCustomFeature =====
这是 MeAOP 的核心类,所有的功能类都应该从 TMeCustomFeature 派生.
在MeAOP中,你不必去想什么joint, advise, cross-cut 等等莫名的概念。你只需要知道功能这个概念,
MeAOP的核心就是抽象出了定制功能类,你所做的开发就是围绕开发自己特有的功能类展开的。
你只要简单的调用 TMeCustomFeature 的类函数 AddTo 就可以将功能添加到你指定的类的方法上。 eg,
<code>
TMyFeature.AddTo(aClass, @aClass.aMethod, 'aMethod').
</code>
<code>
TMeCustomFeature = class
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;
public
{: Add the feature to a procedure. }
class function AddTo(aProcointer
const aProcName: string): TMeCustomInterceptor
overload;
{: Add the feature to a method. }
class function AddTo(aClass: TClass
aMethod: Pointer
const aMethodName: string): TMeCustomInterceptor
overload;
{: Add the feature to a published method. }
class function AddTo(aClass: TClass
aMethodName: String): TMeCustomInterceptor
overload;
{: remove the feature from the method or procedure. }
class function RemoveFrom(aClass: TClass
aMethod: Pointer): Boolean;overload;
{: remove the feature from the published method. }
class function RemoveFrom(aClass: TClass
aMethodName: String): Boolean
overload;
end;
</code>
那么如何设计自己的功能类呢?
很简单,只需要在你的功能类中重载你需要拦截的位置的方法即可,如:BeforeExecute, AfterExecute 等等。
<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 下载 ===
Current Version: 0.5.0.0
+ 实现了对于无参数的过程和方法(不包括有返回值函数)的支持。
* http://dev.cq118.com/UploadFiles/attachments/Delphi/AOP/Readme/MeAOPv05-1.rar (no src, D7 D10)
欢迎测试。我下周末才能来瞧瞧,如果有反馈的话。
声 明
一、关于在Internet 网上转发本文件的声明
任何个人或者机构可以在 Internet 上自由的转发和引用。但转发过程中必须保证本文的完整性,不得进行任何的修改。并需注明出处!作者允许任何个人或者机构在本文的转发过程中附带其它的文件来描述、补充或者评价本文。但不得在本文的原文中修改。
二、关于在传统媒体上刊载、使用、引用本文件的声明
禁止在未经本人书面(含电子邮件) 许可的情况下在传统媒体上刊载、使用、引用文件的部分或全部内容。如果确需刊载、使用、引用本文件, 请用 EMail 与本人联系。
== 面向方面编程思想简介 ==
Summary:面向方面编程,正确的理解应该说是面向功能的一种编程方法。它作为对象建模的辅助,目的就是为了重用功能:
1、将通用功能从不相关类之中分离出来;
2、能够使得很多类共享一个功能,一旦功能发生变化,不必修改很多类,只要修改这个功能就可以了。
因此,我认为老外的定义并不妥当,故,我这里将其称之为 Feature 而不是 Aspect.
也许说成是 Featrure Oriented Programming 更为恰当。
在我看来,它实现的核心思想就是对类(对象)的方法的拦劫和注入。
=== 举例 ===
举例:假设有在一个应用系统中,有一个共享的数据必须被并发同时访问,首先,将这个数据封装在数据对象中,称为Data Class,同时,将有多个访问类,专门用于在同一时刻访问这同一个数据对象。
为了完成上述并发访问同一资源的功能,需要引入锁Lock的概念,也就是说,某个时刻,当有一个访问类访问这个数据对象时,这个数据对象必须上锁Locked,用完后就立即解锁unLocked,再供其它访问类访问。
使用传统的编程习惯,我们会创建一个抽象类,所有的访问类继承这个抽象父类,如下:
<code>
TCustomVisiter = Class
protected
procedure Locked();virtual;abstract;
procedure Unlocked();virtual;abstract;
procedure AccessDataObject();virtual;
end;
}
</code>
缺点:
* AccessDataObject()方法需要有“锁”状态之类的相关代码。
* Delphi只提供了单继承,因此具体访问类只能继承这个父类,如果具体访问类还要继承其它父类,比如另外一个如Visiter的父类,将无法方便实现。
* 重用被打折扣,具体访问类因为也包含“锁”状态之类的相关代码,只能被重用在相关有“锁”的场合,重用范围很窄。
仔细研究这个应用的“锁”,它其实有下列特性:
* “锁”功能不是具体访问类的首要或主要功能,访问类主要功能是访问数据对象,例如读取数据或更改动作。
* “锁”行为其实是和具体访问类的主要功能可以独立、区分开来的。
* “锁”功能其实是这个系统的一个纵向切面,涉及许多类的方法。
因此,一个新的程序结构应该是关注系统的纵向切面,例如这个应用的“锁”功能,这个新的类就是 Feature(功能)
在这个应用中,“锁”这个功能(Feature)应该有以下职责:
* 对被访问对象实现加锁或解锁功能。
* 保证所有在修改数据对象的操作之前能够调用lock()加锁,在它使用完成后,调用unlock()解锁。
“锁”这个功能(Feature)类似于如下的代码:
<code>
TLockFeature = Class(TMeCustomFeature)
protected
procedure Locked();virtual;
procedure Unlocked();virtual;
function Islocked(): Boolean;virtual;
protected
function AllowExecute(Sender: TObject
MethodItem: TMeInterceptedMethodItem): Boolean;override;
procedure AfterExecute(Sender: TObject
MethodItem: TMeInterceptedMethodItem);override;
end;
function TLockFeature.AllowExecute(Sender: TObject
MethodItem: TMeInterceptedMethodItem): Boolean;
begin
Result := not IsLocked
//only not isLocked can be allow execute.
if Result then Locked;
end;
procedure TLockFeature.AfterExecute(Sender: TObject
MethodItem: TMeInterceptedMethodItem);
begin
Unlocked;
end;
</code>
设计好“锁”这个功能(Feature)后,只要将“锁”这个功能(Feature)添加你希望的类的相应方法上,该类的方法就自动加上了锁机制。
<code>
//将“锁”这个功能(Feature)添加到我们前面提到的TCustomVisiter.AccessDataObject
TLockFeature.AddTo(TCustomVisiter, @TCustomVisiter.AccessDataObject);
</code>
值得注意的是,由于我使用的是代码直接注入方式,所以“锁”这个功能(Feature)将只影响具体注入的那个类的方法,
对于其派生类不能施加影响,除非是在派生类的方法中调用了 inherited 方法。解决办法由二:
方法1:规定在派生类的方法中必须调用父类的方法:
<code>
TMyVisiter = Class
protected
procedure AccessDataObject();override;
end;
procedure TMyVisiter.AccessDataObject();
begin
inherited AccessDataObject();
.....
end;
</code>
方法2:将其添加到每一个具体需要该功能的类上。
<code>
TLockFeature.AddTo(TMyVisiter, @TMyVisiter.AccessDataObject);
TLockFeature.AddTo(TOtherVisiter, @TOtherVisiter.AccessDataObject);
</code>
=== AOP应用范围 ===
凡是能够将功能抽象出来,独立于对象存在的,都是AOP的应用范畴:
|| * Authentication || 权限功能 ||
|| * Caching || 缓存 ||
|| * Context passing || 内容传递 ||
|| * Error handling || 错误处理 ||
|| * Lazy loading || 懒加载 ||
|| * Debugging || 调试 ||
|| * logging, tracing || 记录跟踪 ||
|| * profiling || 性能评估 ||
|| * monitoring || 监视 ||
|| * Performance optimization || 性能优化 ||
|| * Persistence || 持久化 ||
|| * Resource pooling || 资源池 ||
|| * Synchronization || 同步 ||
|| * Transactions || 事务 ||
|| * RPC || 远程过程方法调用 ||
== My AOP For Delphi Frame - MeAOP ==
我的 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.底层核心:过程方法注入器: 提供最简单最轻巧的注入器(一个注入器大约仅占内存32个字节)
2.中层核心:则是过程方法拦截器
2.1. 只支持无参数的过程方法拦截器
2.2. 支持带参数的过程方法拦截器
3.上层核心:提供面向功能的编程类库,最终实现能够将很容易将新的功能附加到指定类的方法上。
==== 底层核心(注入器) ====
包括底层的函数库和注入器。
===== 函数库 =====
单元: uMeTypInfo
提供了对 VMT(虚方法表), DMT(动态方法表), PMT(发布的方法表) 表的类型结构,以及访问相应函数。
提供对各类方法的地址查找访问的函数。
提供直接读取修改程序内存的函数。
状态:已完成(初测通过:仅限于我用到的函数)。
===== 过程方法注入器:TMeInjector =====
TMeInjector 提供最简单最轻巧最易于使用维护的注入器(一个注入器大约仅占内存36个字节)。
状态:已完成(初测通过)。
==== 中层核心(拦截器) ====
===== 基本拦截器 =====
是无参数的过程方法拦截器,它是最底层的拦截器原型抽象,只支持无参数的方法和过程,是AOP的核心类。
状态:已完成(基本测试通过)。
===== 拦截器 =====
支持带参数的过程方法拦截器
状态:设计构思阶段。
难点:参数,调用约定
==== 上层核心(面向功能类库) ====
提供面向功能的编程类库,最终实现能够将很容易将新的功能附加到指定类的方法上。
状态:设计构思阶段。
===== TMeCustomFeature =====
这是 MeAOP 的核心类,所有的功能类都应该从 TMeCustomFeature 派生.
在MeAOP中,你不必去想什么joint, advise, cross-cut 等等莫名的概念。你只需要知道功能这个概念,
MeAOP的核心就是抽象出了定制功能类,你所做的开发就是围绕开发自己特有的功能类展开的。
你只要简单的调用 TMeCustomFeature 的类函数 AddTo 就可以将功能添加到你指定的类的方法上。 eg,
<code>
TMyFeature.AddTo(aClass, @aClass.aMethod, 'aMethod').
</code>
<code>
TMeCustomFeature = class
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;
public
{: Add the feature to a procedure. }
class function AddTo(aProcointer
const aProcName: string): TMeCustomInterceptor
overload;
{: Add the feature to a method. }
class function AddTo(aClass: TClass
aMethod: Pointer
const aMethodName: string): TMeCustomInterceptor
overload;
{: Add the feature to a published method. }
class function AddTo(aClass: TClass
aMethodName: String): TMeCustomInterceptor
overload;
{: remove the feature from the method or procedure. }
class function RemoveFrom(aClass: TClass
aMethod: Pointer): Boolean;overload;
{: remove the feature from the published method. }
class function RemoveFrom(aClass: TClass
aMethodName: String): Boolean
overload;
end;
</code>
那么如何设计自己的功能类呢?
很简单,只需要在你的功能类中重载你需要拦截的位置的方法即可,如:BeforeExecute, AfterExecute 等等。
<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 下载 ===
Current Version: 0.5.0.0
+ 实现了对于无参数的过程和方法(不包括有返回值函数)的支持。
* http://dev.cq118.com/UploadFiles/attachments/Delphi/AOP/Readme/MeAOPv05-1.rar (no src, D7 D10)
欢迎测试。我下周末才能来瞧瞧,如果有反馈的话。