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

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

自己實現簡單的AOP(一)簡介

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

AOP 和 OOP,在我看來是兩種相輔相成的技術,作為OOP的補充,AOP 有著自己特殊的應用場景。

假設,我們需要在Service層實現以下幾項基本功能:

/// <para>1、自動管理數據庫連接[可選]</para>
/// <para>2、自動管理數據庫事務,當接收到異常后(無論什么異常)事務將自動回滾[可選]</para>
/// <para>3、服務級加鎖[必選]</para>
/// <para>4、以統一方式處理 服務異常 及 錯誤, 包括數據庫異常 和 主動拋出的異常[必選]</para>

解釋:
1、在 執行Service方法前 打開數據庫連接, 在 執行Service方法后 關閉數據庫連接
2、在 執行Service方法前 Begin數據庫事務, 在 執行Service方法后 Commit數據庫事務, Catch異常后 RollBack數據庫事務

3、將 整個Service方法 lock 進去,lock Service 的私有靜態對象,以達到服務級方法的 線程安全及同步工作
4、捕獲Service方法中所有未捕獲的異常,捕獲異常后,如果需要將自動關閉連接和回滾事務。并記錄異常信息。
即、主動報告錯誤時,只需要拋出異常即可。

 

為了 實現如上的功能,并能簡單方便實現,而且不打破現有的C#編碼規范。
所以,引入AOP、 使用 Attribute 為方法 指定增強對象,
以便在調用Service方法前,執行方法的前置增強(包括打開連接、開啟事務等)
在調用Service方法后,執行方法的后置增強(包括關閉連接、提交事務等)
及 對整個調用方法實現 Try...Catch異常捕獲 和 Lock 加鎖。

 

C# 引入了 PRoxy (代理)的概念,即 System.Runtime.Remoting.Proxies.RealProxy 提供了 代理的基本功能。利用該對象可以自己實現AOP編程。

RealProxy 可以可以為任何 “直接或間接繼承于 System.MarshalByRefObject” 的類型 提供代理。
RealProxy 可以為指定類型創建一個代理對象, 被創建的代理對象的類型 可以看做是 指定類型的 子類(但 被指定的類型可以是密封類)。
【PS: 看做子類,更容易理解,本質上為被創建的代理對象的類型 和 指定類型直接為 組合關系,并不是繼承關系 】


RealProxy 的工作原理:
假設:
T 為 需要被代理的類型, t 為對象
ProxyT 為 被創建的代理類型, proxyT 為對象

T 類型中存在 成員方法 Test();
ProxyT 繼承于 T【實際上不為繼承關系,應該為組合,為方便理解看做繼承關系】, ProxyT 同樣也存在方法 Test


當執行如下代碼時:
proxyT.Test();

.NET runtime 會自動調用 System.Runtime.Remoting.Proxies.RealProxy.Invoke(...)方法。
而該方法為抽象方法,自己重寫該方法,在方法內部調用 t.Test()。
在調用之前、執行前置增強;在調用之后、執行后置增強; 及 其他處理操作。
由此可實現 AOP 編程,織入增強。

 

自定義的RealProxy

