国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

基于.Net的AOP實現(xiàn)技術(shù)

2024-07-10 12:59:28
字體:
供稿:網(wǎng)友
基于.net的aop實現(xiàn)技術(shù)

前言

在筆者的《面向?qū)ο蟮膽梅諏釉O(shè)計》一文中,筆者討論了軟件系統(tǒng)中設(shè)計應用服務層所需要考慮的問題,以及系統(tǒng)分層的基本思考方法。這些討論作關(guān)注的問題,都是系統(tǒng)中縱向的層次的劃分。然而,在設(shè)計軟件系統(tǒng)的時候,我們不僅僅要考慮縱向的關(guān)系,很多時候,我們還需要關(guān)注所謂的“橫切關(guān)注點”的問題,例如,存在于系統(tǒng)每個部分的日志記錄、安全性驗證等。aop(面向方面編程)的出現(xiàn),便是為了解決這些“橫切關(guān)注點”的問題。

雖然aop目前還不是如oop般非常成熟,但是,也已經(jīng)有數(shù)個支持aop的產(chǎn)品問世,其中比較有名的有aspectj,aspectwerkz等,這些產(chǎn)品都基于java平臺。在.net平臺上,也有一些實現(xiàn),如loom等,但是,相對于java平臺的實現(xiàn),這些實現(xiàn)都還很不成熟,功能也比較弱,使用上也不是很方便。因此,筆者在.net平臺下自己實現(xiàn)了一個輕量級的aop框架,現(xiàn)在拿出來同大家共同探討。

在本文中,筆者將首先歸納一下目前實現(xiàn)aop的基本手段,然后,給出一個已經(jīng)實現(xiàn)的aop的范例(websharpaspect),并提供全部源代碼,這是一個輕量級的aop實現(xiàn),雖然目前功能還不是很強大,實現(xiàn)也比較簡單,但是,他已經(jīng)可以完成大部分我們所需要的aop功能,你可以在項目中直接使用他。重要的是,其中展示了在.net環(huán)境下實現(xiàn)aop的一些技術(shù)和思路,筆者也希望通過提供源代碼的方式,能夠?qū)Υ蠹覍W習aop有所助益。

實現(xiàn)aop的方法

實現(xiàn)aop的關(guān)鍵,是攔截正常的方法調(diào)用,將我們需要額外附加的功能透明的“織入”到這些方法中,以完成一些額外的要求。從總體方法上來說,織入的方法有兩大類:靜態(tài)織入和動態(tài)織入。

靜態(tài)織入方法,一般都是需要擴展編譯器的功能,將需要織入的代碼,通過修改字節(jié)碼(java)或者il代碼(.net)的方法,直接添加到相應的被織入點;或者,我們需要為原來語言添加新的語法結(jié)構(gòu),從語法上支持aop。aspectj就是采用的這種方式。使用這種方式來實現(xiàn)aop,其優(yōu)點是代碼執(zhí)行的效率高,缺點是實現(xiàn)者需要對虛擬機有很深的了解,才能夠做到對字節(jié)碼修改。由于織入方法是靜態(tài)的,當需要添加新的織入方法時,往往需要重新編譯,或者說運行字節(jié)碼增強器重新執(zhí)行靜態(tài)織入的方法。當然,在.net平臺上,我們也可以使用emit提供的強大功能來實現(xiàn)這一點。另外,字節(jié)碼增強器帶來了很大的不透明性,程序員很難直觀的調(diào)試增強后的字節(jié)碼,因此很多程序員總是在心理上抵制這種字節(jié)碼增強器。

動態(tài)織入的方法,具體實現(xiàn)方式就有很多選擇了。在java平臺上,可以使用proxy模式,或者定制classloader來實現(xiàn)aop功能。在.net平臺上,要實現(xiàn)aop的動態(tài)織入,歸納起來,可以采用以下幾種方法:

l 使用contextattribute和contextboundobject來對對象的方法進行攔截。關(guān)于contextattribute的具體使用方法,讀者可以參考msdn等相關(guān)資料。

l 使用emit來,在運行時刻動態(tài)構(gòu)建被織入代碼后的類,當程序調(diào)用被織入類時,實際上調(diào)用的是被修改后的類。loom使用的就是這種方式,但是,個人認為,loom目前的實現(xiàn)非常生硬,其可擴展性和靈活性都不是很好。

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

l 當然,在asp.net項目中,我們還有一種選擇,就是使用httphandler和httpmodule來對自定義對asp.net頁面的訪問,加入一些我們需要的處理。關(guān)于如何使用httphandler和httpmodule的內(nèi)容,可以參考筆者的文章《asp.net中自定義http處理及應用之httphandler篇》,以及《asp.net中自定義http處理及應用之httpmodule篇》

下面,我們來探討如何使用proxy模式,在.net平臺上實現(xiàn)一個可用的aop框架。

第一個例子

首先,我們來看看websharpaspect的使用效果。我們可以使用以下步驟來完成我們的第一個例子的編寫:

1、 在visualstudio中新建一個控制臺應用程序,把websharp.aspect.dll添加入引用。

2、 添加一個類,命名為firstaspect,并使他實現(xiàn)iaspect接口,添加代碼如下:

public class firstaspect : iaspect

{

public void execute(object[] paramlist)

{

console.writeline("firstaspect is called");

}

}


3、 添加一個businessclass類,模擬具體的業(yè)務邏輯類,使這個類繼承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配置文件,,并且添加以下內(nèi)容:

<?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();

}

}


運行以上代碼,其結(jié)果如下:


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

最大的網(wǎng)站源碼資源下載站,

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 镇平县| 梨树县| 辉南县| 宣威市| 四会市| 隆昌县| 谢通门县| 郓城县| 麦盖提县| 金山区| 许昌县| 白玉县| 宁陕县| 博湖县| 临汾市| 板桥市| 富宁县| 潼南县| 太仓市| 嵊州市| 九江市| 台东县| 花莲县| 墨竹工卡县| 辽阳县| 望谟县| 三河市| 西华县| 孝感市| 城口县| 祁东县| 龙门县| 开化县| 海安县| 拜城县| 镇巴县| 卢龙县| 临安市| 神农架林区| 合作市| 定州市|