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

首頁 > 課堂 > 技術開發(fā) > 正文

利用AOP重構代碼

2023-06-23 14:40:29
字體:
來源:轉載
供稿:網(wǎng)友

AOP是什么?

AOP是OOP的延續(xù),Aspect Oriented Programming的縮寫,即面向方面編程。AOP是GoF設計模式的延續(xù),設計模式追求的是調用者和被調用者之間的解耦,AOP也是這種目標的一 種實現(xiàn)。

案例:在應用程序中,我們經(jīng)常會對某一段程序做異常處理,或者是把一個方法的調用所消耗的時間體現(xiàn)在日志中,如果我們對每個方法都寫具體的實現(xiàn),我想并不是一件輕松的事情。對于異常處理來講,其實我們平常編程很少去捕獲具體的異常,當然特殊程序除外,例如客戶端捕獲WCF異常時最好捕獲CommunicationException,TimeoutException,Exception。否則一般都會直接捕獲Exception,因為很多異常往往是意料之外的異常。對于記錄方法調用時間問題,我想也非常麻煩,下面例子簡單的展示了記錄時間:當你需要對多個方法都需要記錄時間時,這些代碼往往讓人感覺有重構的必要。 

Stopwatch sw = new Stopwatch();
   sw.Start();
   
//方法執(zhí)行.....
   sw.Stop();
   WebLog.SquareLog.CommonLogger.Error(
"取積分廣場首頁酒店數(shù)據(jù)用時:"+sw.ElapsedMilliseconds .ToString ()+"毫秒");

上面的記錄方法調用用時,如果抽象出來,其實有下列特性: 

(1)不是具體訪問類的首要或主要功能,訪問類主要功能是業(yè)務邏輯處理。

(2)具體訪問類的主要功能可以獨立、區(qū)分開來的。 

(3)是這個系統(tǒng)的一個縱向切面,涉及多個類、多個類的方法。示意圖如下:

aspect:  新的程序結構關注系統(tǒng)的縱向切面,例如這里的異常處理以及方法調用時間記錄,這個新的程序結構就是aspect(方面),方面(aspect)應該有以下職責:提供一些必備的功能,對被訪問對象實現(xiàn)特有功能,以保證所以方法在被執(zhí)行時都能正常的執(zhí)行異常處理或者是其它的功能。

AOP應用范圍

(1)Authentication 權限

(2)Error handling 錯誤處理

(3)logging, tracing, profiling and monitoring 記錄跟蹤 優(yōu)化 校準

 ......

AOP具體實現(xiàn):主要是利用泛型委托來實現(xiàn)AOP思想。但泛型委托有一個局限就是最多支持四個參數(shù),當你的方法超過四個時就不太好應用AOP重構了。我最近分析了有以下三個地方我們可以對代碼進行優(yōu)化:

第一:普通方法異常處理:ErrorHandler類,實現(xiàn)類參考第二或者是第三。

客戶端調用:

string ErrorMethodText="取積分廣場首頁酒店數(shù)據(jù)異常:";
           list 
= ErrorWCFHandler .Invoke<ISearchHotelForSquare, List<HotelGenericInfo>>(cli, proxy => proxy.GetHotelGenericListForSquare(requestInfo).ToList() ); 

第二:客戶端調用WCF的異常處理:ErrorWCFHandler。

代碼:

