• <label id="pxtpz"><meter id="pxtpz"></meter></label>
      1. <span id="pxtpz"><optgroup id="pxtpz"></optgroup></span>

        當前位置:雨林木風下載站 > 技術開發教程 > 詳細頁面

        基于.Net的AOP完成技術

        基于.Net的AOP完成技術

        更新時間:2021-09-25 文章作者:未知 信息來源:網絡 閱讀次數:

        基于.Net的AOP實現技術

        前言

        在筆者的《面向對象的應用服務層設計》一文中,筆者討論了軟件系統中設計應用服務層所需要考慮的問題,以及系統分層的基本思考方法。這些討論作關注的問題,都是系統中縱向的層次的劃分。然而,在設計軟件系統的時候,我們不僅僅要考慮縱向的關系,很多時候,我們還需要關注所謂的“橫切關注點”的問題,例如,存在于系統每個部分的日志記錄、安全性驗證等。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的動態織入,歸納起來,可以采用以下幾種方法:

        l 使用ContextAttribute和ContextBoundObject來對對象的方法進行攔截。關于ContextAttribute的具體使用方法,讀者可以參考MSDN等相關資料。

        l 使用Emit來,在運行時刻動態構建被織入代碼后的類,當程序調用被織入類時,實際上調用的是被修改后的類。LOOM使用的就是這種方式,但是,個人認為,LOOM目前的實現非常生硬,其可擴展性和靈活性都不是很好。

        l 使用Proxy模式。這也是本文將詳細介紹的方法。

        l 當然,在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="Method|Construction"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();

        }

        }


        運行以上代碼,其結果如下:


        可以看到,FirstAspect如我們所預期的那樣,成功的攔截了BusinessClass的方法。

        溫馨提示:喜歡本站的話,請收藏一下本站!

        本類教程下載

        系統下載排行

        主站蜘蛛池模板: 亚洲免费在线播放| 亚洲国产天堂在线观看| 亚洲人成自拍网站在线观看| 免费无码又爽又刺激高潮视频 | 性感美女视频在线观看免费精品| 亚洲综合小说久久另类区| 久久精品国产免费观看| 亚洲综合久久一本伊伊区| 免费a级毛片高清视频不卡| 亚洲AV日韩AV一区二区三曲| 四虎影在线永久免费四虎地址8848aa | 日本阿v免费费视频完整版| 亚洲三级在线观看| 国产精品免费_区二区三区观看 | 亚洲免费视频在线观看| 国产精品久久永久免费| 亚洲成a∨人片在无码2023| 亚洲国产精品自在拍在线播放| 国产精品成人啪精品视频免费| 亚洲va久久久噜噜噜久久男同| 精品免费人成视频app| 在线亚洲午夜片AV大片| 自拍偷自拍亚洲精品第1页| 在线观看免费黄网站| 911精品国产亚洲日本美国韩国| 男女超爽刺激视频免费播放| 亚洲AV无码成人精品区日韩| 三上悠亚亚洲一区高清| **毛片免费观看久久精品| 亚洲成AV人影片在线观看| 亚洲精品制服丝袜四区| 久久天天躁狠狠躁夜夜免费观看| 国产亚洲福利精品一区二区| 亚洲欧洲日产国码av系列天堂| 最近免费中文字幕大全高清大全1| 亚洲精品国产综合久久久久紧| 亚洲午夜久久久影院| 在线观看视频免费完整版| 国产99精品一区二区三区免费 | 亚洲av之男人的天堂网站| 无码国产精品一区二区免费I6|