转自 http://www.cnblogs.com/thinhunan/archive/2007/07/17/460370.html
通过RealProxy是最简单的方法,缺点是不能同时加入多个代理,否则会抛异常。
实现步骤:
1、实现RealProxy的继承类
2、实现应用上述实现的RealProxy类的ProxyAttribute
3、把上述实现的Attribute应用到ContextBoundObject实例上
 //MyProxy代码using System;
//MyProxy代码using System; using System.Runtime.Remoting;
using System.Runtime.Remoting; using System.Runtime.Remoting.Messaging;
using System.Runtime.Remoting.Messaging; using System.Runtime.Remoting.Proxies;
using System.Runtime.Remoting.Proxies; using System.Runtime.Remoting.Activation;
using System.Runtime.Remoting.Activation; using System.Runtime.Remoting.Services;
using System.Runtime.Remoting.Services; using System.Diagnostics;
using System.Diagnostics;
 namespace DotNetAOP.UsingRealProxy
namespace DotNetAOP.UsingRealProxy {
{ class MyProxy:RealProxy
    class MyProxy:RealProxy {
    { MarshalByRefObject _target = null;
        MarshalByRefObject _target = null;
 public MyProxy(Type type, MarshalByRefObject target):base(type)
        public MyProxy(Type type, MarshalByRefObject target):base(type) {
        { this._target = target;
            this._target = target; }
        }
 //覆写Invoke,处理RealProxy截获的各种消息,
        //覆写Invoke,处理RealProxy截获的各种消息, //此种方式最简捷,但不能截获远程对象的激活,好在我们并不是真的要Remoting
        //此种方式最简捷,但不能截获远程对象的激活,好在我们并不是真的要Remoting public override IMessage Invoke(IMessage msg)
        public override IMessage Invoke(IMessage msg) {
        { IMethodCallMessage call = (IMethodCallMessage)msg;
            IMethodCallMessage call = (IMethodCallMessage)msg; IConstructionCallMessage ctr = call as IConstructionCallMessage;
            IConstructionCallMessage ctr = call as IConstructionCallMessage;
 IMethodReturnMessage back = null;
            IMethodReturnMessage back = null;
 //构造函数,只有ContextBoundObject(Inherit from MarshalByRefObject)对象才能截获构造函数
            //构造函数,只有ContextBoundObject(Inherit from MarshalByRefObject)对象才能截获构造函数 if (ctr != null)
            if (ctr != null) {
            { Console.WriteLine("调用"+ctr.ActivationType.Name+"类型的构造函数");
                Console.WriteLine("调用"+ctr.ActivationType.Name+"类型的构造函数");
 RealProxy defaultProxy = RemotingServices.GetRealProxy(_target);
                RealProxy defaultProxy = RemotingServices.GetRealProxy(_target);
 //如果不做下面这一步,_target还是一个没有直正实例化被代理对象的透明代理,
                //如果不做下面这一步,_target还是一个没有直正实例化被代理对象的透明代理, //这样的话,会导致没有直正构建对象。
                //这样的话,会导致没有直正构建对象。 defaultProxy.InitializeServerObject(ctr);
                defaultProxy.InitializeServerObject(ctr);
 //本类是一个RealProxy,它可通过GetTransparentProxy函数得到透明代理
                //本类是一个RealProxy,它可通过GetTransparentProxy函数得到透明代理 back = EnterpriseServicesHelper.CreateConstructionReturnMessage(ctr, (MarshalByRefObject)GetTransparentProxy());
                back = EnterpriseServicesHelper.CreateConstructionReturnMessage(ctr, (MarshalByRefObject)GetTransparentProxy()); }
            } //MarshalByRefObject对象就可截获普通的调用消息,
            //MarshalByRefObject对象就可截获普通的调用消息, //MarshalByRefObject对象告诉编译器,不能将其内部简单的成员函数优化成内联代码,
            //MarshalByRefObject对象告诉编译器,不能将其内部简单的成员函数优化成内联代码, //这样才能保证函数调用都能截获。
            //这样才能保证函数调用都能截获。 else
            else {
            { Console.Write("调用成员函数:" + call.MethodName);
                Console.Write("调用成员函数:" + call.MethodName);
 back = RemotingServices.ExecuteMessage(_target, call);
                back = RemotingServices.ExecuteMessage(_target, call);
 Console.WriteLine(",返回结果为:" + back.ReturnValue.ToString());
                Console.WriteLine(",返回结果为:" + back.ReturnValue.ToString()); }
            }
 return back;
            return back;
 }
        } }
    } }
}
 using System;
using System; using System.Collections.Generic;
using System.Collections.Generic; using System.Text;
using System.Text; using System.Runtime.Remoting.Proxies;
using System.Runtime.Remoting.Proxies;
 namespace DotNetAOP.UsingRealProxy
namespace DotNetAOP.UsingRealProxy {
{ //从ProxyAttribute继承,自动实现RealProxy植入
    //从ProxyAttribute继承,自动实现RealProxy植入 [AttributeUsage(AttributeTargets.Class)]
    [AttributeUsage(AttributeTargets.Class)] class MyProxyAttribute:ProxyAttribute
    class MyProxyAttribute:ProxyAttribute {
    {
 //覆写CreateInstance函数,返回我们自建的代理
        //覆写CreateInstance函数,返回我们自建的代理 public override MarshalByRefObject CreateInstance(Type serverType)
        public override MarshalByRefObject CreateInstance(Type serverType) {
        { MarshalByRefObject obj = base.CreateInstance(serverType);
            MarshalByRefObject obj = base.CreateInstance(serverType); MyProxy proxy = new MyProxy(serverType, obj);
            MyProxy proxy = new MyProxy(serverType, obj); return (MarshalByRefObject)proxy.GetTransparentProxy();
            return (MarshalByRefObject)proxy.GetTransparentProxy(); }
        }
 }
    } }
}
 //MyCBO代码
//MyCBO代码 using System;
using System; using System.Collections.Generic;
using System.Collections.Generic; using System.Text;
using System.Text;
 namespace DotNetAOP.UsingRealProxy
namespace DotNetAOP.UsingRealProxy {
{ [MyProxy]
    [MyProxy] class MyCBO:ContextBoundObject
    class MyCBO:ContextBoundObject {
    { public int Add(int a, int b)
        public int Add(int a, int b) {
        { return a + b;
            return a + b; }
        } public int Divide(int a, int b)
        public int Divide(int a, int b) {
        { return a / b;
            return a / b; }
        } }
    } }
}
 //测试代码
//测试代码 using System;
using System; using System.Collections.Generic;
using System.Collections.Generic; using System.Text;
using System.Text;
 namespace DotNetAOP
namespace DotNetAOP {
{ class Program
    class Program {
    { static void Main(string[] args)
        static void Main(string[] args) {
        { UsingRealProxy.MyCBO cbo = new DotNetAOP.UsingRealProxy.MyCBO();
            UsingRealProxy.MyCBO cbo = new DotNetAOP.UsingRealProxy.MyCBO(); cbo.Add(1, 2);
            cbo.Add(1, 2); Console.ReadLine();
            Console.ReadLine(); }
        } }
    } }
}
我曾试图实现多个RealProxy嵌套代理对象,不过最后以失败告终,不过后面的两个实现都是可以应用多个截获的。
下载:嵌套RealProxy框架的简单实现 这个框架以失败告终,原因是一个对象不能有多个代理,奇怪的是RemotingProxy又可以,还有待研究。
需要上面单个RealProxy实现的请留下Email。
 
 
        
 
    

 
     
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号