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

首頁 > 學院 > 開發設計 > 正文

基于.Net的AOP實現技術

2019-11-18 12:07:40
字體:
來源:轉載
供稿:網友

  在筆者的《面向對象的應用服務層設計》一文中,筆者討論了軟件系統中設計應用服務層所需要考慮的問題,以及系統分層的基本思考方法。這些討論作關注的問題,都是系統中縱向的層次的劃分。然而,在設計軟件系統的時候,我們不僅僅要考慮縱向的關系,很多時候,我們還需要關注所謂的“橫切關注點”的問題,例如,存在于系統每個部分的日志記錄、安全性驗證等。AOP(面向方面編程)的出現,便是為了解決這些“橫切關注點”的問題。
  
  雖然AOP目前還不是如OOP般非常成熟,但是,也已經有數個支持AOP的產品問世,其中比較有名的有aspectJ,AspectWerkz等,這些產品都基于java平臺。在.Net平臺上,也有一些實現,如LOOM等,但是,相對于Java平臺的實現,這些實現都還很不成熟,功能也比較弱,使用上也不是很方便。因此,筆者在.Net平臺下自己實現了一個輕量級的AOP框架,現在拿出來同大家共同探討。
  
  在本文中,筆者將首先歸納一下目前實現AOP的基本手段,然后,給出一個已經實現的AOP的范例(WebsharpAspect),并提供全部源代碼,這是一個輕量級的AOP實現,雖然目前功能還不是很強大,實現也比較簡單,但是,他已經可以完成大部分我們所需要的AOP功能,你可以在項目中直接使用他。重要的是,其中展示了在.Net環境下實現AOP的一些技術和思路,筆者也希望通過提供源代碼的方式,能夠對大家學習AOP有所助益。
  
  實現AOP的方法
  實現AOP的要害,是攔截正常的方法調用,將我們需要額外附加的功能透明的“織入”到這些方法中,以完成一些額外的要求。從總體方法上來說,織入的方法有兩大類:靜態織入和動態織入。
  
  靜態織入方法,一般都是需要擴展編譯器的功能,將需要織入的代碼,通過修改字節碼(Java)或者IL代碼(.Net)的方法,直接添加到相應的被織入點;或者,我們需要為原來語言添加新的語法結構,從語法上支持AOP。AspectJ就是采用的這種方式。使用這種方式來實現AOP,其優點是代碼執行的效率高,缺點是實現者需要對虛擬機有很深的了解,才能夠做到對字節碼修改。由于織入方法是靜態的,當需要添加新的織入方法時,往往需要重新編譯,或者說運行字節碼增強器重新執行靜態織入的方法。當然,在.Net平臺上,我們也可以使用Emit提供的強大功能來實現這一點。另外,字節碼增強器帶來了很大的不透明性,程序員很難直觀的調試增強后的字節碼,因此很多程序員總是在心理上抵制這種字節碼增強器。
  
  動態織入的方法,具體實現方式就有很多選擇了。在Java平臺上,可以使用PRoxy模式,或者定制ClassLoader來實現AOP功能。在.Net平臺上,要實現AOP的動態織入,歸納起來,可以采用以下幾種方法:
  
  * 使用ContextAttribute和ContextBoundObject來對對象的方法進行攔截。關于ContextAttribute的具體使用方法,讀者可以參考MSDN等相關資料。
  * 使用Emit來,在運行時刻動態構建被織入代碼后的類,當程序調用被織入類時,實際上調用的是被修改后的類。LOOM使用的就是這種方式,但是,個人認為,LOOM目前的實現非常生硬,其可擴展性和靈活性都不是很好。
  * 使用Proxy模式。這也是本文將具體介紹的方法。
  * 當然,在asp.net項目中,我們還有一種選擇,就是使用HTTPHandler和HTTPModule來對自定義對ASP.Net頁面的訪問,加入一些我們需要的處理。關于如何使用HTTPHandler和HTTPModule的內容,可以參考筆者的文章《ASP.Net中自定義Http處理及應用之HttpHandler篇》,以及《ASP.Net中自定義Http處理及應用之HttpModule篇》
  
  下面,我們來探討如何使用Proxy模式,在.Net平臺上實現一個可用的AOP框架。
  
  第一個例子
  
  首先,我們來看看WebsharpAspect的使用效果。我們可以使用以下步驟來完成我們的第一個例子的編寫:
  
  1、 在VisualStudio中新建一個控制臺應用程序,把Websharp.Aspect.dll添加入引用。
  
  2、 添加一個類,命名為FirstAspect,并使他實現IAspect接口,添加代碼如下:
  
  public class FirstAspect : IAspect
   {
     public void Execute(object[] paramList)
     {
       Console.WriteLine("FirstAspect is called");
     }
   }
  
  3、 添加一個BusinessClass類,模擬具體的業務邏輯類,使這個類繼續AspectObject類,并添加AspectManaged特性,然后添加兩個方法,代碼如下:
  
  [AspectManaged(true)]
   public class BusinessClass : AspectObject
   {
     public BusinessClass(){}
     public void OutputMethod()
     {
       Console.WriteLine("OutputMethod()");
     }
     public void GetString()
     {
       Console.WriteLine("GetString()");
     }
   }
  
  4、 為項目添加一個App.config配置文件,,并且添加以下內容:
  
  <?XMLversion="1.0"encoding="utf-8"?>
  <configuration>
   < configSections >
  <sectionname="Websharp.Aspects"type="Websharp.Aspect.AspectConfigHandler
  ,Websharp.Aspect"/>
   </ configSections >
   < Websharp.Aspects >
     < Aspect type ="WeaveTest.FirstAspect,WeaveTest" deploy-model ="Singleton"
      pointcut-type="MethodConstrUCtion"action-position="Both"match="*,*"/>
   </ Websharp.Aspects >
  </configuration>
  
  
  5、 在Main方法中添加如下代碼:
  
  public class MainClass
   {
     [STAThread]
     static void Main ()
     {
       BusinessClass cls=new BusinessClass();
       cls.OutputMethod();
       cls.GetString();
       Console.ReadLine();
     }
   }
  
  
  運行以上代碼,其結果如下:
  
