資源描述:
《C#程序中實現(xiàn)插件架構(gòu)》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、在C#程序中實現(xiàn)插件架構(gòu)【導(dǎo)讀】這篇文章將講述如何利用C#奇妙的特性,實現(xiàn)插件架構(gòu),用插件(plug-ins)機(jī)制建立可擴(kuò)展的解決方案。在.NET框架下的C#語言,和其他。NET語言一樣提供了很多強(qiáng)大的特性和機(jī)制。其中一些是全新的,而有些則是從以前的語言和平臺上照搬過來的。然而,這種巧妙的結(jié)合產(chǎn)生了一些有趣的方法可以用來解決我們的問題。這篇文章將講述如何利用這些奇妙的特性,用插件(plug-ins)機(jī)制建立可擴(kuò)展的解決方案。后面也將提供一個簡要的例子,你甚至可以用這個東西來替換那些已經(jīng)在很多系統(tǒng)中廣泛使用
2、的獨立的程序。在一個系統(tǒng)中,可能有很多程序經(jīng)常需要進(jìn)行數(shù)據(jù)處理??赡芷渲杏幸粋€程序用于處理雇員的信息,而另一個用來管理客戶關(guān)系。在大多數(shù)情況下,系統(tǒng)總是被設(shè)計為很多個獨立的程序,他們之間很少有交互,經(jīng)常使用復(fù)制代碼的辦法來共享。而實際上這樣的情況可以把那些程序設(shè)計為插件,再用一個單一的程序來管理這些插件。這種設(shè)計可以讓我們更好的在不同的解決方案中共享公用的方法,提供統(tǒng)一的感觀。圖片一是一個例子程序的截圖。用戶界面和其他常見的程序沒有什么不同。整個窗體被垂直的分割為兩塊。左邊的窗格是個樹形菜單,用于顯示插件
3、列表,在每個插件的分支下面,列出了這個插件所管理的數(shù)據(jù)。而右邊的窗格則用于編輯左邊被選中的插件的數(shù)據(jù)。各個插件提供各自的編輯數(shù)據(jù)的界面。圖片一展示了一個精巧的工作區(qū)。開始那么,主程序必須能夠加載插件,然后和這些插件進(jìn)行通信,這樣才能實現(xiàn)我們的設(shè)計.所有這些的實現(xiàn)可以有很多不同的方法,僅取決于開發(fā)者選擇的語言和平臺.如果選擇的是C#和.NET,那么反射(reflection)機(jī)制可以用來加載插件,并且其接口和抽象類可以用于和插件通信.為了更好的理解主程序和插件之間的通信,可以先了解一下設(shè)計模式.設(shè)計模式最早
4、由ErichGamma提出1,它利用架構(gòu)和對象思想來實現(xiàn)通用的通信模型.不管組件是否具有不同的輸入和輸出,只要他們有相似的結(jié)構(gòu).設(shè)計模式可以幫助開發(fā)者利用廣受證明的面向?qū)ο罄碚搧斫鉀Q問題.事實上它就是描述解決方案的語言,而不用管問題的具體細(xì)節(jié)或者編程語言的細(xì)節(jié).設(shè)計模式策略的關(guān)鍵點在于如何把整個解決方案根據(jù)功能來分解,這種分解是通過把主程序的不同功能分開執(zhí)行而完成的.這樣主程序和子程序之間的通信可以通過設(shè)計良好的接口來完成.通過這種分解我們立即可以得到這兩個好處:第一,軟件項目被分成較小的不相干的單位,工
5、作流程的設(shè)計可以更容易,而較小的代碼片斷意味著代碼更容易建立和維護(hù).第二個好處在于改變程序行為的時候并不會關(guān)系到主程序的運(yùn)行,主程序不用關(guān)心子程序如何,他們之間只要有通用的通訊機(jī)制就足夠了.建立接口在C#程序中,接口是用來定義一個類的功能的.接口定義了預(yù)期的方法,屬性,事件信息.為了使用接口,每個具體的函數(shù)必須嚴(yán)格按照接口的定義完成所描述的功能.列表一展示了上面例子程序的接口:IPlug.這個接口定義了四個方法:GetData,GetEditControl,Save和Print.這四個定義并沒有描述具體是
6、怎么完成的,但是他們保證了這個類支持IPlug接口,也就是保證支持這些方法的調(diào)用.定制屬性在查看代碼之前,討論總是先得轉(zhuǎn)移到屬性定制上面.屬性定制是.NET提供的一個非常棒的新特性之一,屬性對于所有的編程語言都是一種通用的結(jié)構(gòu).舉個例子,一個函數(shù)用于標(biāo)識可訪問權(quán)限的public,private,或者protect標(biāo)志就是這個函數(shù)的一個屬性.屬性定制之所以如此讓人興奮,那是因為編程人員將不再只能從語言本身提供的有限的屬性集中選擇.一個定制的屬性其實也是一個類,它從System.Attribute繼承,它的代
7、碼被允許是自我描述的.屬性定制可以應(yīng)用于絕大多數(shù)結(jié)構(gòu)中,包括C#里面的類,方法,事件,域和屬性等等.示例代碼片斷定義了兩個定制的屬性:PlugDisplayNameAttribute和PlugDescriptionAttribute,所有的插件內(nèi)部的類必須支持這兩個屬性.列表二是用于定義PlugDisplayNameAttribute的類.這個屬性用于顯示插件節(jié)點的內(nèi)容.在程序運(yùn)行的時候,主程序?qū)⒖梢岳梅瓷?reflection)來取得屬性值.插件(Plug-Ins)上面的示例程序包括了兩個插件的執(zhí)行.
8、這些插件在EmployeePlug.cs和CustomerPlug.cs中定義.列表三展示了EmployeePlug類的部分定義.下面是一些關(guān)鍵點.1.這個類實現(xiàn)了IPlug接口.由于主程序根本不會知道插件內(nèi)部的類是如何定義的,這非常匾?主程序需要使用IPlug接口和各個插件通信.這種設(shè)計利用了面向?qū)ο蟾拍罾锩娴?多態(tài)性".多態(tài)性允許運(yùn)行時,可以通過指向基類的引用,來調(diào)用實現(xiàn)派生類中的方法.2.這個類被兩個屬性標(biāo)識,這樣主程序