|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
中间码是基于一个虚拟机器。源代码是最高层的,理论上从源代码开始直接编译成本地码能提供最大优化的。而中间码只能是转译成本地码,效率上难免受到损耗。根据虚拟机器所设定的体系结构的特点,和本地机器的差异的多少。先说了局景,C#中为何要利用Aop,而我又是在那里利用Aop?
自己只是想拦阻实体类的Set的办法,然后在Set之前,挪用一下别的办法,把值赋给另外一个对象。
而我做的都是在实体类的基类里处置:
好比:
publicclassOrmBase
让一切承继这个基类的实体类都具有Orm操纵功效,再加上一个小小特别的请求处置,属性Set时,必要对另外一对象赋值。
假如说,我如许完成:在OrmBase中能够供应办法,让一切的子类的属性都如许操纵:
publicclassUsers:OrmBase
{
publicint_ID;
publicintID
{
get;
set
{
base.SetXX(value);
}
}
不外每一个实体都如许写,固然是啥没成绩,不外能简化的仍是简化。
在能寻求简便的天下里,固然更喜好简便的写法如:
publicintID{get;set;}
因而,间接在基类里间接拦阻子类set办法,在内里间接挪用SetXX就弄定了,怎样完成呢?又花了一天的工夫查材料研讨进修并完成。
为此,要拦阻,就得折腾Aop:
传统的Aop利用RealProxy,利用十分复杂,可是被忽悠的十分庞大,上面:
1:在要拦阻的类头上加个属性标识,同时承继自ContextBoundObject:
[AopAttribute]
publicclassOrmBase:ContextBoundObject
OK,在基类里加一个,如许一切子类也算被附加了,加上一个标识,就能够被拦阻了,那这个AopAttribute属性是啥?看上面
2:AopAttribute承继代办署理属性标识类,用来挂在要拦阻的类的头上:
classAopAttribute:ProxyAttribute
{
publicoverrideMarshalByRefObjectCreateInstance(TypeserverType)
{
AopProxyrealProxy=newAopProxy(serverType);
returnrealProxy.GetTransparentProxy()asMarshalByRefObject;
}
}
看,内里就两行,十分复杂,两头挪用了承继RealProxy的AopProxy类,AopProxy是甚么,怎样出来的?看上面
3:AopProxy类,就是拦阻的动静处置,先上个复杂版,免的年夜伙看不懂:
classAopProxy:RealProxy
{
publicAopProxy(TypeserverType)
:base(serverType)
{
}
publicoverrideIMessageInvoke(IMessagemsg)
{
//动静拦阻以后,就会实行这里的办法。
}
}
OK,复杂吧,就这么两个类,就能够完成拦阻了,不外重点就是这里拦阻以后的代码,稍为庞大点,一样平常照抄就好了,拦阻的代码以下:
if(msgisIConstructionCallMessage)//假如是机关函数,按本来的体例前往便可。
{
IConstructionCallMessageconstructCallMsg=msgasIConstructionCallMessage;
IConstructionReturnMessageconstructionReturnMessage=this.InitializeServerObject((IConstructionCallMessage)msg);
RealProxy.SetStubData(this,constructionReturnMessage.ReturnValue);
returnconstructionReturnMessage;
}
elseif(msgisIMethodCallMessage)//假如是办法挪用(属性也是办法挪用的一种)
{
IMethodCallMessagecallMsg=msgasIMethodCallMessage;
object[]args=callMsg.Args;
IMessagemessage;
try
{
if(callMsg.MethodName.StartsWith("set_")&&args.Length==1)
{
//这里检测到是set办法,然后应怎样挪用对象的别的办法呢?
}
objecto=callMsg.MethodBase.Invoke(GetUnwrappedServer(),args);
message=newReturnMessage(o,args,args.Length,callMsg.LogicalCallContext,callMsg);
}
catch(Exceptione)
{
message=newReturnMessage(e,callMsg);
}
returnmessage;
}
returnmsg;
为了挪用原始对象的别的办法,我花了近一天的工夫查材料,惋惜收集上并没有响应的信息,多半的人使用,都是引向一个别的办法(一个不必要挪用原始对象的办法)
今朝收集上Aop信息太少,C#的更少,关于怎样猎取原始对象,然后挪用原始对象的,找不到一篇相干文章,我特纠结。
因而,我按传统体例,想尽举措的想猎取到原始对象,再挪用,经由九九八十一招,仍是失利了。
有理由相信是能提供更出色的性能。很多平台无法支持复杂的编译器,因此需要二次编译来减少本地编译器的复杂度。当然可能做不到net网页编程编译器那么简易。 |
|