在前面的系列文章中,我介绍了消息、代理与aop的关系,这次将我自己实现的一个aop微型框架拿出来和大家交流一下。
aop的最基本功能就是实现特定的预处理和后处理,我通过代理实现了此微型框架。
先来看看构成此微型框架的4个.cs文件。
1.commondef.cs 用于定义最基本的aop接口
/************************************* commondef.cs **************************
using system;
using system.runtime.remoting.messaging ;
namespace enterpriseserverbase.aop
{
/// <summary>
/// iaopoperator aop操作符接口,包括前处理和后处理
/// 2005.04.12
/// </summary>
public interface iaopoperator
{
void preprocess(imessage requestmsg ) ;
void postprocess(imessage requestmsg ,imessage respond) ;
}
/// <summary>
/// iaopproxyfactory 用于创建特定的aop代理的实例,iaopproxyfactory的作用是使aopproxyattribute独立于具体的aop代理类。
/// </summary>
public interface iaopproxyfactory
{
aopproxybase createaopproxyinstance(marshalbyrefobject obj ,type type) ;
}
}
2. aopproxybase aop代理的基类,所有自定义aop代理类都从此类派生,覆写iaopoperator接口,实现具体的前/后处理 。
using system;
using system.runtime.remoting ;
using system.runtime.remoting.proxies ;
using system.runtime.remoting.messaging ;
using system.runtime.remoting.services ;
using system.runtime.remoting.activation ;
namespace enterpriseserverbase.aop
{
/// <summary>
/// aopproxybase 所有自定义aop代理类都从此类派生,覆写iaopoperator接口,实现具体的前/后处理 。
/// 2005.04.12
/// </summary>
public abstract class aopproxybase : realproxy ,iaopoperator
{
private readonly marshalbyrefobject target ; //默认透明代理
public aopproxybase(marshalbyrefobject obj ,type type) :base(type)
{
this.target = obj ;
}
#region invoke
public override imessage invoke(imessage msg)
{
bool useaspect = false ;
imethodcallmessage call = (imethodcallmessage)msg ;
//查询目标方法是否使用了启用aop的methodaopswitcherattribute
foreach(attribute attr in call.methodbase.getcustomattributes(false))
{
methodaopswitcherattribute mehodaopattr = attr as methodaopswitcherattribute ;
if(mehodaopattr != null)
{
if(mehodaopattr.useaspect)
{
useaspect = true ;
break ;
}
}
}
if(useaspect)
{
this.preprocess(msg) ;
}
//如果触发的是构造函数,此时target的构建还未开始
iconstructioncallmessage ctor = call as iconstructioncallmessage ;
if(ctor != null)
{
//获取最底层的默认真实代理
realproxy default_proxy = remotingservices.getrealproxy(this.target) ;
default_proxy.initializeserverobject(ctor) ;
marshalbyrefobject tp = (marshalbyrefobject)this.gettransparentproxy() ; //自定义的透明代理 this
return enterpriseserviceshelper.createconstructionreturnmessage(ctor,tp);
}
imethodreturnmessage result_msg = remotingservices.executemessage(this.target ,call) ; //将消息转化为堆栈,并执行目标方法,方法完成后,再将堆栈转化为消息
if(useaspect)
{
this.postprocess(msg ,result_msg) ;
}
return result_msg ;
}
#endregion
#region iaopoperator 成员
public abstract void preprocess(imessage requestmsg) ;
public abstract void postprocess(imessage requestmsg, imessage respond) ;
#endregion
}
}
新闻热点
疑难解答