montaque

小碗喝酒,小口吃肉

博客园 首页 新随笔 联系 订阅 管理
在.NET 中,可以通过CBO来实现简单的一个msg级别的AOP, 可以参考我以前写的一个简单例子. 采用AOP 的观点来 Log 所有方法的调用

昨天正好培训了一下Remoting, 其实可以用一个realproxy来wrap所有的方法调用,并且可以做一些拦截.为此参考一下简单的代码

事实上,包含了singleton,proxy模式,呵呵

    
class Demo:MarshalByRefObject
    
{
        
public void SayHello()
        
{
            Console.WriteLine(
"Hello,China");
        }


        
private Demo()
        
{
        }


        
private static Demo _ActInstance = new Demo();

        
public static Demo GetInstance()
        
{
            DemoProxy dp 
= new DemoProxy(typeof(Demo),_ActInstance);
            
return (Demo)dp.GetTransparentProxy();            
        }

    }



    
class DemoProxy : System.Runtime.Remoting.Proxies.RealProxy
    
{
        
public DemoProxy(Type tp,Demo target) : base(tp) { _target=target;}

        
private Demo _target;

        
public override System.Runtime.Remoting.Messaging.IMessage Invoke(System.Runtime.Remoting.Messaging.IMessage msg)
        
{
            Console.WriteLine(
">>> Inspecting Msg" + (msg as System.Runtime.Remoting.Messaging.IMethodCallMessage).MethodName); 
            
return System.Runtime.Remoting.RemotingServices.ExecuteMessage(_target, (System.Runtime.Remoting.Messaging.IMethodCallMessage)msg);
        }

    }

其实Demo一定要从MBR继承,参考了don box 写的.net essential, 他提到了从MBR继承,.net clr 保证改类的方法不会被inline,这样就可以保证代理的正常工作.  如果从CBO继承,当然CBO是继承自MBR, proxy可以正常工作, 而且这时候new 一个CBO对象的时候,实际上该实例就是一个透明代理.
posted on 2006-04-02 15:40  montaque  阅读(2035)  评论(9编辑  收藏  举报