public  class ErrorWCFHandler
    {
       
public static void Invoke<TContract>(TContract proxy, Action<TContract> action, string MethodElapsedTimeText, string MethodErrorText)
        {
            Stopwatch sw 
= new Stopwatch();
            sw.Start();
            
try
            {
                action(proxy);
                (proxy 
as ICommunicationObject).Close();
            }
            
catch (CommunicationException ex)
            {
                (proxy 
as ICommunicationObject).Abort();
                
//Handle Exception             
                
//throw;
                WebLog.SquareLog.CommonLogger.Error(MethodErrorText + ex.ToString());
            }
            
catch (TimeoutException ex)
            {
                (proxy 
as ICommunicationObject).Abort();
                
//Handle Exception         
                
//throw;
                WebLog.SquareLog.CommonLogger.Error(MethodErrorText + ex.ToString());
            }
            
catch (Exception ex)
            {
                
//Handle Exception        
                
//(proxy as ICommunicationObject).Close();      
                WebLog.SquareLog.CommonLogger.Error(MethodErrorText + ex.ToString());
            }
            sw.Stop();

            WebLog.SquareLog.CommonLogger.Error(MethodElapsedTimeText 
+ sw.ElapsedMilliseconds.ToString() + "毫秒");
        }
       
public static TReturn Invoke<TContract, TReturn>(TContract proxy, Func<TContract, TReturn> func, string MethodElapsedTimeText, string MethodErrorText)
        {
            Stopwatch sw 
= new Stopwatch();
            sw.Start();
            TReturn returnValue 
= default(TReturn);
            
try
            {
                returnValue 
= func(proxy);
            }
            
catch (CommunicationException ex)
            {
                (proxy 
as ICommunicationObject).Abort();
                
//Handle Exception     
                
//throw;
                WebLog.SquareLog.CommonLogger.Error(MethodErrorText + ex.ToString());
            }
            
catch (TimeoutException ex)
            {
                (proxy 
as ICommunicationObject).Abort();
                
//Handle Exception       
                
//throw;
                WebLog.SquareLog.CommonLogger.Error(MethodErrorText + ex.ToString());
            }
            
catch (Exception ex)
            {
                
//Handle Exception  
                WebLog.SquareLog.CommonLogger.Error(MethodErrorText + ex.ToString());
            }
            sw.Stop();

            WebLog.SquareLog.CommonLogger.Error(MethodElapsedTimeText 
+ sw.ElapsedMilliseconds.ToString() + "毫秒");
            
return returnValue;
        }
    }

客戶端調用:

string ComputationTimeText="取積分廣場首頁酒店數(shù)據(jù)耗時:";
           
string ErrorMethodText="取積分廣場首頁酒店數(shù)據(jù)異常:";
           list 
= ErrorWCFHandler .Invoke<ISearchHotelForSquare, List<HotelGenericInfo>>(cli, proxy => proxy.GetHotelGenericListForSquare(requestInfo).ToList

(),ComputationTimeText ,ErrorMethodText );  

 

第三:記錄方法調用時間,這中間也增加了異常處理:ErrorAndComputationTimeHandler

