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

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

通过RealProxy是最简单的方法,缺点是不能同时加入多个代理,否则会抛异常。

实现步骤:

1、实现RealProxy的继承类

2、实现应用上述实现的RealProxy类的ProxyAttribute

3、把上述实现的Attribute应用到ContextBoundObject实例上

// MyProxy代码
using  System; using  System.Runtime.Remoting; using  System.Runtime.Remoting.Messaging; using  System.Runtime.Remoting.Proxies; using  System.Runtime.Remoting.Activation; using  System.Runtime.Remoting.Services; using  System.Diagnostics; namespace  DotNetAOP.UsingRealProxy {     class MyProxy:RealProxy     {         MarshalByRefObject _target = null;         public MyProxy(Type type, MarshalByRefObject target):base(type)         {             this._target = target;         }         //覆写Invoke,处理RealProxy截获的各种消息,         //此种方式最简捷,但不能截获远程对象的激活,好在我们并不是真的要Remoting         public override IMessage Invoke(IMessage msg)         {             IMethodCallMessage call = (IMethodCallMessage)msg;             IConstructionCallMessage ctr = call as IConstructionCallMessage;             IMethodReturnMessage back = null;             //构造函数,只有ContextBoundObject(Inherit from MarshalByRefObject)对象才能截获构造函数             if (ctr != null)             {                 Console.WriteLine("调用"+ctr.ActivationType.Name+"类型的构造函数");                 RealProxy defaultProxy = RemotingServices.GetRealProxy(_target);                 //如果不做下面这一步,_target还是一个没有直正实例化被代理对象的透明代理,                 //这样的话,会导致没有直正构建对象。                 defaultProxy.InitializeServerObject(ctr);                 //本类是一个RealProxy,它可通过GetTransparentProxy函数得到透明代理                 back = EnterpriseServicesHelper.CreateConstructionReturnMessage(ctr, (MarshalByRefObject)GetTransparentProxy());             }             //MarshalByRefObject对象就可截获普通的调用消息,             //MarshalByRefObject对象告诉编译器,不能将其内部简单的成员函数优化成内联代码,             //这样才能保证函数调用都能截获。             else             {                 Console.Write("调用成员函数:" + call.MethodName);                 back = RemotingServices.ExecuteMessage(_target, call);                 Console.WriteLine(",返回结果为:" + back.ReturnValue.ToString());             }             return back;         }     } }
// MyProxyAttribute
using  System; using  System.Collections.Generic; using  System.Text; using  System.Runtime.Remoting.Proxies; namespace  DotNetAOP.UsingRealProxy {     //从ProxyAttribute继承,自动实现RealProxy植入     [AttributeUsage(AttributeTargets.Class)]     class MyProxyAttribute:ProxyAttribute     {         //覆写CreateInstance函数,返回我们自建的代理         public override MarshalByRefObject CreateInstance(Type serverType)         {             MarshalByRefObject obj = base.CreateInstance(serverType);             MyProxy proxy = new MyProxy(serverType, obj);             return (MarshalByRefObject)proxy.GetTransparentProxy();         }     } }
// MyCBO代码
using  System; using  System.Collections.Generic; using  System.Text; namespace  DotNetAOP.UsingRealProxy {     [MyProxy]     class MyCBO:ContextBoundObject     {         public int Add(int a, int b)         {             return a + b;         }         public int Divide(int a, int b)         {             return a / b;         }     } }
// 测试代码
using  System; using  System.Collections.Generic; using  System.Text; namespace  DotNetAOP {     class Program     {         static void Main(string[] args)         {             UsingRealProxy.MyCBO cbo = new DotNetAOP.UsingRealProxy.MyCBO();             cbo.Add(12);             Console.ReadLine();         }     } }

我曾试图实现多个RealProxy嵌套代理对象,不过最后以失败告终,不过后面的两个实现都是可以应用多个截获的。 下载:嵌套RealProxy框架的简单实现 这个框架以失败告终,原因是一个对象不能有多个代理,奇怪的是RemotingProxy又可以,还有待研究。 需要上面单个RealProxy实现的请留下Email。 查看其它框架实现请转到此页

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

posted @ 2006-07-26 18:49 THIN 阅读(2886) 评论(15)   编辑 收藏 所属分类: OtherAOP
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值