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

1 篇文章 0 订阅

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

文件说明: 1、压缩文件包含一个VS2005工程,内含四个项目。 2、第一个项目为DotNetAOP.SingleRealProxy,为使用RealProxy和ProxyAttribute实现的简单AOP实现 3、第二个项目为DotNetAOP.NestedRealProxy,为使用嵌套RealProxy实现多个消息截获后利用代理多处对消息进行处理,但由于一个对象有两个RealProxy会出异常,所以这个实现是不成功的,不过有兴趣的朋友可以对它进行少量修改,通过委拖或自定义的消息接收器来完成消息处理链。 4、第三个项目为DotNetAOP.MessageSinkWithRealProxy,为使用RealProxy调用MessageSink链来实现对消息附加多个关注者链。具体实现如下: a) Framework目录下为链式消息处理框架 b)TerminatorSink.cs为消息链的终结器,它需要提供一个Delegate来最终调用堆栈结构。 c)AOPProxyAttribute.cs继承自ProxyAttribute,在它的CreateInstance方法中,我们返回一个被MssageChainProxy代理的对象。 d)ObjectWithAspect.cs为需要AOP功能的类的基类,它从ContextBoundObject继承,并被应用了AOPProxyAttribute,这样就会使得它的对象自动被MessageChainProxy代理。 e)AspectAttribute.cs为所有要注入的Aspect的基类,它是静态类,需要子类提供CreateAspectSink方法。 f)MessageChainProxy.cs是最重要的类,它从RealProxy继承,其Invoke方法根据应用在对象身上的AspectAttribute构建一个以TerminatorSink结束的消息处理链,这样就使得多个Aspect得以一个接一个的处理消息。而且它实现了TerminatorSink所需的Delegate,完成与内存堆栈的交互。 g)Demo目录下为应用代码,实现一个处理器需要两个类,一个继承自IMessgeSink类,在SyncProcessMessage方法中实现对功能注入;还需要一个AspectAttribute的实现类,用于给MessageChainProxy提供MessageSink。我已经实现了两组处理器,可以以此为模板加入自定义功能的处理器。 5、第四个项目为DotNetAOP.ServerContextSink,为使用四种上下文接收器中的ServerContextSink来实现对消息附加多个关注者链。实现思路和上一项目类似,只是Sink注入通过继承自ContextAttribute的ObjectSinkChainAttribute建立新的上下文属性ServerContextSinkChainProperty,再由ServerContextSinkChainProperty组装接收器链来完成。 本系列文章主要讲述如何利用.NET的Remoting消息框架实现AOP 本系列文章试图实现三种AOP实现 本系列文章以示例代码为主,对一些概念和原理不会进行过于深入的讨论 这里不谈论AOP在现实开发中是否有必要,只停留在技术实现层面 我的实现可能并不成熟,请有实际应用经验的朋友指教 网络上有大量AOP的文章,本系列文章的目的是以简单的实现示例代码以达到供学习的目的 本系列实现的框架都以实现通过Attribute插入截获为目的 本系列代码看似简单,其实都是我专门去研究了一下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实现

 http://www.cnblogs.com/thinhunan/archive/2006/07/26/460370.html

 

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

http://www.cnblogs.com/thinhunan/archive/2006/07/26/460376.html

 

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

http://www.cnblogs.com/thinhunan/archive/2006/07/26/460382.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值