代碼:

 public class ErrorAndComputationTimeHandler
    {
        
public static void Invoke<TContract>(TContract proxy, Action<TContract> action, string MethodElapsedTimeText,string MethodErrorText)
        {
            Stopwatch sw 
= new Stopwatch();
            sw.Start();
            
try
            {
                action(proxy);

            }
            
catch (Exception ex)
            {
                
//Handle Exception   
                WebLog.SquareLog.CommonLogger.Error(MethodErrorText + ex.ToString());

            }
            sw.Stop();

            WebLog.SquareLog.CommonLogger.Error(MethodElapsedTimeText  
+ sw.ElapsedMilliseconds.ToString() + "毫秒");
        }
        
public static void Invoke<TContract, TContract2>(TContract proxy, TContract2 proxy2, Action<TContract, TContract2> action, string MethodElapsedTimeText,string MethodErrorText)
        {
            Stopwatch sw 
= new Stopwatch();
            sw.Start();
            
try
            {
                action(proxy, proxy2);

            }
            
catch (Exception ex)
            {
                
//Handle Exception   
                WebLog.SquareLog.CommonLogger.Error(MethodErrorText + ex.ToString());

            }
            sw.Stop();

            WebLog.SquareLog.CommonLogger.Error(MethodElapsedTimeText  
+ sw.ElapsedMilliseconds.ToString() + "毫秒");
        }
        
public static void Invoke<TContract, TContract2, TContract3>(TContract proxy, TContract2 proxy2, TContract3 proxy3, Action<TContract, TContract2, TContract3> action, string MethodElapsedTimeText,string MethodErrorText)
        {
            Stopwatch sw 
= new Stopwatch();
            sw.Start();
            
try
            {
                action(proxy, proxy2, proxy3);

            }
            
catch (Exception ex)
            {
                
//Handle Exception   
                WebLog.SquareLog.CommonLogger.Error(MethodErrorText + ex.ToString());

            }
            sw.Stop();

            WebLog.SquareLog.CommonLogger.Error(MethodElapsedTimeText  
+ sw.ElapsedMilliseconds.ToString() + "毫秒");
        }
        
public static void Invoke<TContract, TContract2, TContract3, TContract4>(TContract proxy, TContract2 proxy2, TContract3 proxy3, TContract4 proxy4, Action<TContract, TContract2, TContract3, TContract4> action,  string MethodElapsedTimeText,string MethodErrorText)
        {
            Stopwatch sw 
= new Stopwatch();
            sw.Start();
            
try
            {
                action(proxy, proxy2, proxy3, proxy4);

            }
            
catch (Exception ex)
            {
                
//Handle Exception   
                WebLog.SquareLog.CommonLogger.Error(MethodErrorText + ex.ToString());

            }
            sw.Stop();

            WebLog.SquareLog.CommonLogger.Error(MethodElapsedTimeText  
+ sw.ElapsedMilliseconds.ToString() + "毫秒");
        }
        
public static TReturn Invoke<TContract, TReturn>(TContract proxy, Func<TContract, TReturn> func,  string MethodElapsedTimeText,string MethodErrorText)
        {
            Stopwatch sw 
= new Stopwatch();
            sw.Start();
            TReturn returnValue 
= default(TReturn);
            
try
            {
                returnValue 
= func(proxy);
            }
            
catch (Exception ex)
            {
                
//Handle Exception   
                WebLog.SquareLog.CommonLogger.Error(MethodErrorText + ex.ToString());

            }
            sw.Stop();

            WebLog.SquareLog.CommonLogger.Error(MethodElapsedTimeText  
+ sw.ElapsedMilliseconds.ToString() + "毫秒");
            
return returnValue;
        }
        
public static TReturn Invoke<TContract, TContract2, TReturn>(TContract proxy, TContract2 proxy2, Func<TContract, TContract2, TReturn> func,  string MethodElapsedTimeText,string MethodErrorText)
        {
            Stopwatch sw 
= new Stopwatch();
            sw.Start();
            TReturn returnValue 
= default(TReturn);
            
try
            {
                returnValue 
= func(proxy, proxy2);
            }
            
catch (Exception ex)
            {
                
//Handle Exception   
                WebLog.SquareLog.CommonLogger.Error(MethodErrorText + ex.ToString());

            }
            sw.Stop();

            WebLog.SquareLog.CommonLogger.Error(MethodElapsedTimeText  
+ sw.ElapsedMilliseconds.ToString() + "毫秒");
            
return returnValue;
        }
        
public static TReturn Invoke<TContract, TContract2, TContract3, TReturn>(TContract proxy, TContract2 proxy2, TContract3 proxy3, Func<TContract, TContract2, TContract3, TReturn> func,  string MethodElapsedTimeText,string MethodErrorText)
        {
            Stopwatch sw 
= new Stopwatch();
            sw.Start();
            TReturn returnValue 
= default(TReturn);
            
try
            {
                returnValue 
= func(proxy, proxy2, proxy3);
            }
            
catch (Exception ex)
            {
                
//Handle Exception   
                WebLog.SquareLog.CommonLogger.Error(MethodErrorText + ex.ToString());

            }
            sw.Stop();

            WebLog.SquareLog.CommonLogger.Error(MethodElapsedTimeText  
+ sw.ElapsedMilliseconds.ToString() + "毫秒");
            
return returnValue;
        }
        
public static TReturn Invoke<TContract, TContract2, TContract3, TContract4, TReturn>(TContract proxy, TContract2 proxy2, TContract3 proxy3, TContract4 proxy4, Func<TContract, TContract2, TContract3, TContract4, TReturn> func,  string MethodElapsedTimeText,string MethodErrorText)
        {
            Stopwatch sw 
= new Stopwatch();
            sw.Start();
            TReturn returnValue 
= default(TReturn);
            
try
            {
                returnValue 
= func(proxy, proxy2, proxy3, proxy4);
            }
            
catch (Exception ex)
            {
                
//Handle Exception   
                WebLog.SquareLog.CommonLogger.Error(MethodErrorText + ex.ToString());

            }
            sw.Stop();
            WebLog.SquareLog.CommonLogger.Error(MethodElapsedTimeText  
+ sw.ElapsedMilliseconds.ToString() + "毫秒");
            
return returnValue;
        }
    }

