利用消息机制实现.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组装接收器链来完成。