知识大全 在Delphi中应用AOP实现日志功能[2]

Posted 事件

篇首语:只有上不去的天,没有过不去的山。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 在Delphi中应用AOP实现日志功能[2]相关的知识,希望对你有一定的参考价值。

在Delphi中应用AOP实现日志功能[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  通过了一番讨论 我们一致认为这个应该用AOP的思想来解决 但怎样在Delphi中来实现AOP呢 修改整个程序框架是不可能的 我们只能在现有的基础上做

  正当我们要放弃的时候 突然想到了一个突破点 日志中记录的功能在程序实现的时候全部使用Action组件来做的 是否可以考虑在Action上面做文章呢?

  曙光啊 曙光!

  解决方式——瞒天过海

  通俗点理解AOP 就是将一段代码统一 插入 某一类地方 但像Delphi这样的语言是很难实现 插入 代码的这一功能 不过我们可以通过事件机制来实现同样的效果

  Action的执行代码都写在事件OnExecute中 如果能在执行事件之前和之后执行我想要的动作是不是就可以解决了?

procedure TModule acAction Execute(Sender: TObject);begin// do somethingend;

procedure TActionHook ReGISterAction(Action: TAction);begin// 记录Action与原始的OnExecute事件FActionList Add(Action);SetLength(FActionEvents Length(FActionEvents) + );FActionEvents[High(FActionEvents)] := Action OnExecute;// 瞒天过海 偷换事件Action OnExecute := HookActionExecute;end;

procedure TActionHook HookActionExecute(ASender: TObject);beginDoBeforeActionExecute(TAction(ASender));// 触发原始事件FActionEvents[FActionList IndexOf(ASender)](ASender);DoAfterActionExecute(TAction(ASender));end;

procedure TActionHook DoAfterActionExecute(Action: TAction);begin// 所有的Action执行完毕后调用此处FLog LogCommand(Action Caption);end;

  相关的UML图如下

  图略

  采用这样的方式后 很明显我们不需要将日志相关代码分散到系统的各个地方 只需要在一个统一的地方将所有Form上的Action组件注册到TActionHook中就可以了

  扩展思考

  在Delphi中可以通过事件的机制实现代码注入技术 当然同样在其他支持事件的语言中也可以实现 相比之下这种方法实现AOP比较简单 并且不需要在系统的整体结构上作什么调整 完全通过语言层面支持

  例子中针对Action的组件来处理日志功能 将TActionHook扩展之后可以将其他的控件操作也通过这套机制记录到日志中

  很多同行们都埋怨自己做的是体力活 没什么技术含量 同样在刚开始的时候 我也认为这个任务是体力活 但是如果我们能勤于思考新的解决方法 体力活绝对能够变为技术活 只有这样才能不辜负 高科技 这个美誉啊

  上面介绍的方法肯定不是最好的 这次拿出来和大家分享 一方面是将自己的经验献给需要的朋友 另外也特别希望大家能给一点好的建议 一起交流 共同学习

cha138/Article/program/Delphi/201311/24868

相关参考

知识大全 对spring的aop理解

   问题   问题想要添加日志记录性能监控安全监测   最初解决方案   最初

知识大全 Spring AOP在DWR安全上的应用

SpringAOP在DWR安全上的应用  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &

知识大全 关于AOP的应用实例

关于AOP的应用实例  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  开发环境:Eclipse+J

知识大全 Spring AOP 实现原理与CGLIB应用

SpringAOP实现原理与CGLIB应用  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!    简

知识大全 在Delphi数据库应用程序中常见错误

在Delphi数据库应用程序中常见错误  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Delph

知识大全 在Delphi中开发使用多显示器的应用程序

在Delphi中开发使用多显示器的应用程序  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Wind

知识大全 Delphi中ScriptControl的高级应用

Delphi中ScriptControl的高级应用  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!在

知识大全 Delphi应用程序的应用(一)[2]

DELPHI基础教程:Delphi应用程序的应用(一)[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看

知识大全 Delphi应用程序的应用(二)[2]

DELPHI基础教程:Delphi应用程序的应用(二)[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看

知识大全 实现应用程序的文件拖放功能

  在Delphi中有许多控件支持拖放操作但仅限于应用程序内部而不能实现从Windows环境里向应用程序拖放文件本文将要介绍的就是如何用Delphi编写支持文件拖放的应用程序由于主要使用Windows