zoukankan      html  css  js  c++  java
  • 利用消息机制实现.NET AOP(面向方面编程)--通过RealProxy实现 zz

    转自 http://www.cnblogs.com/thinhunan/archive/2007/07/17/460370.html 

    通过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;

            }

        }

    }
    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。

  • 相关阅读:
    Centos6.5环境中安装vsftp服务
    MySQL数据库的数据备份和恢复(导入和导出)命令操作语法【转】
    linux系统被入侵后处理经历【转】
    Linux lsof命令详解和使用示例【转】
    Oracle 表空间和用户权限管理【转】
    如何在 Linux 中找出最近或今天被修改的文件
    Linux 服务器系统监控脚本 Shell【转】
    1张图看懂RAID功能,6张图教会配置服务器【转】
    简析TCP的三次握手与四次分手【转】
    TCP协议中的三次握手和四次挥手(图解)【转】
  • 原文地址:https://www.cnblogs.com/ILove/p/1139324.html
Copyright © 2011-2022 走看看