成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

.NET中通過代理實現面向方面編程(AOP)

開發 后端
面向方面編程(AOP),又叫面向切面編程,是面向對象編程(OOP)的延續。本文將通過介紹運用代理方式,實現AOP的過程。

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

我說到了在代碼中可以利用泛型委托來封裝異常處理,這樣可以讓程序看起來更加清晰,要想完成功能需要調用者調用指定的工廠方法才行,但要想改變某些程序員的編碼習慣我想是一件比較困難的事情。有朋友說利用委托來實現異常處理并不算是真正意義上的AOP,因為傳統的AOP并不需要客戶端做代碼結構的變更,最多也就是配置上的問題。但在.net中要想實現AOP,我想最方便的實現機制要屬代理機制了,但只要利用代理,在性能上就會造成一定的影響。

如果開發過分布式服務,像remotion,wcf等,消息都是它們通信的重要手段??蛻舳送ㄟ^方法調用形式體現的服務訪問需要轉換成具體的消息,然后經過編碼才能利用傳輸通道發送給服務端,服務執行的結果也只能以消息的形式返回給調用方。

這些分布式服務有一共同特點:都通過代理方法間接的調用服務。服務代理,它自身并不提供服務的實現,只是起到一個中介作用,客戶端把服務請求發送給服務代理,服務代理再去調真正的服務,同樣服務返回時,也是返回給服務代理,再由服務代理返回給客戶端。看到這,我想對于實現AOP的攔截就有點眉目了。在.net中,我們可以寫自定義的RealProxy來實現AOP的方法攔截功能。

服務代理通常又分為以下兩種:

1:透明代理??蛻舳嗽诳缛魏晤愋偷倪h程處理邊界使用對象時,對對象使用的實際上是透明代理。透明代理使人以為實際對象駐留在客戶端空間中。它實現這一點的方法是:使用遠程處理基礎結構將對其進行的調用轉發給真實對象。透明代理本身由 RealProxy 類型的托管運行時類的實例收容。RealProxy 實現從透明代理轉發操作所需的部分功能。代理對象繼承托管對象(例如垃圾回收、對成員和方法的支持)的關聯語義,可以將其進行擴展以形成新類。這樣,該代理具有雙重性質,一方面,它需要充當與遠程對象(透明代理)相同的類的對象;另一方面,它本身是托管對象。

2:真實代理。RealProxy來實現與遠程服務進行通信,所以這里就是我們實現AOP的地方。

下圖是透明代理與真實代理以及遠程對象的調用關系圖:

調用關系圖

下圖是利用自定義的RealProxy實現AOP方法攔截的原理圖:

實現AOP方法攔截的原理圖

自定義異常代理類:

說明:1>自定義的代理類需要繼承RealProxy。

2>從 RealProxy 繼承時,必須重寫 Invoke方法。

3>下面代碼中的LogManage是一個log4net接口,我們可以把異常統一記錄到日志中,供日后分析。

  1. /// <summary>  
  2.     /// Aspect代理,在這個類里面,實現對方法的攔截  
  3.     /// </summary>  
  4.     public class AspectProxyErrorLog : RealProxy      
  5.     {  
  6.         AspectManagedAttribute attr;  
  7.         /// <summary>  
  8.         /// 默認構造函數  
  9.         /// </summary>  
  10.         public AspectProxyErrorLog() : base()  
  11.         {  
  12.         }  
  13.         /// <summary>  
  14.         /// 構造函數  
  15.         /// </summary>  
  16.         /// <param name="myType">被代理的類的類型</param>  
  17.         public AspectProxyErrorLog(Type myType) : base(myType)  
  18.         {  
  19.         }  
  20.         /// <summary>  
  21.         /// 構造函數  
  22.         /// </summary>  
  23.         /// <param name="myType">被代理的類的類型</param>  
  24.         /// <param name="obj">被代理的對象</param>  
  25.         public AspectProxyErrorLog(Type myType,MarshalByRefObject obj) : base(myType)  
  26.         {  
  27.             target=obj;  
  28.         }  
  29.         MarshalByRefObject target;  
  30.         ILog LogManage;  
  31.         /// <summary>  
  32.         /// 當在派生類中重寫時,在當前實例所表示的遠程對象上調用在所提供的 IMessage 中指定的方法。<br />  
  33.         /// WebsharpAspect在這里執行對方法執行的攔截處理  
  34.         /// </summary>  
  35.         /// <param name="msg">IMessage,包含有關方法調用的信息。</param>  
  36.         /// <returns>調用的方法所返回的消息,包含返回值和所有 out 或 ref 參數。</returns>  
  37.         public override IMessage Invoke(IMessage msg)  
  38.         {  
  39.             IMessage retMsg=null ;  
  40.             IMethodCallMessage methodCall = (IMethodCallMessage)msg;  
  41.             IMethodReturnMessage methodReturn = null;  
  42.  object[] copiedArgs = Array.CreateInstance(typeof(object), methodCall.Args.Length) as object[];  
  43.             methodCall.Args.CopyTo(copiedArgs, 0);  
  44.             object[] attrs = null;  
  45.             CoustomerErrorHandleAttribute ceha = null;  
  46.             if (msg is IConstructionCallMessage)  
  47.             {  
  48.  
  49.                 IConstructionCallMessage ccm = (IConstructionCallMessage)msg;  
  50.                 RemotingServices.GetRealProxy(target).InitializeServerObject(ccm);  
  51.                 ObjRef oRef = RemotingServices.Marshal(target);  
  52.                 RemotingServices.Unmarshal(oRef);  
  53. retMsg = EnterpriseServicesHelper.CreateConstructionReturnMessage(ccm, (MarshalByRefObject)this.GetTransparentProxy());  
  54.  
  55.             }  
  56.             else 
  57.             {  
  58.                 IMethodCallMessage mcm = (IMethodCallMessage)msg;                  
  59.                 attrs = methodCall.MethodBase.GetCustomAttributes(typeof(CoustomerErrorHandleAttribute), false);                 
  60.                 ceha = LogManagerFactory.GetCoustomerErrorHandleAttribute(attrs, methodCall.MethodBase.Name );  
  61.                 if (null != ceha)  
  62.                 {  
  63.                     LogManage = ceha.ILogName;  
  64.                 }  
  65.                 try 
  66.                 {  
  67.                     object returnValue = methodCall.MethodBase.Invoke(this.target, copiedArgs);  
  68. methodReturn = new ReturnMessage(returnValue, copiedArgs, copiedArgs.Length, methodCall.LogicalCallContext, methodCall);  
  69.                       
  70.                 }  
  71.                 catch (Exception ex)  
  72.                 {  
  73.                     if (null != ex.InnerException)  
  74.                     {  
  75.                         methodReturn = new ReturnMessage(ex.InnerException, methodCall);  
  76.                     }  
  77.                     else 
  78.                     {  
  79.                         methodReturn = new ReturnMessage(ex, methodCall);  
  80.                     }  
  81.                 }  
  82.                 retMsg = methodReturn;  
  83.  
  84.             }  
  85.             if (null != methodReturn)  
  86.             {  
  87.                 if (null != methodReturn.Exception )  
  88.                 {  
  89.                     if (null != this.LogManage )  
  90.                     {  
  91. this.LogManage.Error(ceha .MethodErrorText  + methodReturn.Exception.ToString());  
  92.                     }  
  93.  
  94.                 }  
  95.             }  
  96.             return retMsg;  
  97.  
  98.         }  
  99.     } 

