AOPProxy

using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Proxies;
using System.Runtime.Remoting.Messaging;
using System.Runtime.Remoting.Activation;
using System.Runtime.Remoting.Services;

namespace SharpRush.AOP.Support
{
    
/// <summary>
    
/// AOPProxy 的摘要说明。
    
/// </summary>

    public class AOPProxy:RealProxy
    
{
        MarshalByRefObject refObj;
        AOPAttribute _attribute;
        
/// <summary>
        
/// 
        
/// </summary>

        public AOPProxy()
        
{
            
//
            
// TODO: 在此处添加构造函数逻辑
            
//
        }


        
/// <summary>
        
/// 
        
/// </summary>
        
/// <param name="attribute"></param>
        
/// <param name="type"></param>
        
/// <param name="obj"></param>

        public AOPProxy(AOPAttribute attribute,Type type,MarshalByRefObject obj) : base(type)
        
{
            refObj
=obj;
            _attribute
=attribute;
        }


        
/// <summary>
        
/// 
        
/// </summary>
        
/// <param name="msg"></param>
        
/// <returns></returns>

        public override IMessage Invoke(IMessage msg)
        
{
            PreProcess(msg);

            IMessage returnMsg
=InvokeMessage(msg);

            PostProcess(returnMsg);

            
return returnMsg;
        }


        
/// <summary>
        
/// 
        
/// </summary>
        
/// <param name="msg"></param>

        private void PreProcess(IMessage msg)
        
{
            _attribute.PreProcess(msg);
        }


        
/// <summary>
        
/// 
        
/// </summary>
        
/// <param name="msg"></param>

        private void PostProcess(IMessage msg)
        
{
            _attribute.PostProcess(msg);
        }


        
/// <summary>
        
/// 
        
/// </summary>
        
/// <param name="msg"></param>
        
/// <returns></returns>

        IMessage InvokeMessage(IMessage msg)
        
{
            IMessage returnMsg;
            
if (msg is IConstructionCallMessage)
            
{
                IConstructionCallMessage ccm 
= (IConstructionCallMessage)msg;
                RemotingServices.GetRealProxy(refObj).InitializeServerObject(ccm);
                ObjRef oRef 
= RemotingServices.Marshal(refObj);
                RemotingServices.Unmarshal(oRef);

                returnMsg 
= EnterpriseServicesHelper.CreateConstructionReturnMessage
                    (ccm,(MarshalByRefObject)
this.GetTransparentProxy());
            }

            
else 
            
{
                IMethodCallMessage methodMsg 
= (IMethodCallMessage) msg;
                returnMsg 
= RemotingServices.ExecuteMessage(refObj, methodMsg);
            }


            
return returnMsg;
        }

    }

}

posted @ 2005-08-16 16:25  Martin XJ  阅读(294)  评论(0编辑  收藏  举报