实现利用RealProxy调用MessageSink链来实现用Attribute灵活多截获AOP
本系列代码看似简单,其实都是我专门去研究了一下Remoting才实现的,因为我原来对Remoting没有什么了解,所以请不要扔砖
以下代码实现利用RealProxy调用MessageSink链来实现多截获
//TerminatorSink.cs
using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Activation;
using System.Runtime.Remoting.Contexts;
using System.Runtime.Remoting.Messaging;
using System.Runtime.Remoting.Proxies;
using System.Runtime.Remoting.Services;
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
namespace DotNetAOP.MessageSinkWithRealProxy.Framework
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
public class TerminatorSink:IMessageSink
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
public delegate IMessage MessageTerminatorDelegate(IMessage msg);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
private MarshalByRefObject _target;
private MessageTerminatorDelegate _delegate;
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public TerminatorSink(MarshalByRefObject target,MessageTerminatorDelegate d)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
_target = target;
_delegate = d;
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
IMessageSink 成员#region IMessageSink 成员
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public IMessage SyncProcessMessage(IMessage msg)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
if (_delegate == null)
return new ReturnMessage(new Exception("没有处理消息的委拖"), (IMethodCallMessage)msg);
else
return _delegate(msg);
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public IMessageSink NextSink
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
get
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return null ;
}
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public IMessageCtrl AsyncProcessMessage(IMessage msg, IMessageSink replySink)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
throw new NotImplementedException("TerminatorSink 不支持异步处理消息");
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
#endregion
}
}
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
//ObjectWithAspect.cs
using System;
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
namespace DotNetAOP.MessageSinkWithRealProxy.Framework
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
[AOPProxy]
public abstract class ObjectWithAspects:ContextBoundObject
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
}
}
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
//MessageChainProxy.cs
using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Activation;
using System.Runtime.Remoting.Contexts;
using System.Runtime.Remoting.Messaging;
using System.Runtime.Remoting.Proxies;
using System.Runtime.Remoting.Services;
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
namespace DotNetAOP.MessageSinkWithRealProxy.Framework
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
public class MessageChainProxy: RealProxy
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
private MarshalByRefObject _target;
private Type _type;
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public MessageChainProxy(Type type,MarshalByRefObject target): base(type)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
_target = target;
_type = type;
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public override IMessage Invoke(IMessage msg)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
IMessageSink sink = new TerminatorSink(_target,new TerminatorSink.MessageTerminatorDelegate(ProcessMessage));
AspectAttribute[] sinks = GetAspectAttributes(_type);
for( int i = sinks.Length - 1; i >= 0 ; i -- )
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
AspectAttribute aspectAttribute = sinks[i];
sink = aspectAttribute.CreateAspectSink(sink);
}
return sink.SyncProcessMessage(msg);
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
private AspectAttribute[] GetAspectAttributes(Type type)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return (AspectAttribute[])_type.GetCustomAttributes(typeof(AspectAttribute), true);
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
private IMessage ProcessMessage(IMessage msg)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
IMethodCallMessage call = msg as IMethodCallMessage;
IConstructionCallMessage ctr = call as IConstructionCallMessage;
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
IMethodReturnMessage back = null;
if (ctr != null)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
RealProxy defaultProxy = RemotingServices.GetRealProxy(_target);
defaultProxy.InitializeServerObject(ctr);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
back = EnterpriseServicesHelper.CreateConstructionReturnMessage
(ctr, (MarshalByRefObject)GetTransparentProxy());
}
else
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
back = RemotingServices.ExecuteMessage(_target, call);
}
return back;
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
}
}
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
//AsyncReplyHelperSink.cs
using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Activation;
using System.Runtime.Remoting.Contexts;
using System.Runtime.Remoting.Messaging;
using System.Runtime.Remoting.Proxies;
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
namespace DotNetAOP.MessageSinkWithRealProxy.Framework
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
class AsyncReplyHelperSink : IMessageSink
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
public delegate IMessage AsyncReplyHelperSinkDelegate(IMessage msg);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
IMessageSink _nextSink = null;
AsyncReplyHelperSinkDelegate _delegate = null;
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public AsyncReplyHelperSink(IMessageSink nextSink, AsyncReplyHelperSinkDelegate delegates)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
_nextSink = nextSink;
_delegate = delegates;
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
IMessageSink 成员#region IMessageSink 成员
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public IMessageCtrl AsyncProcessMessage(IMessage msg, IMessageSink replySink)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return null;
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public IMessageSink NextSink
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
get
{ return _nextSink; }
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public IMessage SyncProcessMessage(IMessage msg)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if (_delegate == null)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return new ReturnMessage(new Exception("没有处理消息委拖"), (IMethodCallMessage)msg);
}
else
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
IMessage back = _delegate(msg);
return _nextSink.SyncProcessMessage(back);
}
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
#endregion
}
}
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
//AspectAttribute.cs
using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Activation;
using System.Runtime.Remoting.Contexts;
using System.Runtime.Remoting.Messaging;
using System.Runtime.Remoting.Proxies;
using System.Runtime.Remoting.Services;
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
namespace DotNetAOP.MessageSinkWithRealProxy.Framework
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
public abstract class AspectAttribute:Attribute
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
public abstract IMessageSink CreateAspectSink(IMessageSink nextSink);
}
}
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
//AopProxyAttribute.cs
using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Activation;
using System.Runtime.Remoting.Contexts;
using System.Runtime.Remoting.Messaging;
using System.Runtime.Remoting.Proxies;
using System.Runtime.Remoting.Services;
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
namespace DotNetAOP.MessageSinkWithRealProxy.Framework
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
[AttributeUsage(AttributeTargets.Class)]
public class AOPProxyAttribute:ProxyAttribute
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public override MarshalByRefObject CreateInstance(Type serverType)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
MarshalByRefObject rawInstance = base.CreateInstance (serverType);
RealProxy rp = new MessageChainProxy(serverType, rawInstance);
return (MarshalByRefObject)rp.GetTransparentProxy();
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
}
}
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
//以上为框架代码
//以下为Demo代码
//Calculator.cs
using System;
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using DotNetAOP.MessageSinkWithRealProxy.Framework;
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
namespace DotNetAOP.MessageSinkWithRealProxy.Demo
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
[LogSink,Log2Sink]
public class Calculator:ObjectWithAspects
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
public Calculator()
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
}
public double Add(double a , double b)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return a + b;
}
public double Divide(double a, double b)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return a/b;
}
}
}
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
//Log2Sink.cs
using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Activation;
using System.Runtime.Remoting.Contexts;
using System.Runtime.Remoting.Messaging;
using System.Runtime.Remoting.Proxies;
using System.Runtime.Remoting.Services;
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using DotNetAOP.MessageSinkWithRealProxy.Framework;
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
namespace DotNetAOP.MessageSinkWithRealProxy.Demo
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
public class Log2Sink : IMessageSink
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
readonly IMessageSink _nextSink;
public Log2Sink(IMessageSink nextSink)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
_nextSink = nextSink;
}
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
IMessageSink 成员#region IMessageSink 成员
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public IMessage SyncProcessMessage(IMessage msg)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
IMethodCallMessage call = msg as IMethodCallMessage;
IConstructionCallMessage ctr = call as IConstructionCallMessage;
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
IMethodReturnMessage back = null;
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Console.WriteLine("第二个处理器");
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
back = (IMethodReturnMessage)NextSink.SyncProcessMessage(msg);
return back;
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public IMessageSink NextSink
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
get
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return _nextSink;
}
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public IMessageCtrl AsyncProcessMessage(IMessage msg, IMessageSink replySink)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
AsyncReplyHelperSink.AsyncReplyHelperSinkDelegate asd = new AsyncReplyHelperSink.AsyncReplyHelperSinkDelegate(AsyncProcessMessage);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
replySink = new AsyncReplyHelperSink(replySink, asd);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
if (_nextSink != null)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return _nextSink.AsyncProcessMessage(msg, replySink);
}
else
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return null;
}
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
#endregion
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
private IMessage AsyncProcessMessage(IMessage msg)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
IMethodCallMessage call = msg as IMethodCallMessage;
IConstructionCallMessage ctr = call as IConstructionCallMessage;
if (ctr != null)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
Console.WriteLine("构造函数:\t" + ctr.MethodName);
}
else
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
Console.WriteLine("普通方法:\t" + call.MethodName);
}
return msg;
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
}
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
[AttributeUsage(AttributeTargets.Class)]
public class Log2SinkAttribute : AspectAttribute
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
public override IMessageSink CreateAspectSink(IMessageSink nextSink)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return new Log2Sink(nextSink);
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
}
}
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
//LOgSink.cs
using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Activation;
using System.Runtime.Remoting.Contexts;
using System.Runtime.Remoting.Messaging;
using System.Runtime.Remoting.Proxies;
using System.Runtime.Remoting.Services;
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using DotNetAOP.MessageSinkWithRealProxy.Framework;
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
namespace DotNetAOP.MessageSinkWithRealProxy.Demo
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
public class Log2Sink : IMessageSink
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
readonly IMessageSink _nextSink;
public Log2Sink(IMessageSink nextSink)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
_nextSink = nextSink;
}
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
IMessageSink 成员#region IMessageSink 成员
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public IMessage SyncProcessMessage(IMessage msg)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
IMethodCallMessage call = msg as IMethodCallMessage;
IConstructionCallMessage ctr = call as IConstructionCallMessage;
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
IMethodReturnMessage back = null;
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Console.WriteLine("第二个处理器");
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
back = (IMethodReturnMessage)NextSink.SyncProcessMessage(msg);
return back;
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public IMessageSink NextSink
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
get
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return _nextSink;
}
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public IMessageCtrl AsyncProcessMessage(IMessage msg, IMessageSink replySink)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
AsyncReplyHelperSink.AsyncReplyHelperSinkDelegate asd = new AsyncReplyHelperSink.AsyncReplyHelperSinkDelegate(AsyncProcessMessage);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
replySink = new AsyncReplyHelperSink(replySink, asd);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
if (_nextSink != null)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return _nextSink.AsyncProcessMessage(msg, replySink);
}
else
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return null;
}
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
#endregion
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
private IMessage AsyncProcessMessage(IMessage msg)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
IMethodCallMessage call = msg as IMethodCallMessage;
IConstructionCallMessage ctr = call as IConstructionCallMessage;
if (ctr != null)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
Console.WriteLine("构造函数:\t" + ctr.MethodName);
}
else
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
Console.WriteLine("普通方法:\t" + call.MethodName);
}
return msg;
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
}
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
[AttributeUsage(AttributeTargets.Class)]
public class Log2SinkAttribute : AspectAttribute
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
public override IMessageSink CreateAspectSink(IMessageSink nextSink)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return new Log2Sink(nextSink);
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
}
}
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
//LogSinkAttribute.cs
using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Activation;
using System.Runtime.Remoting.Contexts;
using System.Runtime.Remoting.Messaging;
using System.Runtime.Remoting.Proxies;
using System.Runtime.Remoting.Services;
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using DotNetAOP.MessageSinkWithRealProxy.Framework;
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
namespace DotNetAOP.MessageSinkWithRealProxy.Demo
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
[AttributeUsage(AttributeTargets.Class)]
public class LogSinkAttribute:AspectAttribute
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
public override IMessageSink CreateAspectSink(IMessageSink nextSink)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return new LogSink(nextSink);
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
}
}
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
//Program.cs
using System;
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using DotNetAOP.MessageSinkWithRealProxy.Framework;
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
namespace DotNetAOP.MessageSinkWithRealProxy.Demo
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
/// Class1 的摘要说明。
/// </summary>
class Program
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main(string[] args)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
Calculator calc = new Calculator();
Console.WriteLine(calc.Add(1,2));
Console.WriteLine(calc.Divide(2,0));
// Test2 t2 = new Test2();
// t2.Te();
Console.ReadLine();
}
}
}
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
需要上面完整代码请留下Email。
年久,源代码已失,不能提供,请见谅
查看其它框架实现请转到此页
利用消息机制实现.NET AOP(面向方面编程)--通过RealProxy实现
利用消息机制实现.NET AOP(面向方面编程)--利用RealProxy和消息接收器实现多截获
利用消息机制实现.NET AOP(面向方面编程)--利用ServerContextSink实现多截获