基于組件的.NET軟件開發(1)
2024-07-10 13:05:04
供稿:網友
基于組件的.net軟件開發
前言
隨著軟件技術的飛速進步,現代的大型軟件都廣泛采用了基于軟件組件的開發方式。以成熟的cbd(component based design:基于組件的系統設計)理論為指導,在對系統的分析與設計完成之后,系統開發體現為復用已有組件、開發新組件以及將所有組件裝配起來的過程。j2ee大規模地使用各種組件構照復雜的企業信息系統,獲得了巨大的成功。
作為后來者,.net framework汲取了j2ee的成功經驗,在組件化開發方面有著自己獨到的設計,在本文中,我們將介紹.net組件化開發技術的最重要的兩個范疇:混合語言開發與組件反射。筆者有充分的理由確信讀者在了解了.net的強大組件開發功能之后,一定會對.net framework的設計和開發者敬佩不已,并會激起應用.net來開發軟件系統的強烈興趣。
混合語言開發
java語言跨平臺的設計,是j2ee在企業級系統中占據優勢的重要原因,為了與j2ee競爭,.net framework在設計體系結構上采用了分層的設計模式,從而在理論上使跨平臺成為了可能(事實上,已有真實可用的系統,mono就是運行在非windows操作系統之上的.net framework),.net設計師們還發現了j2ee的一個死穴——j2ee組件必須用java語言開發!這種使用語言上的“獨裁”無疑讓喜愛其它語言的程序員們很不高興。為此,.net在軟件開發史上首次在設計軟件運行平臺時就考慮到了混合語言開發,在筆者看來,這真是一次影響深遠的技術變革。
本文不打算全面介紹.net framework中混合語言開發的內部機理,而只是從應用角度,通過幾個短小卻典型的實例,來看看我們如何在一個工程中集成多種語言開發的.net組件。
組件的組合
當我們需要復用已有的組件的功能來開發新系統時,我們經常讓新開發的組件簡單地包容另一個已有的組件,以達到代碼重用的功能,這種開發方式在面向對象設計理論中被稱為“組合”。我們看看一個小例子:
我們要設計一個c#組件,其接口如圖1所示:
圖 1 c#組件的uml圖示
打開vs.net,創建一個c#類庫工程:csharpcomponent,刪除原有的class1,往工程中添加一個新類csharpclass,在其中增加一個函數saysomething,代碼如下:
public void saysomething(string str)
{
messagebox.show(" 這是 c#實現的功能,傳入的字串是:"+str);
}
然后,從菜單中選“生成”à“生成解決方案”,編譯完成后會生成一個動態鏈接庫:csharpclass.dll。
現在,我們已有了一個可復用的軟件組件,雖然它的功能簡直不值一提,但它的的確確是一個軟件組件,在本質上與那些賣上幾千美元的商業組件并無區別。
在這里我們需要明確:csharpclass.dll實際上可以稱之為組件庫,而類csharpclass則可以看成是一個可以復用的組件。顯然,一個組件庫(dll文件)可以容納多個組件(即完成某種功能的類)。
接著我們再創建一個windows應用程序項目,但這時我們用的不再是c#,而是vb.net了。我們給工程起名為:vbtestcomponent,從工具箱中把一個按鈕拖到窗體上,我們打算在用戶單擊此按鈕時,讓它直接調用c#組件 csharpclass.dll中的saysomething()方法,并從vb中傳送一個字串給此方法。
為了能使用開發好的c#組件,我們必須給vb工程添加對csharpclass.dll的引用。在解決方案資源管理器窗口中的項目節點:vbtestcomponent上右擊,從彈出菜單中選:“添加引用…”,將出現以下窗體:
圖 2 添加對c#組件csharpclass.dll的引用
單擊“瀏覽…”按鈕,找到csharpclass.dll,確定后如圖2所示。單擊“確定”按鈕關閉窗口,現在,我們就給vb工程增加了一個對c#組件的引用,可以在解決方案資源管理器窗口中很清楚地看到這點:
圖 3 添加了對c#組件引用后的“解決方案管理器”
后面的事情就很簡單了,在按鈕的單擊事件中書寫以下代碼:
private sub button1_click_1(……) handles button1.click
dim obj as csharpclassnamespace.csharpclass
obj = new csharpclassnamespace.csharpclass()
obj.saysomething("我是從vb中調用c#組件中的方法而出現的。 ")
end sub
ok,我們現在就實現了在vb中調用c#組件的功能,這簡直太簡單了吧!
聰明的你這時腦瓜一定在轉了:既然從vb中可以這么容易地調c#組件,那么,反過來也一定行。或者,我可以做一個vb組件,然后,它又調用一個c#組件,而c#組件又可以調用某個c++開發的組件,……,調來調去,渾然一體。當代愚公曰:“子子孫孫無窮盡也,何愁項目完不成?!”
現在再不用強迫所有程序員在一個項目中都用一種語言了,盡可以給每人分配一個獨立的組件,讓他們用自己喜歡的語言去開發,只要遵守事先定好的接口就行了。
筆者回想過去使用vb來調用win32 api的慘狀,不禁歡呼那種痛苦的日子一去不復返了!