利用消息机制实现.NET AOP(面向方面编程)--基本概念和实现

  1. 本系列文章主要讲述如何利用.NET的Remoting消息框架实现AOP
  2. 本系列文章试图实现三种AOP实现
  3. 本系列文章以示例代码为主,对一些概念和原理不会进行过于深入的讨论
  4. 这里不谈论AOP在现实开发中是否有必要,只停留在技术实现层面
  5. 我的实现可能并不成熟,请有实际应用经验的朋友指教
  6. 网络上有大量AOP的文章,本系列文章的目的是以简单的实现示例代码以达到供学习的目的
  7. 本系列实现的框架都以实现通过Attribute插入截获为目的 
  8. 本系列代码看似简单,其实都是我专门去研究了一下Remoting才实现的,因为我原来对Remoting没有什么了解,所以请不要扔砖

一、基本概念

1、消息:消息是.NET Remoting应用程序中数据以及堆栈调用传递的基础单元。消息可以用来把堆栈调用转换成易于使用的.NET对象,使我们可以像使用其它.NET对象一样来管理程序中的各种函数调用。消息都派生自IMessage接口,IMessage接口有一个名为Properties的IDictionary属性,用来保存消息的各种信息,IMessage的继承类根据各自的特点封装Properties,以方便使用,比如IMethodReturnMessage就有ReturnValue属性来访问返回结果。IMessage的子类有:IMethodMessage,IMethodReturnMessage,IMethodCallMessage,IConstructionCallMessage,IConstructionReturnMessage,ReturnMessage。大家看看它们的名字就知道各是干什么用的。

2、代理:代理分两类,透明代理(TransparentProxy)和真实代理(RealProxy),透明代理在不受我们控制,真实代理可用于在自定义代码中控制消息。透明代理主要是截获对象方法的调用,并把调用传递给它对应的真实代理。

3、MarshalByRefObject、ContextBoundObject。要截获对象的方法调用,必须是从这两个类继承的类。MarshalByRefObject告诉编译器,不要把这个类中的简单函数优化成内联代码,这样才能保证所有方法调用都能截获。ContextBoundObject对象绑定各自的上下文,这样的话对象一初始化,就会进行上下文检查,建立和绑定,这同时也使我们有机会干预对象的构造函数。

4、上下文绑定对象的消息接收链:上下文绑定对象的消息调用有一系列的消息接收器,最初调用消息发组代理理(ContextBoundObject默认有一个RemotingProxy真实代理),接着发给特使接收器链,并由EnvoyTerminatorSink发给客户端上下文接收链,再由ClientContextTerminatorSink把消息由客户端转发到服务端(目标对象端),服务器上下文接收器链收到消息,一直传到ServerContextTerminatorSink传给服务器对象接收器链,最后ObjectTerminatorSink把消息传给StackBuilderSink。(四种Sink的运行和调用方与被调用方所在的位置,四种Sink的相互作用有关,想深入了解的朋友可以写代码一一测试。)

二、三种实现

利用消息机制实现.NET AOP(面向方面编程)--通过RealProxy实现

利用消息机制实现.NET AOP(面向方面编程)--利用RealProxy和消息接收器实现多截获

利用消息机制实现.NET AOP(面向方面编程)--利用ServerContextSink实现多截获

posted @ 2006-07-26 18:35  Think  阅读(7411)  评论(6编辑  收藏  举报