客戶端調用:

string ComputationTimeText = "取酒店是否在積分廣場首頁推薦數(shù)據(jù)耗時:";
            
string ErrorMethodText = "取酒店是否在積分廣場首頁推薦數(shù)據(jù)異常:";
            
string conn = WebConfig.DaoConfig.MisMasterDBReadConnectionString;
            HotelRecommendInfo 
= ErrorAndComputationTimeHandler.Invoke<HotelRequestInfo, string, List<HotelGenericInfo>>(requestInfo, conn, SearchRecommendHotelData, ComputationTimeText, ErrorMethodText);
 

AOP的優(yōu)勢:

(1)上述應用范例在沒有使用AOP情況下,也能解決,但是,AOP可以讓我們從一個更高的抽象概念來理解軟件系統(tǒng)??梢赃@么說:因為使用AOP結構,對于一個大型復雜系統(tǒng)來說可以簡化不少代碼。

(2)并不是所有的人都需要關心AOP,使得其它開發(fā)人員有更多精力去關注自己的業(yè)務邏輯。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
91福利视频在线观看| 国产女片a归国片aa| 国产亚洲精品精品国产亚洲综合| 中文字幕综合在线| 日韩网红少妇无码视频香港| 免费观看又污又黄在线观看国产| 亚洲午夜久久| 欧美精品人人做人人爱视频| 日韩成人在线资源| 国产精品老牛影院在线观看| 成人区精品一区二区| 婷婷久久综合九色综合99蜜桃| 国产一级黄色大片| 日韩在线短视频| 秋霞毛片久久久久久久久| brazzers在线观看| 亚洲区小说区图片区qvod| 亚洲第一页在线| 岛国片在线观看| 深夜福利国产精品| 99久久精品免费看国产小宝寻花| 亚洲av无码久久精品色欲| 在线免费观看一区| 国产在视频一区二区三区吞精| 99在线精品视频免费观看20| 欧美私人网站| 日韩精品无码一区二区三区免费| 国产精品久久久久久妇女6080| 亚洲风情在线资源站| 亚洲天堂一区二区三区四区| 无码黑人精品一区二区| 在线观看免费观看在线| 国产曰肥老太婆无遮挡| 福利视频网址| 97人人做人人爱| 日韩欧美亚洲一区二区三区| 国产精品色在线网站| 99久久99久久精品免费看蜜桃| 亚洲人成77777男人| 成人18视频在线播放| 亚洲免费在线电影| 日本毛片在线免费观看| 在线免费观看av影视天堂| 国产又猛又黄又爽| 中文字幕第8页| wwwcom羞羞网站| 国产精品久久久久久久久搜平片| 麻豆映画在线观看| 亚洲色图 欧美| 少妇被狂c下部羞羞漫画| 天天射天天操天天干| 黄一区二区三区| 性欧美高清强烈性视频| 日本午夜精品久久久| 91精品国产一区二区三区| 亚洲欧美另类国产| 久久先锋影音av鲁色资源| 最好看的日本字幕mv视频大全| 在线国产精品网| 成人免费淫片免费观看| 成人黄色视屏网站| 激情综合一区二区三区| 精品无码黑人又粗又大又长| 国精品无码人妻一区二区三区| 女人被爽到呻吟gif动态图下载| 中文在线字幕免费观| 欧美另类videos死尸| 被男人吃奶添下面好舒服动态图| 国产精品久久久久久久9999| 精品国产一区二区三区久久| 欧美日韩成人在线一区| 国产激情无码一区二区三区| 蜜臀99久久精品久久久久小说| 亚洲男人天堂九九视频| 午夜伦欧美伦电影理论片| 日本精品福利视频| 欧美网色网址| 天天躁日日躁狠狠躁免费麻豆| 国产精品高潮呻吟视频| 一本一道久久a久久| 爱情岛论坛亚洲自拍| 久久久久在线观看| 一区二区三区视频免费视频观看网站| 亚洲美女www午夜| 女同一区二区免费aⅴ| 人人插人人射| 国产精品女同一区二区三区| 国产亚洲免费的视频看| 99国产在线视频| www.日日操| 国产成人亚洲综合a∨猫咪| 成人黄色大片在线观看| www.色就是色| 18性欧美xxxⅹ性满足| 柠檬在线导航福利| 欧美电影网站| 国产又粗又长免费视频| 国产激情精品久久久第一区二区| 丰满少妇大力进入| 亚洲综合成人在线视频| 国产精品极品美女在线观看免费| 精品免费国产二区三区| 色一情一乱一伦一区二区三区丨| 美女视频黄久久| 成人免费视频免费观看| 成人动漫h在线观看| 蜜桃欧美视频| xf在线a精品一区二区视频网站| 91精品国产91久久久久久久久| 99久久免费精品国产免费| 视频福利在线| 三年中文在线观看免费大全中国| 国产欧美综合一区| 国产99视频精品免费视频36| 国产午夜免费视频| 久久人人爽人人爽爽久久| av丝袜在线| 性xxxx视频播放免费| 亚洲护士老师的毛茸茸最新章节| 中文字幕一区二区三区在线观看| 国产成人无码aa精品一区| 精品一区二区视频在线观看| 国产精品啊v在线| 国产欧美一区二区三区小说| 天天综合网91| 久久久久中文字幕2018| 狠狠躁夜夜躁人人爽天天天天97| 欧美日韩黄网站| 国内精品麻豆美女在线播放视频| 国产乱淫av免费| 91午夜精品亚洲一区二区三区| 欧美日韩你懂的| 成人18免费| 亚洲伊人春色| 三级免费网站| 无码精品黑人一区二区三区| 亚洲乱码一区二区三区三上悠亚| 欧美变态视频| 国产日产高清欧美一区二区三区| 欧美三级日韩三级国产三级| 伊人久久大香线蕉成人综合网| 国产手机免费视频| 欧美日韩一二三四区| 日韩精品视频在线免费观看| 天堂精品在线视频| 自己做鸭怎么接单寻找客源| 视频一区视频二区国产精品| 久久综合香蕉| 国产在线视频一区| 一区二区三区日韩欧美| 青青草国产免费一区二区下载| 亚洲国产精品高清| 亚洲国产精品va在线看黑人| 中文字幕av播放| 96久久久久久| 国产中文字幕视频| 欧美另类69精品久久久久9999| 日韩在线观看免费高清| 国产麻豆剧果冻传媒观看hd高清| 精品va天堂亚洲国产| 风间由美一区| 国产又爽又黄无码无遮挡在线观看| 国产精品亚洲欧美| 精品一区二区三区无码视频| 亚洲成人777777| 亚洲第一页在线视频| 精品国产无码在线| 在线观看xxxxvideo| 视频一区二区中文字幕| 久久久久久久久久久久久9999| 美女视频一区在线观看| baoyu777.永久免费视频| 久久精品视频播放| 57pao国产一区二区| 亚洲天天影视| 午夜免费一区二区| 国产精品久久久久久久小唯西川| 尤物精品国产第一福利三区| 欧美18—19sex性hd| y111111国产精品久久久| av网站免费观看| 实拍女处破www免费看| 亚洲自拍都市欧美小说| 亚洲精品中文字幕在线观看| 免费精品国产的网站免费观看| 国产精品国产三级国产普通话99| 美女被爆操网站| 国产亚洲欧美一级| 国产精品久久久久久| 色哦色哦哦色天天综合| 欧美xxxx精品| 性折磨bdsm欧美激情另类| 国产麻豆视频一区二区| 久久99久久99小草精品免视看| 亚洲AV无码成人精品区明星换面| 在线中文字幕亚洲| 91精品国产91久久久久久吃药| 亚洲成人va| 日韩在线短视频| 久久久久久91| 黄页在线播放| 三级毛片在线免费看| 波多野结衣在线| 日韩欧美电影一区| 一个人看的www在线免费视频| 亚洲成av人片在线观看香蕉| 亚洲欧美一区二区三区在线| 国产成a人亚洲精v品在线观看| 狠狠色综合网站久久久久久久| 三区精品视频| 撸视在线观看免费视频| 色网站在线免费观看| 日韩av电影免费观看| 91香蕉视频网址| 五十度飞在线播放| 日韩电影在线观看一区二区| 国产永久av在线| 亚洲AV无码国产精品午夜字幕| 99国产精品视频免费观看一公开| 国产精品扒开腿做爽爽爽的视频| 久草综合在线| 久久精品国产99国产精品| 久久亚洲AV成人无码国产野外| 国产美女永久免费| 久久深夜福利| 国产视频在线观看一区二区| 黄色网在线免费观看| 69日本xxxxxxxxx49| 丁香六月激情网| 一本色道无码道dvd在线观看| 国产丶欧美丶日本不卡视频| 欧美精品亚洲精品日韩精品| 成人黄色片视频网站| 手机在线免费av| 成人99免费视频| 欧美高清3dfreexxxx性| 韩国午夜理伦三级不卡影院| 欧美成人久久电影香蕉| 欧美日韩国产高清一区二区三区| 午夜dv内射一区二区| 久久福利网址导航| 在线播放evaelfie极品| 在线精品亚洲欧美日韩国产| 一道本视频在线观看| 中文字幕永久视频| 中文字幕第一区综合| 无需播放器的av| 国产又大又粗又硬| 狂野欧美激情性xxxx欧美| 日韩中文一区| 久久一二三国产| 成人激情视频在线观看| c++连点器| 国产在线999| 黄色一级视频网站| 国产精品日韩电影| 96sao在线精品免费视频| 亚洲电影中文字幕| 91香蕉视频黄| 亚洲欧美另类久久久精品2019| yiren22综合网成人| 亚洲一区二区三区四区中文字幕| 国产免费1000拍拍拍| 国产老妇另类xxxxx| 成人黄18免费网站| 亚洲最大福利视频网| 色999韩欧美国产综合俺来也| 丰满少妇在线观看bd| 欧美激情视频二区| 永久看片925tv| 牛牛精品视频在线| 毛片女人与拘交视频| 日本五十肥熟交尾| 欧美精品一线| 美女视频在线免费| 久久网一区二区| 国产亚洲综合av| 欧美日韩精品在线一区二区| 精品丝袜一区二区三区| av在线网址导航| 成人免费淫片视频软件| 亚洲欧美另类自拍| 欧美不卡一区二区| 天天干天天摸天天操| 国产精品久久久久9999| 成人在线视频首页| 中文字幕+乱码+中文字幕| 成人精品国产一区二区4080| luxu259在线中文字幕| 欧美精品高清视频| 丁香花高清电影在线观看完整版| 最新欧美精品一区二区三区| 亚洲综合久久av一区二区三区| 18涩涩午夜精品.www| 欧美色另类天堂2015| 男女啪啪免费视频网站| 日本一区二区三区久久久久久久久不| 在线观看免费成人| 国产在线视频资源| 一级二级在线观看| av免费在线网站| 九色porny丨国产首页在线| 亚洲精品视频久久| 免费观看国产视频| 亚州国产精品久久久| av天天在线| 欧美毛片免费观看| 欧美视频亚洲视频| 成人h视频在线观看播放| 一级特黄大欧美久久久| 老司机精品久久| 一炮成瘾1v1高h| 日本一区二区免费在线| 欧洲精品二区| 欧美精品色哟哟| 亚洲精品久久久狠狠狠爱| 欧美成人r级一区二区三区| 超碰男人的天堂| 136福利视频导航| 国产a级网站| 国产普通话bbwbbwbbw| 欧美一区高清| 欧洲亚洲妇女av| 久久99久久99小草精品免视看| 精品国产制服丝袜高跟| 自拍偷拍欧美日韩| 精品国产一区二区三区av性色| 国产经典一区|