技术开发 频道

基于Remoting透明代理的AOP实现


【IT168技术文档】


  由于某些原因,这2天又拿起了关于AOP方面的资料来学习下。每一次的学习,都有更多的一些认识。在.Net下基于Remoting的实现,应该算是能“最大发挥“的实现了:),动态织入的实现,让其灵活而强大,当然也有其缺陷,比如方法调用要被拦截的类必须继承与 ContextBoundObject对象,对于单继承的C#而言,缺陷不小!

  参考了Bruce Zhang blog上的AOP资源SqlCenter中AOP实现,自己写了一个小程序,实现了方法调用前后的拦截,仅仅是个toy而已!

  实现一个计算器,能够进行2个int类型数据计算,通过子类实现具体算法,当然也是非常简单的+-*/
public abstract class Calculator:ContextBoundObject { public virtual int Perform(int a ,int b) { return -1; } } 给出2个实现,加法和减法计算 public class AddCalculator:Calculator { public override int Perform(int a ,int b) { return a + b; } } public class SubCalculator:Calculator { public override int Perform(int a ,int b) { return a-b; } }
  现在在这个基础上,我要记录下调用过程,已经一些描述信息,ok,这里就是利用AOP的开始:)

  请注意,上面是啥?是的,上面的实现是我的主要任务(核心关注)。出现AOP代码了吗?没有!(当然你也许会说Calculator继承了ContextBoundObject:) ,完全有理!)

  不管,继续我们的实现。下面就是我基于透明代理的一些实现:
public class LogProxy:RealProxy { MarshalByRefObject myMarshalByRefObject; [PermissionSet(SecurityAction.LinkDemand)] public LogProxy(Type myType):base(myType) { myMarshalByRefObject = (MarshalByRefObject)Activator.CreateInstance((myType)); } [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags=SecurityPermissionFlag.Infrastructure)] public override IMessage Invoke(IMessage msg) { IMethodCallMessage call = (IMethodCallMessage) msg; //方法开始 Start(call); IMethodReturnMessage back = null; back = RemotingServices.ExecuteMessage(myMarshalByRefObject, call); //方法调用完成 End(ref back); return back; } private void Start(IMethodCallMessage call) { /* 模拟给出对方法调用的描述 */ Console.WriteLine("Start...."); Console.WriteLine("Method:"+call.MethodName.ToString()); Console.Write("\t"); for(int i =0 ;i<call.Args.Length;i++) Console.Write("The Args Is:{0},",call.Args[i]); Console.WriteLine(""); } public void End(ref IMethodReturnMessage call ) { //获取返回值 Console.WriteLine("\tThe Result is:{0}",call.ReturnValue); } } 下面请关注下client是如何调用的: public static void Main() { LogProxy p = new LogProxy(typeof(AddCalculator)); Calculator c = (AddCalculator)p.GetTransparentProxy(); int result = c.Perform(3,3); Console.ReadLine(); }
0
相关文章