天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

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

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

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

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

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

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

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

                            

 

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

  

                           

  自定義異常代理類:

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

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

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

代碼/// <summary>
    
/// ASPect代理,在這個類里面,實現對方法的攔截
    
/// </summary>
    public class ASPectProxyErrorLog : RealProxy    
    {
        ASPectManagedAttribute attr;
        
/// <summary>
        
/// 默認構造函數
        
/// </summary>
        public ASPectProxyErrorLog() : base()
        {
        }
        
/// <summary>
        
/// 構造函數
        
/// </summary>
        
/// <param name="myType">被代理的類的類型</param>
        public ASPectProxyErrorLog(Type myType) : base(myType)
        {
        }
        
/// <summary>
        
/// 構造函數
        
/// </summary>
        
/// <param name="myType">被代理的類的類型</param>
        
/// <param name="obj">被代理的對象</param>
        public ASPectProxyErrorLog(Type myType,MarshalByRefObject obj) : base(myType)
        {
            target
=obj;
        }
        MarshalByRefObject target;
        ILog LogManage;
        
/// <summary>
        
/// 當在派生類中重寫時,在當前實例所表示的遠程對象上調用在所提供的 IMessage 中指定的方法。<br />
        
/// WebsharpASPect在這里執行對方法執行的攔截處理
        
/// </summary>
        
/// <param name="msg">IMessage,包含有關方法調用的信息。</param>
        
/// <returns>調用的方法所返回的消息,包含返回值和所有 out 或 ref 參數。</returns>
        public override IMessage Invoke(IMessage msg)
        {
            IMessage retMsg
=null ;
            IMethodCallMessage methodCall 
= (IMethodCallMessage)msg;
            IMethodReturnMessage methodReturn 
= null;
            
object[] copiedArgs = Array.CreateInstance(typeof(object), methodCall.Args.Length) as object[];
            methodCall.Args.CopyTo(copiedArgs, 
0);
            
object[] attrs = null;
            CoustomerErrorHandleAttribute ceha 
= null;
            
if (msg is IConstructionCallMessage)
            {

 

                IConstructionCallMessage ccm 

= (IConstructionCallMessage)msg;
                RemotingServices.GetRealProxy(target).InitializeServerObject(ccm);
                ObjRef oRef 
= RemotingServices.Marshal(target);
                RemotingServices.Unmarshal(oRef);
                retMsg 
= EnterpriseServicesHelper.CreateConstructionReturnMessage(ccm, (MarshalByRefObject)this.GetTransparentProxy());

 

            }

else
            {
                IMethodCallMessage mcm 
= (IMethodCallMessage)msg;                
                attrs 
= methodCall.MethodBase.GetCustomAttributes(typeof(CoustomerErrorHandleAttribute), false);               
                ceha 
= LogManagerFactory.GetCoustomerErrorHandleAttribute(attrs, methodCall.MethodBase.Name );
                
if (null != ceha)
                {
                    LogManage 
= ceha.ILogName;
                }
                
try
                {
                    
object returnValue = methodCall.MethodBase.Invoke(this.target, copiedArgs);
                    methodReturn 
= new ReturnMessage(returnValue, copiedArgs, copiedArgs.Length, methodCall.LogicalCallContext, methodCall);
                    
                }
                
catch (Exception ex)
                {
                    
if (null != ex.InnerException)
                    {
                        methodReturn 
= new ReturnMessage(ex.InnerException, methodCall);
                    }
                    
else
                    {
                        methodReturn 
= new ReturnMessage(ex, methodCall);
                    }
                }
                retMsg 
= methodReturn;

 

            }

if (null != methodReturn)
            {
                
if (null != methodReturn.Exception )
                {
                    
if (null != this.LogManage )
                    {
                        
this.LogManage.Error(ceha .MethodErrorText  + methodReturn.Exception.ToString());
                    }

 

                }
            }

return retMsg;

 

        }
    }

NET技術.NET中通過代理實現面向方面編程(AOP),轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 国产成人在线免费观看 | 成人五级毛片免费播放 | 飘雪在线观看免费完整版 | 午夜福利小视频400 午夜福利网国产A | 久久这里只有精品2 | 久久夜色精品国产亚州AV卜 | 日本福利片午夜免费观着 | 久久无码AV亚洲精品色午夜麻豆 | 久久精品AV麻豆 | 色婷婷国产精品视频一区二区三区 | 亚洲 欧美 日韩 卡通 另类 | 国产精品久久久久久久伊一 | 美女PK精子小游戏 | 手机伊在人线香蕉2 | 攵女yin乱合集高h | 草莓视频免费看 | 我的奶头被客人吸的又肿又红 | 中国xxxxx| 国产偷国产偷亚洲高清SWAG | 成都电影免费中文高清 | 九九免费高清在线观看视频 | 中文在线无码高潮潮喷在线 | 国产精品第1页在线观看 | 青青草伊人 | 国产偷国产偷亚州清高APP | 中字幕视频在线永久在线 | 久久re视频这里精品09免费 | 免费女性裸身照无遮挡网站 | 亚洲精品无码久久久久A片空 | 国产色精品久久人妻99蜜桃麻豆 | 久久九九亚洲精品 | 国产AV精品无码免费看 | 99视频精品全部免费 在线 | 人妻美妇疯狂迎合 | 黄色a三级免费看 | 韩国伦理片2018在线播放免费观看 | 日韩欧美高清一区 | 免费麻豆国产黄网站在线观看 | 午夜一区二区三区 | 內射XXX韩国在线观看 | 国产亚洲精品久久久久久国 |