日本免费精品_最新日韩一区_亚洲视频一区在线_a在线视频观看_天天射夜夜骑_粉嫩av一区二区三区_欧美中日韩免费视频_综合图区欧美_国内精品美女在线观看_午夜精品久久久久久久男人的天堂

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

利用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,使得其它開發人員有更多精力去關注自己的業務邏輯。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
日韩视频精品在线观看| 亚洲综合在线不卡| 久久精品日韩欧美| 91精品国产综合久久福利 | 欧美日韩国产一二| 91精品国产99| 婷婷久久综合九色国产成人| 99亚洲视频| 日韩一级二级三级| 国产福利第一页| 中文字幕精品视频在线| 一区二区三区精品在线| 亚洲影视资源网| 久久久99免费| 亚洲一区日韩精品中文字幕| 亚洲高清中文字幕| 亚洲国产www| 日韩在线高清| 中文字幕在线看视频国产欧美| 国产日韩精品视频| 久久视频www| 伊人网站在线| 中文精品视频| 日韩精品高清不卡| 免费国产成人看片在线| 欧美一级搡bbbb搡bbbb| 国产午夜精品视频| 久久中文精品| 久久久久久自在自线| 二区三区中文字幕| 91精品视频国产| av首页在线| 久久精品女人| 国产免费一级| 精品视频在线视频| 在线一区二区不卡| 一级片免费在线| 亚洲欧美中文字幕| 中文字幕一区二区三区精品| 日韩视频在线一区二区三区| 人人做人人澡人人爽欧美| 国产福利精品导航| 亚洲高清中文字幕| 在线看av的网址| 日韩精品高清不卡| 中文字幕2020第一页| www在线播放| 91亚洲国产| 亚洲成av人综合在线观看| 日韩欧美中文免费| 国产激情三区| 欧美日韩亚洲综合在线| 欧美日韩在线视频免费观看| 亚州黄色一级| 91精品久久久久久久久久| 久久久久久91| 亚洲综合视频一区| 91精品国产综合久久久久久| 日韩欧美在线精品| 中文精品在线观看| 欧美一级二级三级区| 69免费视频| 欧美色欧美亚洲高清在线视频| 麻豆精品视频入口| 日韩高清不卡| 国产不卡在线| 中文字幕精品亚洲| 欧美日韩在线播放三区四区| 在线观看国产一级片| 国产在线小视频| 欧美 亚洲 精品 三区| 自拍日韩亚洲一区在线| 精人妻一区二区三区| 中文字幕亚洲国产| 精品国产乱码久久久久久牛牛| 91精品国产日韩91久久久久久| 韩国一区二区av| 日韩欧美在线中文字幕| 亚洲黄色片在线观看| 一区二区三区在线播放视频| 综合激情一区| 国产小视频免费在线网址| 欧美日韩国产观看视频| 久久久久久91| 91极品视频在线观看| 亚洲最新免费视频| 一区二区不卡在线| 韩国av一区二区| 国产黄色高清在线| 日韩字幕在线观看| 日韩中文首页| 免费视频国产一区| 91精品在线免费| 91精品婷婷国产综合久久| av免费在线不卡| 日韩欧美三级在线| 中文字幕不卡三区| 91精品国产综合久久久久| 国产在线小视频| www.老鸭窝.com| 久久精品久久久久| 欧美日韩精品欧美日韩精品一| 日韩精品福利视频| 高清一区二区| 国产资源在线观看| 中文字幕人成乱码在线观看| 欧美日韩中文精品| 欧美日韩亚洲国产综合| 欧美日韩色综合| 日韩精品在线观| 中文字幕欧美亚洲| 999精品视频在线观看播放| 日韩中文字幕视频在线观看| 日韩欧美一卡二卡| 色一区在线观看| 日韩手机在线观看视频| av最新网址| 91精品国产高清| 欧美日韩激情一区二区三区| 日韩精品在线观| 亚洲视频一二三四| 日韩一级中文字幕| 中文字幕第一页在线| 日韩美女中文字幕| 亚洲免费看av| 亚洲午夜91| 国产欧美日韩中文字幕在线| 久久99蜜桃精品久久久久小说| 日韩在线观看一区| 日韩欧美三级| 日韩网站中文字幕| 日韩精品丝袜在线| 91精品国产高清| 日韩精品视频在线看| 久久久精品欧美| 日韩在线精品视频| 91久久视频| 中文字幕日韩欧美| 国产在线观看精品| 国产日产一区二区| 日韩在线不卡一区| 在线欧美一级视频| 国产成免费视频| 国产一区二中文字幕在线看| 人成免费在线视频| 91精品国产综合久久精品app | 99精品999| 中文字幕在线精品| 欧美日韩国产一区中文午夜 | 国产一区不卡精品| 免费视频久久| 天堂在线中文资源| 中文字幕 亚洲视频| 一区二区精品| 欧美日韩视频免费播放| 久久精品99国产国产精| 亚洲一级特黄| 尤物av一区二区| 日韩欧美国产1| 日本精品国语自产拍在线观看| 久久精品免费看| 亚洲欧洲在线观看av| 久久精品国产视频| 日韩黄色在线播放| 一区三区二区视频| 国产福利久久久| 国产色在线视频| av中文在线播放| 麻豆一区二区99久久久久| 亚洲黄色www| 国产欧美日韩视频| 欧美日韩成人一区二区| 免费看ww视频网站入口| 中文字幕最新精品| 国产第一页在线播放| 日韩精品视频免费在线观看| 久久久水蜜桃| 拍真实国产伦偷精品| 国产日韩在线亚洲字幕中文| 日韩精品第一区| 亚洲成av人片| 亚洲羞羞网站| 久精品在线观看| 亚洲第一视频网站| 最新日韩中文字幕| 欧美激情视频一区二区三区在线播放| а√天堂8资源中文在线| 日韩久久在线| 日韩中文字幕| 快she精品国产999| 日韩美女中文字幕| 99精品在线播放| 欧美国产综合视频| 亚洲 欧美综合在线网络| 又黄又www的网站| 在线视频不卡一区二区| 欧美日韩国产综合久久| 欧美日韩三级在线观看| 中文字幕欧美国内| 精品网站999www| 亚洲 欧美综合在线网络| 日韩欧美中文字幕在线视频| 欧美啪啪一区| 欧洲精品在线一区| 日韩欧美国产一二三区| 中文字幕 日韩 欧美| 91精品国产91久久久久久久久| 亚洲一卡二卡在线观看| 欧美日韩性视频| 在线亚洲免费| 最近中文字幕第一页| 亚洲免费看av| 日韩免费看网站| 欧美色欧美亚洲高清在线视频| 日韩字幕在线观看| 国产资源中文字幕| 欧美激情一区二区在线| 亚洲羞羞网站| 91精品在线国产| 一二三区精品视频| 国产激情在线| 精品色蜜蜜精品视频在线观看| 欧美色视频一区二区三区在线观看| 日韩久久99| 欧美一级在线观看| 欧美在线视频第一页| 亚洲视频电影在线| 欧美日韩国产片| 自拍日韩亚洲一区在线| 亚洲乱码在线观看| 国产一区深夜福利| 中文字幕中文字幕精品| 国产福利一区二区在线精品| 亚洲永久免费视频| 国产99对白在线播放| 欧美色视频一区二区三区在线观看| 日韩欧美一级精品久久| 一区二区视频在线观看免费的| 日韩欧美在线1卡| 国产在线观看色| 欧美成人二区| 一区二区日韩av| 国产一级在线播放| 日韩午夜高潮| 国产91久久久久蜜臀青青天草二| 中文字幕综合在线| 国产一二三精品| 国产丝袜一区| 亚洲黄在线观看| 黄色在线播放网站| 黄色国产网站在线观看| 国产拍揄自揄精品视频麻豆| 人妻一区二区三区免费| 国产在线观看黄色| 久久久精品日韩| 日韩一级免费视频| 91欧美日韩在线| 国产亚洲欧美中文| 国产999在线观看| 国产午夜在线观看| 国产日韩亚洲欧美| 日韩免费看网站| wwwww亚洲| 精品久久久久久综合日本欧美 | 亚洲第一视频在线观看| 日韩在线视频中文字幕| 亚洲国内精品视频| 国产欧美日韩视频在线| 日韩欧美在线1卡| 亚洲高清视频在线| 91精品免费在线观看| 国产真实乱子伦精品视频| 日韩欧美在线影院| 日韩精品在线免费观看视频| 国产精品福利视频一区二区三区| 久久久精品网| 精品久久九九| 天堂√8在线中文| 欧美日韩一二| 亚洲羞羞网站| 欧美变态tickling挠脚心| 日韩国产成人精品| 亚洲一区中文在线| 日韩国产专区| 精品久久久网| 国产成人精品三级| 久久久久蜜桃| 日韩亚洲一区在线| 日韩免费看网站| 中文字幕在线官网| 久久韩国免费视频| 日韩三区免费| 国产欧美在线观看| 日韩国产成人| 91精品国产91久久久久久三级| 中文在线视频观看| 亚洲国产专区| 不卡在线视频| 亚洲免费观看在线观看| 综合图区亚洲白拍在线| 亚洲国产欧美91| 精品国产91乱高清在线观看| 日韩欧美中文字幕视频| 极品久久久久久| 中文字幕欧美人妻精品一区蜜臀| 欧洲精品在线视频| 国产123在线| 国产中文在线| 91精品久久久久久久91蜜桃| 日本亚洲欧美三级| 国产欧美日韩中文字幕| 国产高清视频一区二区| 日韩在线视频网| 日韩精品视频在线看| 精品日韩av| 在线中文免费视频| 日韩欧美999| 中文字幕久久av| 欧美久久在线| 高清不卡一区二区| 日韩久久在线| 日韩中文字幕亚洲| 一区二区日韩av| 日韩精品不卡一区二区| 国产三级精品网站| 精品国产99| av免费看在线| 日韩wumaV| 精品一区二区三区中文字幕| 五月综合激情日本mⅴ| 日韩视频国产视频| 久久手机免费观看| av免费不卡国产观看| 红桃视频亚洲| 日韩精品在线免费播放| 国产欧美日韩在线| 久久精品在线免费观看| 成人a在线视频免费观看| 国产欧美日韩91| 欧美日韩精品在线播放| 91精品国产综合久久精品app| 日韩在线欧美| 中文字幕日韩欧美| 黄色片免费在线| 在线精品日韩| 国产在线高潮| 蜜臀久久精品| 亚洲第一中文字幕| 亚洲日本欧美日韩高观看| 久草视频在线看| 不卡专区在线| 国产在线观看a| 日韩亚洲国产欧美| 午夜一区二区三区| 欧洲精品久久久| 91欧美日韩在线| 在线视频国内一区二区| 精品久久人人做人人爽| 在线视频色在线| 久久久久蜜桃| 在线视频国产三级| 欧美,日韩,国产在线| 日韩欧美一级视频| 亚洲欧洲国产视频| 久久久精品国产99久久精品芒果| 日本精品国语自产拍在线观看| 日韩黄色在线播放| 精品中文字幕在线播放| 国产黄色小视频| 亚洲一级特黄| 成年人看的羞羞网站| 国产在线观看91| 欧美日韩一级黄| 久久精品国产91精品亚洲| 中文字幕4区| 国产日韩综合| 日韩视频一区在线观看| 中文字幕在线视频第一页| 久久精品人妻一区二区三区| 在线看的av| 欧美一级久久久久久久久大| 国产日产一区二区三区 | 一区二区三区高清在线| 99精品一级欧美片免费播放| 日韩一二三四区| 日韩高清在线一区二区| 天天摸日日摸狠狠添| 精品久久在线| 欧美 日韩 综合| 欧美日韩91| 亚洲综合中文字幕在线| 精品国产1区二区| 日韩精品在线观| 在线一区二区三区精品| 亚洲福利精品在线| 亚洲一区精品电影| 亚州黄色一级| 国产极品嫩模在线视频一区| 99久热re在线精彩视频| 国产福利免费观看|