延伸閱讀

面向切面編程:Aspect Oriented Programming

AOP是OOP的延續,是(Aspect Oriented Programming)的縮寫,意思是面向切面編程。

主要的功能是:日志記錄,性能統計,安全控制,事務處理,異常處理等等。

主要的意圖是:將日志記錄,性能統計,安全控制,事務處理,異常處理等代碼從業務邏輯代碼中劃分出來,通過對這些行為的分離,我們希望可以將它們獨立到非指導業務邏輯的方法中,進而改變這些行為的時候不影響業務邏輯的代碼。

可以通過預編譯方式和運行期動態代理實現在不修改源代碼的情況下給程序動態統一添加功能的一種技術。AOP實際是GoF設計模式的延續,設計模式孜孜不倦追求的是調用者和被調用者之間的解耦,AOP可以說也是這種目標的一種實現。

在Spring中提供了面向切面編程的豐富支持,允許通過分離應用的業務邏輯與系統級服務(例如審計(auditing)和事務(transaction)管理)進行內聚性的開發。應用對象只實現它們應該做的——完成業務邏輯——僅此而已。它們并不負責(甚至是意識)其它的系統級關注點,例如日志或事務支持。

原文標題:.net中利用代理實現AOP

鏈接:http://www.cnblogs.com/ASPNET2008/archive/2010/04/25/1720820.html

責任編輯:彭凡 來源: 博客園
相關推薦

2023-11-07 16:00:25

面向切面編程開發

2012-02-10 10:32:33

JavaSpring

2009-08-24 09:46:40

面向切面編程AOP

2011-04-26 09:33:04

SpringAOP

2009-06-22 15:10:00

java 編程AOP

2013-09-17 10:37:03

AOPAOP教程理解AOP

2012-08-10 13:32:08

.NETAOP架構

2012-09-28 10:20:14

IBMdw

2013-07-30 09:42:41

實現編程接口編程對象編程

2023-10-20 09:32:25

Java技術

2012-03-09 17:37:20

ibmdw

2009-06-16 15:02:18

面向對象編程PHP異常PHP代理

2023-04-19 08:43:52

Python面向對象編程

2009-07-02 13:25:00

消除實現繼承面向接口編程Java

2012-07-11 14:31:16

SpringAop

2021-01-14 08:16:41

Python接口編程

2009-10-13 14:19:03

VB.NET面向對象編

2009-10-13 11:28:39

VB.NET面向對象編

2021-06-30 00:19:43

AOP動態代理

2019-11-29 16:21:22

Spring框架集成
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲精品大全 | 毛片免费视频 | 日韩中文字幕2019 | 毛片a级毛片免费播放100 | 国产黄色一级片 | 日本精品一区二区在线观看 | 一区二区三区四区视频 | 日韩精品一区二区三区中文在线 | 成人免费一区二区三区视频网站 | 国产精品亚洲一区二区三区在线 | 国产精品一区在线播放 | www国产成人 | av官网在线 | 91传媒在线观看 | 精品产国自在拍 | 亚洲精品免费在线 | 国产有码 | 国产午夜精品一区二区三区嫩草 | 黄色av网站免费看 | 中文字幕在线一区二区三区 | 欧美高清性xxxxhd | 青青草av网站| 亚洲人成人一区二区在线观看 | 日本三级网 | 黄色网址av| 国产精品1区2区3区 国产在线观看一区 | 欧美日韩在线精品 | 九九久久久久久 | 毛片高清| 韩日在线 | 日韩中文字幕一区二区 | 久久一区二区三区四区 | 国产成人综合一区二区三区 | 亚洲成人激情在线观看 | 国产精品123区 | 久久综合狠狠综合久久 | 视频一区二区三区中文字幕 | 亚洲美女网站 | 91日韩在线 | 久久久久国产 | 久久一区精品 |