using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Runtime.Remoting.Messaging;using System.Runtime.Remoting.Proxies;namespace AOPDemo.Common{    public class DelayProxy<T> : RealProxy    {        private static object objLock = new object();        /// <summary>        /// 被代理的對象        /// </summary>        private T target;        public DelayProxy(T target)            : base(typeof(T))        {            this.target = target;        }        public override IMessage Invoke(IMessage msg)        {            IMethodCallMessage callMessage = (IMethodCallMessage)msg;            Console.WriteLine("方法被調用前");            Console.WriteLine("調用方法名:" + callMessage.MethodName);            IMessage message = DelayProxyUtil.InvokeBeProxy(this.target, callMessage);            Console.WriteLine("方法被調用后");            return message;        }    }}
RealProxy

輔助工具類

using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Runtime.Remoting.Proxies;using System.Runtime.Remoting.Messaging;using System.Reflection;namespace AOPDemo.Common{    /// <summary>    /// 延遲初始化代理工具類    /// </summary>    public static class DelayProxyUtil    {        /// <summary>        /// 調用被代理對象中方法,返回 被代理對象的 方法返回值        /// <para>支持 out ref 參數</para>        /// </summary>        /// <param name="target"></param>        /// <param name="callMessage"></param>        /// <returns></returns>        public static IMessage InvokeBeProxy(object target, IMethodCallMessage callMessage)        {            var args = callMessage.Args;            object returnValue = callMessage.MethodBase.Invoke(target, args);            return new ReturnMessage(returnValue, args, args.Length, callMessage.LogicalCallContext, callMessage);        }        /// <summary>        /// 向上層拋出異常        /// </summary>        /// <param name="ex"></param>        /// <param name="callMessage"></param>        /// <returns></returns>        public static IMessage ReturnExecption(Exception ex, IMethodCallMessage callMessage)        {            return new ReturnMessage(ex, callMessage);        }        /// <summary>        /// 獲取對象的代理        /// </summary>        /// <param name="type"></param>        /// <param name="instance"></param>        /// <param name="delay"></param>        /// <returns></returns>        public static object GetTransparentProxy(Type type, object instance)        {            Type tmpType = typeof(DelayProxy<>);            tmpType = tmpType.MakeGenericType(type);            RealProxy proxy = Activator.CreateInstance(tmpType, new object[] { instance }) as RealProxy;            return proxy.GetTransparentProxy();        }    }}
輔助工具類

簡單的Demo

    public class HomeController : Controller    {        //        // GET: /Home/        public ActionResult Index()        {            Service service = new Service();            Service proxy = Common.DelayProxyUtil.GetTransparentProxy(typeof(Service), service) as Service;            proxy.Test();            return View();        }    }    public class Service : MarshalByRefObject    {        public void Test()        {            Console.WriteLine("調用Test方法");        }    }    
View Code

 

由于例子很簡單,就不上傳源碼了。 

未完待續...

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产一区二区三区在线播放免费观看| 欧美日韩在线看| 亚洲无亚洲人成网站77777| 在线精品视频视频中文字幕| 在线观看成人黄色| 成人精品一区二区三区电影黑人| 51视频国产精品一区二区| 精品亚洲aⅴ在线观看| 国产精品对白刺激| 欧美日韩国产成人在线| 久久精品国产精品| 欧美日韩国产va另类| 日韩中文有码在线视频| 97在线精品国自产拍中文| 国产精品视频网| 午夜精品久久久99热福利| 日韩av免费观影| 欧美日韩久久久久| 亚洲综合日韩中文字幕v在线| 91精品国产电影| 亚洲人永久免费| 欧美成人午夜激情在线| 欧美性生交xxxxxdddd| 91九色国产社区在线观看| 欧美自拍视频在线观看| 久久久精品国产一区二区| 日韩在线免费高清视频| 日本中文字幕久久看| 一区二区三区四区在线观看视频| 亚洲一区二区自拍| 国产亚洲成精品久久| 国产精品久久av| 欧美日韩国产丝袜另类| 国产福利精品在线| 成人免费激情视频| 欧美性猛交xxxx免费看漫画| 97在线免费观看| 精品亚洲一区二区三区| 欧美不卡视频一区发布| 欧美日韩xxx| 欧美综合国产精品久久丁香| 国语自产在线不卡| 5566成人精品视频免费| 国产精品久久婷婷六月丁香| 国产精品久久久久久久久免费| 麻豆精品精华液| 精品视频—区二区三区免费| 中文字幕国内精品| 国内精品久久久| 国产欧美日韩综合精品| 中文字幕av日韩| 国自产精品手机在线观看视频| 日韩av日韩在线观看| 亚洲成人激情在线观看| 日韩欧美亚洲国产一区| 欧美成年人在线观看| 国产在线观看一区二区三区| 国产美女扒开尿口久久久| 精品国产一区二区在线| 国产亚洲精品一区二区| 青青a在线精品免费观看| 日本电影亚洲天堂| 国产大片精品免费永久看nba| 欧美一区亚洲一区| 欧美日韩国产一区中文午夜| 国产欧美日韩免费| 91伊人影院在线播放| 亚洲影院色无极综合| 欧美放荡办公室videos4k| 欧日韩不卡在线视频| 91精品国产一区| 中文字幕亚洲综合| 欧美午夜宅男影院在线观看| 97免费视频在线播放| 亚洲男人天堂网| 亚洲国产精品小视频| 欧美午夜精品久久久久久久| www.久久草.com| 91久久夜色精品国产网站| 国产精品男女猛烈高潮激情| 国产精品久久久久久亚洲影视| 久久韩国免费视频| 亚洲美女免费精品视频在线观看| 日本老师69xxx| 国产主播喷水一区二区| 久久久成人av| 91国产视频在线| 国产精品亚发布| 久久亚洲国产精品成人av秋霞| 国产在线精品播放| 国产视频在线观看一区二区| 57pao国产成人免费| 欧美中文在线字幕| 亚洲自拍在线观看| 岛国视频午夜一区免费在线观看| 亚洲综合色激情五月| 久久精品国产欧美激情| 亚洲欧洲国产一区| 91精品成人久久| 日韩高清欧美高清| 欧美激情伊人电影| 久久久伊人欧美| 97在线观看视频国产| 亚洲欧美www| 国产精品a久久久久久| 亚洲国产欧美一区二区三区久久| 国模视频一区二区| 538国产精品一区二区在线| 成人国产精品免费视频| 色噜噜亚洲精品中文字幕| 精品自在线视频| 亚洲夜晚福利在线观看| 欧美性少妇18aaaa视频| 丰满岳妇乱一区二区三区| 高清欧美一区二区三区| 全色精品综合影院| 亚洲人午夜精品| 在线观看免费高清视频97| 久久影院中文字幕| 亚洲娇小xxxx欧美娇小| 97视频国产在线| 91精品美女在线| 黄色一区二区在线观看| 国外成人在线直播| 国产精品小说在线| 成人做爰www免费看视频网站| 91九色在线视频| 免费97视频在线精品国自产拍| 亚洲久久久久久久久久久| 一区二区福利视频| 日韩精品免费在线观看| 国产精品久久久久av免费| 精品久久久999| 亚洲欧美综合精品久久成人| 亚洲成人黄色网| 欧美在线视频a| 欧美—级高清免费播放| 久久久久久com| 亚洲人免费视频| 国产一区在线播放| 91av在线视频观看| 国产成人精品免费久久久久| 成人a级免费视频| 亚洲裸体xxxx| 亚洲摸下面视频| 亚洲精品色婷婷福利天堂| 狠狠躁夜夜躁人人爽天天天天97| 91精品视频一区| 欧美视频不卡中文| 国模视频一区二区三区| 欧美国产视频一区二区| 国产乱人伦真实精品视频| 成人午夜在线影院| 亚洲一区二区三区乱码aⅴ| 久久久亚洲影院你懂的| 亚洲www在线观看| 国产精品久久久久久av下载红粉| 久久亚洲精品小早川怜子66| 青草青草久热精品视频在线观看| 午夜欧美不卡精品aaaaa| 日本乱人伦a精品| 欧美中文在线观看国产| 亚洲电影免费观看高清完整版在线| 国产一区二区视频在线观看|