一区二区久久-一区二区三区www-一区二区三区久久-一区二区三区久久精品-麻豆国产一区二区在线观看-麻豆国产视频

.NET中通過代理實(shí)現(xiàn)面向方面編程(AOP)

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

  如果開發(fā)過分布式服務(wù),像remotion,wcf等,消息都是它們通信的重要手段。客戶端通過方法調(diào)用形式體現(xiàn)的服務(wù)訪問需要轉(zhuǎn)換成具體的消息,然后經(jīng)過編碼才能利用傳輸通道發(fā)送給服務(wù)端,服務(wù)執(zhí)行的結(jié)果也只能以消息的形式返回給調(diào)用方。

  這些分布式服務(wù)有一共同特點(diǎn):都通過代理方法間接的調(diào)用服務(wù)。服務(wù)代理,它自身并不提供服務(wù)的實(shí)現(xiàn),只是起到一個(gè)中介作用,客戶端把服務(wù)請(qǐng)求發(fā)送給服務(wù)代理,服務(wù)代理再去調(diào)真正的服務(wù),同樣服務(wù)返回時(shí),也是返回給服務(wù)代理,再由服務(wù)代理返回給客戶端。看到這,我想對(duì)于實(shí)現(xiàn)AOP的攔截就有點(diǎn)眉目了。在.NET中,我們可以寫自定義的RealProxy來實(shí)現(xiàn)AOP的方法攔截功能。

  服務(wù)代理通常又分為以下兩種:  
  1:透明代理。客戶端在跨任何類型的遠(yuǎn)程處理邊界使用對(duì)象時(shí),對(duì)對(duì)象使用的實(shí)際上是透明代理。透明代理使人以為實(shí)際對(duì)象駐留在客戶端空間中。它實(shí)現(xiàn)這一點(diǎn)的方法是:使用遠(yuǎn)程處理基礎(chǔ)結(jié)構(gòu)將對(duì)其進(jìn)行的調(diào)用轉(zhuǎn)發(fā)給真實(shí)對(duì)象。透明代理本身由 RealProxy 類型的托管運(yùn)行時(shí)類的實(shí)例收容。RealProxy 實(shí)現(xiàn)從透明代理轉(zhuǎn)發(fā)操作所需的部分功能。代理對(duì)象繼承托管對(duì)象(例如垃圾回收、對(duì)成員和方法的支持)的關(guān)聯(lián)語義,可以將其進(jìn)行擴(kuò)展以形成新類。這樣,該代理具有雙重性質(zhì),一方面,它需要充當(dāng)與遠(yuǎn)程對(duì)象(透明代理)相同的類的對(duì)象;另一方面,它本身是托管對(duì)象。

  2:真實(shí)代理。RealProxy來實(shí)現(xiàn)與遠(yuǎn)程服務(wù)進(jìn)行通信,所以這里就是我們實(shí)現(xiàn)AOP的地方。

  下圖是透明代理與真實(shí)代理以及遠(yuǎn)程對(duì)象的調(diào)用關(guān)系圖:

                            

 

  下圖是利用自定義的RealProxy實(shí)現(xiàn)AOP方法攔截的原理圖:

  

                           

  自定義異常代理類:

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

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

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

代碼/// <summary>
    
/// ASPect代理,在這個(gè)類里面,實(shí)現(xiàn)對(duì)方法的攔截
    
/// </summary>
    public class ASPectProxyErrorLog : RealProxy    
    {
        ASPectManagedAttribute attr;
        
/// <summary>
        
/// 默認(rèn)構(gòu)造函數(shù)
        
/// </summary>
        public ASPectProxyErrorLog() : base()
        {
        }
        
/// <summary>
        
/// 構(gòu)造函數(shù)
        
/// </summary>
        
/// <param name="myType">被代理的類的類型</param>
        public ASPectProxyErrorLog(Type myType) : base(myType)
        {
        }
        
/// <summary>
        
/// 構(gòu)造函數(shù)
        
/// </summary>
        
/// <param name="myType">被代理的類的類型</param>
        
/// <param name="obj">被代理的對(duì)象</param>
        public ASPectProxyErrorLog(Type myType,MarshalByRefObject obj) : base(myType)
        {
            target
=obj;
        }
        MarshalByRefObject target;
        ILog LogManage;
        
/// <summary>
        
/// 當(dāng)在派生類中重寫時(shí),在當(dāng)前實(shí)例所表示的遠(yuǎn)程對(duì)象上調(diào)用在所提供的 IMessage 中指定的方法。<br />
        
/// WebsharpASPect在這里執(zhí)行對(duì)方法執(zhí)行的攔截處理
        
/// </summary>
        
/// <param name="msg">IMessage,包含有關(guān)方法調(diào)用的信息。</param>
        
/// <returns>調(diào)用的方法所返回的消息,包含返回值和所有 out 或 ref 參數(shù)。</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技術(shù).NET中通過代理實(shí)現(xiàn)面向方面編程(AOP),轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 亚洲女人天堂网 | 麻豆一区二区 | 四虎影视永久免费观看网址 | 99热精品成人免费观看 | 天天爱天天做色综合 | 亚洲伊人久久一次 | 玖玖精品在线视频 | 91黄色在线观看 | 亚洲激情第二页 | 最色网在线观看 | 国产亚洲视频网站 | 1区2区3区集团有限公司 | 国产一二三区视频 | 亚洲第二区| 四虎影永久在线观看精品 | 日韩久久精品一区二区三区 | 国产精品自在自线免费观看 | 国产人成午夜免视频网站 | 日本一区二区三区久久 | 久久精彩视频 | 色婷婷影院在线视频免费播放 | 日本一区二区三区高清在线观看 | 97国产成人精品视频 | 午夜毛片免费观看视频 | 色吧欧美 | 亚洲国产香蕉视频欧美 | 9299yy看片淫黄大片在线 | 日本www在线 | 日韩经典欧美一区二区三区 | 久久久精品一区 | 伊人青草| 免费一区二区三区四区 | 日本一区二区三区四区五区 | 久久精品久久精品久久精品 | 国产精品亚欧美一区二区三区 | 美女国产在线观看免费观看 | 99成人免费视频 | 高清视频一区二区三区 | 久久婷婷激情 | 美女视频网站黄 | 男人女人的免费视频网站 |