博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
我的一个自己写的更新缓存的aop实例
阅读量:5237 次
发布时间:2019-06-14

本文共 2197 字,大约阅读时间需要 7 分钟。

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

转载于:https://www.cnblogs.com/qisheng/archive/2013/04/25/3042618.html

你可能感兴趣的文章
状态模式-State Pattern(Java实现)
查看>>
全连接神经网络(DNN)
查看>>
httpd_Vhosts文件的配置
查看>>
php学习笔记
查看>>
28 hashlib 模块 logging 模块 和 configparser模块 functools模块的偏函数partial
查看>>
pdf预览(pdf.js)
查看>>
AutoCAD中static 和 instance class的区别
查看>>
普通求素数和线性筛素数
查看>>
React Router 4.0 基本使用
查看>>
作业完成2
查看>>
javascript练习-定义子类
查看>>
newinstance()和new
查看>>
Java中的StringTokenizer类
查看>>
数组 泛型 协变(转载)
查看>>
关于Java与Map的那点事
查看>>
LUA实例:查询优化技术之多级缓存
查看>>
[ USACO 2010 FEB ] Slowing Down
查看>>
error while loading shared libraries
查看>>
flex布局学习(三)
查看>>
工具方法: jQuery.方法() $.extend (小计)
查看>>