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

首頁 > 課堂 > 技術開發 > 正文

利用AOP重構代碼

2023-06-23 14:40:29
字體:
來源:轉載
供稿:網友

AOP是什么?

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

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

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

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

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

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

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

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

AOP應用范圍

(1)Authentication 權限

(2)Error handling 錯誤處理

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

 ......

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

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

客戶端調用:

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

AOP的優勢:

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

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩成人中文字幕在线观看| 91久久精品在线| 国产91精品视频在线观看| 亚洲成人激情小说| 狠狠躁天天躁日日躁欧美| 亚洲第一av网| 91色视频在线导航| 国产欧洲精品视频| 欧美性xxxxxx| 91精品视频在线播放| 国产人妖伪娘一区91| 国产精品一区二区久久| 91免费在线视频网站| 国产欧美日韩91| 97久久伊人激情网| 日韩大胆人体377p| 午夜精品在线视频| 亚洲激情电影中文字幕| 国产亚洲精品一区二555| 精品国产91久久久久久| 国产91精品在线播放| 欧美电影免费在线观看| 国产精品91久久| 原创国产精品91| y97精品国产97久久久久久| 国产欧美精品va在线观看| 亚洲午夜精品视频| 国产日韩在线看片| 九九精品视频在线观看| 国精产品一区一区三区有限在线| 8050国产精品久久久久久| 国产精品18久久久久久首页狼| 欧美在线中文字幕| 国产精品视频中文字幕91| 欧美日韩国产91| 97免费视频在线播放| 久久久久久久久久久网站| 成人激情黄色网| 性欧美激情精品| 欧美二区乱c黑人| 在线视频欧美性高潮| 亚洲free性xxxx护士hd| 久久久久久久久久久国产| 欧美激情国产精品| 久久久亚洲影院| 欧美xxxx做受欧美.88| 亚洲a∨日韩av高清在线观看| 91美女片黄在线观看游戏| 8090成年在线看片午夜| 国产成人精品一区二区三区| 国产精品欧美激情在线播放| 97视频在线观看视频免费视频| 操人视频在线观看欧美| 日韩电影免费在线观看| 久久影院资源网| 久久99精品久久久久久噜噜| 欧美在线播放视频| 欧美天堂在线观看| 7m第一福利500精品视频| 77777亚洲午夜久久多人| 色多多国产成人永久免费网站| 色老头一区二区三区在线观看| 亚洲色图美腿丝袜| 欧美国产日韩一区二区| 亚洲欧美日韩精品久久奇米色影视| 国精产品一区一区三区有限在线| 91成人精品网站| 精品国产一区二区三区久久狼黑人| 91国内免费在线视频| 久久在线视频在线| 欧美噜噜久久久xxx| 欧美精品videossex性护士| 成人福利网站在线观看| 精品福利在线观看| 午夜精品一区二区三区在线视频| 夜夜嗨av色一区二区不卡| 午夜精品福利视频| 亚洲va欧美va国产综合剧情| 亚洲人成电影网| 欧美自拍视频在线观看| 亚洲人成电影在线播放| 亚洲天堂影视av| 久久久精品美女| 亚洲影影院av| 欧美国产高跟鞋裸体秀xxxhd| 日韩成人中文字幕在线观看| 精品国产一区久久久| 日韩少妇与小伙激情| 91亚洲精华国产精华| 97成人精品区在线播放| 欧美黑人一区二区三区| 亚洲精品一区二区网址| 中文字幕国内精品| 91精品国产乱码久久久久久蜜臀| 精品毛片三在线观看| 日本中文字幕不卡免费| 日韩精品在线电影| 国自产精品手机在线观看视频| 成人黄色免费看| 日韩福利伦理影院免费| 国产欧美一区二区三区在线看| 亚洲国产小视频| 国产精品嫩草影院一区二区| 欧美精品一本久久男人的天堂| 亚洲iv一区二区三区| 欧美日韩第一视频| 欧美午夜精品久久久久久人妖| 日韩电影大全免费观看2023年上| 国产香蕉一区二区三区在线视频| 国产精品第100页| 国产精品18久久久久久麻辣| 欧美性生交xxxxx久久久| 欧美激情国产高清| 久久久久久网站| 欧美日韩精品在线视频| 一本久久综合亚洲鲁鲁| 68精品久久久久久欧美| 欧美日韩免费区域视频在线观看| 欧美国产第一页| 91在线播放国产| 日韩大片免费观看视频播放| 7m精品福利视频导航| 国产精品自产拍在线观| 伊人久久大香线蕉av一区二区| 91亚洲一区精品| 欧美激情女人20p| 欧美日韩国产激情| 欧美成人精品不卡视频在线观看| 欧美肥臀大乳一区二区免费视频| 国产日本欧美在线观看| 色av中文字幕一区| 蜜臀久久99精品久久久无需会员| 自拍亚洲一区欧美另类| 中文字幕亚洲一区| 欧美日产国产成人免费图片| 日韩精品极品毛片系列视频| 日韩欧美在线观看视频| 韩国三级电影久久久久久| 亚洲精品免费网站| 91丨九色丨国产在线| 色哟哟亚洲精品一区二区| 色老头一区二区三区在线观看| 最近2019中文字幕一页二页| 亚洲在线免费视频| 亚洲人精选亚洲人成在线| 欧美电影免费观看高清完整| 91精品久久久久久久久中文字幕| 亚洲欧美激情精品一区二区| 国产91ⅴ在线精品免费观看| 国产精品黄视频| 隔壁老王国产在线精品| 免费不卡欧美自拍视频| 国产精品久久久久久久久久尿| 国产精品永久在线| 亚洲视频电影图片偷拍一区| 91极品视频在线| 精品久久久久久久久久ntr影视| 国产精品美女免费| 亚洲自拍高清视频网站| 日韩精品久久久久| 欧美自拍视频在线观看| 亚洲理论在线a中文字幕| 91夜夜揉人人捏人人添红杏| 日韩av成人在线|