亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

自己實現簡單的AOP(二)引入Attribute為方法指定增強對象

2019-11-14 15:50:33
字體:
來源:轉載
供稿:網友

話續前文 : 自己實現簡單的AOP(一)簡介 

 

在前一篇文章中,對AOP的實現方式做了一個簡單介紹。接下來,引入Attribute 為方法指定增強對象,由此實現一個簡單的AOP。

注意:指定的是增強對象,“對象”,也就是說Attribute標記,標記的其實是一個對象。由此、使用多態便可輕松實現增強的擴展。

 

自定義的Attribute 

    /// <summary>    /// 為方法標記指定的增強對象    /// <para>指定的增強,可通過代理 DelayPRoxy 織入</para>    /// </summary>    [AttributeUsage(AttributeTargets.Method, Inherited = false, AllowMultiple = false)]    public sealed class AdviceAttribute : Attribute    {        /// <summary>        /// 增強對象        /// </summary>        public AdviceAbstract Advice { get; private set; }        /// <summary>        /// 使用指定類型的默認增強對象        /// <para>如果類型為空 則不使用任何增強</para>        /// </summary>        /// <param name="type"></param>        public AdviceAttribute(Type type)            : this(type, string.Empty)        {        }        /// <summary>        /// 使用公有靜態方法名初始化指定類型的增強對象        /// <para>如果類型為空 則不使用任何增強</para>        /// </summary>        /// <param name="type">類型</param>        /// <param name="methodName">        /// 公有靜態方法名        /// <para>如果方法名為空,調用默認構造函數</para>        /// </param>        public AdviceAttribute(Type type, string methodName)        {            // 如果類型為空 則不使用任何增強            if (type == null)            {                this.Advice = null;                return;            }            if (string.IsNullOrWhiteSpace(methodName))            {                this.Advice = Activator.CreateInstance(type) as AdviceAbstract;                return;            }            this.Advice = type.InvokeMember(                methodName,                System.Reflection.BindingFlags.InvokeMethod | System.Reflection.BindingFlags.Public                | System.Reflection.BindingFlags.Static,                null, null, null) as AdviceAbstract;        }        #region 以下兩種方式效果不是很好,不推薦使用,故 構造函數私有化        /// <summary>        /// 使用參數列表初始化指定類型的增強對象        /// </summary>        /// <param name="type">類型</param>        /// <param name="objs">參數列表</param>        private AdviceAttribute(Type type, params object[] objs)        {            this.Advice = Activator.CreateInstance(type, objs) as AdviceAbstract;        }        /// <summary>        /// 使用命名參數初始化指定類型的增強對象        /// </summary>        /// <param name="namedParameter">        /// 以 冒號 和 分號 分割的形參的命名參數列表        /// <para>支持的數據類型有:string, int, bool 及 可通過靜態方法Parse 反序列化的類型</para>        /// </param>        /// <param name="type"></param>        private AdviceAttribute(string namedParameter, Type type)        {            this.Advice = ReflectionUtil.InvokeConstructor(type, namedParameter) as AdviceAbstract;        }        #endregion    }
Attribute

 

增強的抽象類 和 自定義的增強

    /// <summary>    /// 抽象的增強類    /// </summary>    public abstract class AdviceAbstract    {        public abstract IMessage Invoke(MarshalByRefObject target, IMethodCallMessage callMessage);    }    public class MyAdvice : AdviceAbstract    {        public override IMessage Invoke(MarshalByRefObject target, IMethodCallMessage callMessage)        {            this.BeforeInvoke(target);            IMessage message = DelayProxyUtil.InvokeBeProxy(target, callMessage);            this.AfterInvoke(target);            return message;        }        protected virtual void BeforeInvoke(MarshalByRefObject target)        {            Console.WriteLine("Before");        }        protected virtual void AfterInvoke(MarshalByRefObject target)        {            Console.WriteLine("After");        }    }
Advice

 

有了如上的兩個組件,再借助代理類 DelayProxy<T>,將增強織入,簡單的AOP就已經初具原形了。

    /// <summary>    /// 支持泛型、支持延遲初始化的代理類, 可為 MarshalByRefObject 的子類型提供代理    /// <para>在執行代理的過程中,獲取 AdviceAttribute 所指定的增強,并織入該增強</para>    /// </summary>    public class DelayProxy<T> : RealProxy where T : MarshalByRefObject    {        private static object objLock = new object();        /// <summary>        /// 被代理的對象        /// </summary>        private T target;        /// <summary>        /// 是否延遲初始化        /// <para>True:延遲, False: 不延遲</para>        /// </summary>        private readonly bool delay;        public DelayProxy(T target, bool delay)            : base(typeof(T))        {            this.target = target;            this.delay = delay;        }        /// <summary>        /// 調用被代理對象        /// <para>支持 out ref 參數</para>        /// </summary>        /// <param name="msg"></param>        /// <returns></returns>        public override IMessage Invoke(IMessage msg)        {            if (this.delay && this.target == null)            {                lock (objLock)                {                    if (this.delay && this.target == null)                    {                        T instance = Activator.CreateInstance(typeof(T)) as T;                        // 自動裝配屬性                        // 為屬性對象啟用代理,并延遲初始化被代理的對象                        // DelayProxyUtil.AutowiredProperties(instance);                        this.target = instance;                    }                }            }            IMethodCallMessage callMessage = (IMethodCallMessage)msg;            AdviceAttribute attri = ReflectionUtil.GetCustomAttribute<AdviceAttribute>(callMessage.MethodBase);            if (attri != null && attri.Advice != null)            {                return attri.Advice.Invoke(this.target, callMessage);            }            return DelayProxyUtil.InvokeBeProxy(this.target, callMessage);        }    }
