using System;
using System.Collections.Generic;using System.Linq;using System.Text;using System.Runtime.Remoting.Messaging;using System.Runtime.Remoting.Contexts;namespace AopDemo{ class Program { static void Main(string[] args) { var tst = new test(); tst.show(); tst.show2(); Console.ReadLine(); } } [AutoClearCache("CacheName")] public class test : ContextBoundObject { [AutoClearCacheMethod] public void show() { Console.WriteLine("调用本方法"); } public void show2() { Console.WriteLine("调用方法2"); } } public sealed class AutoClearCacheAop : IMessageSink { private IMessageSink nextSink; //保存下一个接收器 public AutoClearCacheAop(IMessageSink nextSink, string CacheName) { this.CacheName = CacheName; this.nextSink = nextSink; } /// IMessageSink接口方法,用于异步处理,我们不实现异步处理,所以简单返回null, /// 不管是同步还是异步,这个方法都需要定义 public IMessageCtrl AsyncProcessMessage(IMessage msg, IMessageSink replySink) { return null; } /// 下一个接收器 public IMessageSink NextSink { get { return nextSink; } } public IMessage SyncProcessMessage(IMessage msg) { IMessage retMsg = null; IMethodCallMessage call = msg as IMethodCallMessage; if (call == null || (Attribute.GetCustomAttribute(call.MethodBase, typeof(AutoClearCacheMethodAttribute))) == null) retMsg = nextSink.SyncProcessMessage(msg); else { Console.WriteLine(this.CacheName); //传递消息给下一个接收器 - > 就是指执行你自己的方法 retMsg = nextSink.SyncProcessMessage(msg); Console.WriteLine("拦截方法完"); } return retMsg; } private string CacheName; } /// <summary> /// 标注类某方法内所有数据库操作加入事务控制 /// </summary> [AttributeUsage(AttributeTargets.Class, AllowMultiple = false)] public sealed class AutoClearCacheAttribute : ContextAttribute, IContributeObjectSink { private string CacheName; /// <summary> /// 标注类某方法内所有数据库操作加入事务控制,请使用TransactionMethodAttribute同时标注 /// </summary> public AutoClearCacheAttribute(string CacheName) : base(CacheName) { this.CacheName = CacheName; } public IMessageSink GetObjectSink(MarshalByRefObject obj, IMessageSink next) { return new AutoClearCacheAop(next, this.CacheName); } } [AttributeUsage(AttributeTargets.Method, AllowMultiple = false)] public sealed class AutoClearCacheMethodAttribute : Attribute { }}