基於組件的.NET軟體開發(1)
最後更新:2017-02-28
來源:互聯網
上載者:User
基於組件的.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的慘狀,不禁歡呼那種痛苦的日子一去不複返了!