您的位置:首页 > 运维架构 > 网站架构

利用.NET Remoting基础架构中的真实代理/透明代理技术实现了不针对具体类型、具体方法的通用方法调用拦截机制

2007-06-15 13:31 1116 查看
using System.Runtime.Remoting;

using System.Runtime.Remoting.Messaging;

using System.Runtime.Remoting.Proxies;

[align=left]namespace TTester[/align]
[align=left]{[/align]
[align=left] /////////////////////////////////////////////////////////////////////////////////////////////////[/align]
[align=left] public class Calculator : MarshalByRefObject[/align]
[align=left] {[/align]
[align=left] private Calculator() { }[/align]
[align=left] [/align]
[align=left] public static Calculator CreateInstance()[/align]
[align=left] {[/align]
[align=left] MessageChainProxy realProxy = new MessageChainProxy(new Calculator());[/align]
[align=left] realProxy.AppendSinkType(typeof(LogAspect));[/align]
[align=left] Object transparentProxy = realProxy.GetTransparentProxy();[/align]
[align=left] return (Calculator)transparentProxy;[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] public int Add(int x, int y)[/align]
[align=left] {[/align]
[align=left] return x + y;[/align]
[align=left] }[/align]
}
/////////////////////////////////////////////////////////////////////////////////////////////////
[align=left] public class MessageChainProxy : RealProxy[/align]
[align=left] {[/align]
[align=left] private class TerminatorSink : IMessageSink[/align]
[align=left] {[/align]
[align=left] private MarshalByRefObject m_target;[/align]
[align=left] [/align]
[align=left] public TerminatorSink(MarshalByRefObject target)[/align]
[align=left] {[/align]
[align=left] this.m_target = target;[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] #region IMessageSink Members[/align]
[align=left] [/align]
[align=left] public IMessageCtrl AsyncProcessMessage(IMessage msg, IMessageSink replySink)[/align]
[align=left] {[/align]
[align=left] throw new Exception("The method or operation is not implemented.");[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] public IMessageSink NextSink[/align]
[align=left] {[/align]
[align=left] get { return null; }[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] public IMessage SyncProcessMessage(IMessage msg)[/align]
[align=left] {[/align]
[align=left] return RemotingServices.ExecuteMessage(m_target, msg as IMethodCallMessage);[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] #endregion[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] private MarshalByRefObject m_target;[/align]
[align=left] private IMessageSink headSink;[/align]
[align=left] [/align]
[align=left] public MessageChainProxy(MarshalByRefObject target)[/align]
[align=left] : base(target.GetType())[/align]
[align=left] {[/align]
[align=left] this.m_target = target;[/align]
[align=left] headSink = new TerminatorSink(m_target);[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] public override IMessage Invoke(IMessage msg)[/align]
[align=left] {[/align]
[align=left] return headSink.SyncProcessMessage(msg);[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] public void AppendSinkType(Type sinkType)[/align]
[align=left] {[/align]
[align=left] object[] ctorArgs = new object[] { headSink };[/align]
[align=left] IMessageSink newSink = (MessageSinkBase)Activator.CreateInstance(sinkType, ctorArgs);[/align]
[align=left] headSink = newSink;[/align]
[align=left] }[/align]
}
/////////////////////////////////////////////////////////////////////////////////////////////////////
[align=left] public abstract class MessageSinkBase : IMessageSink[/align]
[align=left] {[/align]
[align=left] private readonly IMessageSink m_nextSink;[/align]
[align=left] [/align]
[align=left] public MessageSinkBase(IMessageSink nextSink)[/align]
[align=left] {[/align]
[align=left] m_nextSink = nextSink;[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] #region IMessageSink Members[/align]
[align=left] [/align]
[align=left] public virtual IMessageCtrl AsyncProcessMessage(IMessage msg, IMessageSink replySink)[/align]
[align=left] {[/align]
[align=left] return m_nextSink.AsyncProcessMessage(msg, replySink);[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] public IMessageSink NextSink[/align]
[align=left] {[/align]
[align=left] get { return m_nextSink; }[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] public abstract IMessage SyncProcessMessage(IMessage msg);[/align]
[align=left] [/align]
[align=left] #endregion[/align]
}
//////////////////////////////////////////////////////////////////////////////////////////////////
[align=left] public class LogAspect : MessageSinkBase[/align]
[align=left] {[/align]
[align=left] public LogAspect(IMessageSink nextSink)[/align]
[align=left] : base(nextSink)[/align]
[align=left] {[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] public override IMessage SyncProcessMessage(IMessage msg)[/align]
[align=left] {[/align]
[align=left] IMethodCallMessage callMsg = msg as IMethodCallMessage;[/align]
[align=left] [/align]
[align=left] DateTime callTime = DateTime.Now;[/align]
[align=left] IMessage returnMsg = NextSink.SyncProcessMessage(msg);[/align]
[align=left] DateTime retTime = DateTime.Now;[/align]
[align=left] IMethodReturnMessage retMsg = returnMsg as IMethodReturnMessage;[/align]
[align=left] [/align]
[align=left] TimeSpan tspan = callTime.Subtract(retTime);[/align]
[align=left] string[] strs = callMsg.TypeName.Split(new char[] { ',', '.' });[/align]
[align=left] string clsName = null;[/align]
[align=left] if (strs.Length >= 2)[/align]
[align=left] {[/align]
[align=left] clsName = strs[1];[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] Console.WriteLine("[" + callTime + "] " +[/align]
[align=left] clsName +[/align]
[align=left] "." +[/align]
[align=left] callMsg.MethodName +[/align]
[align=left] "(" +[/align]
[align=left] callMsg.InArgs[0] +[/align]
[align=left] "," +[/align]
[align=left] callMsg.InArgs[1] +[/align]
[align=left] ") " +[/align]
[align=left] "-(" +[/align]
[align=left] tspan.TotalMilliseconds * 1000000 +[/align]
[align=left] "ns)-> " +[/align]
[align=left] retMsg.ReturnValue[/align]
[align=left] );[/align]
[align=left] [/align]
[align=left] return returnMsg;[/align]
[align=left] }[/align]
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