基于.Net的AOP實現技術

  可以看到,FirstAspect如我們所預期的那樣,成功的攔截了BusinessClass的方法。
  
  源代碼和全文見:http://www.websharp.org 也可以從http://www.uml.org.cn/dvbbs6.0.0/index.asp 下載全部源代碼

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美性猛交99久久久久99按摩| 亚洲国产精品视频在线观看| 97视频在线观看视频免费视频| 欧美成人免费小视频| 人人澡人人澡人人看欧美| 夜夜嗨av一区二区三区免费区| 欧美综合一区第一页| 欧美性极品少妇精品网站| 日韩精品在线视频| 九九精品视频在线| 欧美日韩在线视频首页| 亚洲欧美中文字幕在线一区| 中文字幕国产日韩| 亚洲欧美国产精品久久久久久久| 亚洲福利视频网站| 国产成人精品一区二区| 欧美电影免费看| 日本精品va在线观看| 久久精品成人动漫| 久久久999精品免费| 国产精品99久久久久久久久| 精品国产乱码久久久久久天美| 久久不射热爱视频精品| 92看片淫黄大片看国产片| 在线视频日韩精品| 国产综合久久久久| 亚洲国产精品人人爽夜夜爽| 欧美福利视频在线观看| 在线观看国产精品日韩av| 精品国产一区二区三区久久狼黑人| 精品久久久久久久久久ntr影视| 久久影视电视剧免费网站清宫辞电视| 色综合久久久久久中文网| 日韩av在线一区二区| 亚洲第一福利网站| 日韩视频免费观看| 亚洲成人久久久久| 中文字幕av一区| 日韩中文第一页| 日韩欧美精品网址| 高潮白浆女日韩av免费看| 欧美中文字幕在线观看| 日韩精品免费在线视频观看| 亚洲精品视频免费在线观看| 精品久久久香蕉免费精品视频| 欧美丰满少妇xxxxx做受| 91成人福利在线| 日韩一区二区三区xxxx| 日韩av综合网| 日韩亚洲国产中文字幕| 亚洲视频自拍偷拍| 久久国产精品亚洲| 日韩精品视频在线播放| 91精品国产综合久久久久久久久| 97在线视频观看| 精品成人69xx.xyz| 亚洲欧美制服第一页| 久久免费精品日本久久中文字幕| 国产一区二区三区三区在线观看| 国产精品久久久久7777婷婷| 欧美性生交大片免网| 国产精品久久97| 中国china体内裑精亚洲片| 亚洲色无码播放| 久久精品91久久香蕉加勒比| 亚洲mm色国产网站| 色午夜这里只有精品| 国产欧美va欧美va香蕉在线| 欧美主播福利视频| 欧美成人精品激情在线观看| 亚洲精品少妇网址| 不卡av日日日| 国产成人午夜视频网址| 国产精品自拍小视频| 日韩精品亚洲精品| 俺也去精品视频在线观看| 中国日韩欧美久久久久久久久| 亚洲精品国产精品国自产观看浪潮| 日本精品一区二区三区在线| 另类图片亚洲另类| 亚洲最新av在线| 久久99国产综合精品女同| 成人午夜小视频| 久久久精品久久久久| 俺去啦;欧美日韩| 欧美专区中文字幕| 久久精彩免费视频| 久久久久久亚洲精品不卡| 欧美成年人在线观看| 国产精品日韩专区| 久久国产一区二区三区| 久久视频免费观看| 中文字幕v亚洲ⅴv天堂| 91免费福利视频| 国产精品一区二区三区在线播放| yw.139尤物在线精品视频| 麻豆国产精品va在线观看不卡| 欧美性猛交xxxx乱大交蜜桃| 国产视频久久网| 91精品国产自产在线观看永久| 国产精品免费久久久久影院| 色狠狠av一区二区三区香蕉蜜桃| 自拍偷拍亚洲在线| 日韩av影片在线观看| 中文字幕日韩免费视频| 久久精品精品电影网| 国产偷亚洲偷欧美偷精品| 久久久久久久国产精品| 亚洲精品91美女久久久久久久| 欧美精品videossex性护士| 中文字幕日韩综合av| 欧洲一区二区视频| 欧美激情一二区| 91免费人成网站在线观看18| 亚洲视频免费一区| 韩剧1988免费观看全集| 国产精品网红直播| 欧美性猛交xxxx免费看久久久| 欧美一级视频一区二区| 色综合亚洲精品激情狠狠| 欧美日韩国产麻豆| 国产aⅴ夜夜欢一区二区三区| 九九热精品视频在线播放| 亚洲网在线观看| 国产成人jvid在线播放| 午夜精品一区二区三区视频免费看| 9.1国产丝袜在线观看| 国内偷自视频区视频综合| 一区二区欧美日韩视频| 国产亚洲日本欧美韩国| 亚洲精品久久久久中文字幕二区| 国产在线视频不卡| 精品久久久久久久大神国产| 久久精品视频在线| 日韩成人性视频| 成人国产在线激情| 欧美成人性生活| 亚洲日本aⅴ片在线观看香蕉| 久久久久久欧美| 欧美电影免费播放| 琪琪亚洲精品午夜在线| 成人国产精品日本在线| 97在线免费视频| 午夜精品久久久久久99热软件| 992tv成人免费影院| 亚洲欧美精品一区| 亚洲黄色www网站| 久久精品中文字幕| 亚洲无av在线中文字幕| 成人av在线亚洲| 欧美日韩午夜视频在线观看| 国产精品男人爽免费视频1| 国产成人中文字幕| 亚洲第一视频网站| 欧美精品一区二区免费| 在线观看国产精品日韩av| 成人黄色在线播放| 亚洲自拍小视频免费观看| 在线观看中文字幕亚洲| 欧美黑人巨大精品一区二区| 日韩精品极品毛片系列视频| 国产精品美女网站| 欧洲中文字幕国产精品| 欧美成人自拍视频|