DelayProxy

 

源碼(MVC4的項目 沒有packages文件夾):http://files.VEVb.com/files/08shiyan/AOPDemo.zip 

該源碼中還實現了被代理對象的延遲初始化。

 

未完待續...

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
尤物yw午夜国产精品视频| 一区二区三区视频在线| 欧美色播在线播放| 久久精品这里热有精品| 国产精品极品美女在线观看免费| 欧美日韩国产成人在线| 国产日韩精品在线| 日韩成人av一区| 欧美香蕉大胸在线视频观看| 91精品国产高清自在线看超| 亚洲成人在线网| 午夜精品蜜臀一区二区三区免费| 日本精品视频在线播放| 国产精品一区二区久久久| 在线精品播放av| 伊人久久大香线蕉av一区二区| 亚洲自拍小视频| 97久久精品人人澡人人爽缅北| 国产精品第2页| 国产日产欧美精品| 国产女精品视频网站免费| 欧美极品少妇xxxxⅹ裸体艺术| 欧美亚洲另类视频| 亚洲成人久久一区| 欧美精品激情blacked18| 97免费视频在线播放| 欧美性生交xxxxx久久久| 亚洲精品美女免费| 欧美xxxx14xxxxx性爽| 国产中文欧美精品| 欧美性猛xxx| 久久国产精品影视| 成人激情视频免费在线| 97在线观看视频国产| 九九精品在线视频| 亚洲福利视频网站| 日韩欧美福利视频| 国产69精品久久久| 精品毛片三在线观看| 欧美成人激情在线| 5566日本婷婷色中文字幕97| 欧美午夜女人视频在线| 九九热这里只有精品免费看| 国产日产欧美精品| 免费91麻豆精品国产自产在线观看| 亚洲а∨天堂久久精品喷水| 亚洲第一精品久久忘忧草社区| 97超视频免费观看| 日韩黄色av网站| 国产精品va在线播放我和闺蜜| 国产精品劲爆视频| 亚洲国产古装精品网站| 欧美在线一区二区视频| 精品久久久中文| 最近2019年好看中文字幕视频| 91精品国产高清自在线看超| 欧美性xxxx| 欧美精品精品精品精品免费| 高清一区二区三区四区五区| 欧美日韩成人免费| 成人激情在线播放| 亚洲欧美激情四射在线日| 欧美裸体xxxx极品少妇软件| 成人黄色中文字幕| 久久精品色欧美aⅴ一区二区| 久久久久久久久中文字幕| 欧美洲成人男女午夜视频| 久久久久久久久久久久久久久久久久av| 视频直播国产精品| 2018中文字幕一区二区三区| 一区二区三区在线播放欧美| 国产精品亚洲第一区| 青青草一区二区| 日韩电影大片中文字幕| 欧美区在线播放| 91久久精品在线| 国产精品video| 欧美高清自拍一区| 中文字幕精品影院| 欧美激情一区二区三区高清视频| www.久久色.com| 97超视频免费观看| 91老司机在线| 日韩高清欧美高清| 亚洲成人黄色在线观看| 日韩欧美黄色动漫| 亚洲乱亚洲乱妇无码| 国产女精品视频网站免费| www.亚洲一区| 欧美性少妇18aaaa视频| 美女av一区二区| 欧美在线视频在线播放完整版免费观看| 亚洲欧美另类自拍| 国产精品免费久久久久久| 午夜精品久久久久久久白皮肤| 久久精品视频中文字幕| 久久精品国产96久久久香蕉| 欧美激情影音先锋| 午夜精品理论片| 91精品国产自产在线老师啪| 国产ts人妖一区二区三区| 久热精品视频在线观看| 91久久久久久国产精品| 国产精品网站视频| 日韩在线精品一区| 欧美综合第一页| 91视频免费在线| 精品国产乱码久久久久久婷婷| 国语自产偷拍精品视频偷| 欧美午夜视频在线观看| 欧美午夜无遮挡| 欧美一区二区三区图| 国产网站欧美日韩免费精品在线观看| 色婷婷综合久久久久中文字幕1| 久久99久久99精品中文字幕| 日韩av高清不卡| 欧美日韩国产在线看| 欧美精品久久久久久久久久| 亚洲精品720p| 久久久免费精品视频| 日韩中文字幕av| 亚洲天堂久久av| 国产精品三级久久久久久电影| 永久免费毛片在线播放不卡| 精品国产一区av| 91视频8mav| 精品网站999www| 午夜精品久久久久久久久久久久久| 亚洲欧洲日产国码av系列天堂| 久久91亚洲人成电影网站| 欧美在线欧美在线| 精品久久久久久久久国产字幕| 久久精品福利视频| 欧美日韩福利视频| 欧美亚洲国产日韩2020| 亚洲第一福利视频| 欧美极品xxxx| 亚洲欧洲美洲在线综合| 久久精视频免费在线久久完整在线看| 欧美日本在线视频中文字字幕| 九九久久久久久久久激情| 亚洲最大激情中文字幕| 久久成人国产精品| 久久精品91久久久久久再现| 福利精品视频在线| 久久手机免费视频| 日韩成人在线视频| 日韩中文字幕视频在线| 亚洲精品久久久久久久久久久久| 国产在线视频2019最新视频| 在线观看日韩www视频免费| 中文字幕日韩av电影| 欧美大片欧美激情性色a∨久久| 欧美夫妻性生活视频| 亚洲iv一区二区三区| 日韩精品在线视频美女| 国产日本欧美在线观看| 日日狠狠久久偷偷四色综合免费| 黄色成人av网| 亚洲国产精品成人精品| 97精品欧美一区二区三区| 日韩中文字在线| 欧美极品第一页| 国产精品日韩欧美综合|