當我的閑話WinFrom與WPF,還在進行的時候,突然出來介紹插件式開發框架,總覺得又會半途而廢,最后偷懶,決定把這一篇定為閑話WinFrom與WPF的框架篇,倒也說的過去,反正還是使用WinForm,也沒跑題。
先說說由來。
也就在去年的5月,我離開了上一家公司來現在的公司繼續當一個苦逼程序猿,沒有使用過WPF,AIX,Oracle……好多的不會,看到公司的一套WPF系統,感覺很驚訝,之后隨着接觸項目,這份驚訝也越來越淡,感覺系統也很稀松平常。
之后和領導一次閑談時說起管理軟件近幾年的發展,如我這等只做了兩年程序的人都開始大言不慚的談軟件【這幾年】的發展,想起都有點可笑。
當時領導拿公司這個WPF項目舉例,說曾經公司一直想做一個自己的IDE工具,好簡化開發人員,但是技術有限,而且也大多都是抄開源的SharpDevelop。現在這套框架,就直接使用VS擴展去做,這就是管理軟件的一個發展。
本篇文章不是談論管理軟件的發展,不論領導說的正確與否,以上都屬閑話,所以還是到此為止。
簡介
插件式開發和VS擴展都不是新技術,擴展開發工具用在項目中我記得早在VC的年代就有很多項目這樣做了,最簡單的就是寫一套模板去開發,而插件式開發幾乎所有大型軟件都有。
技術不新,但是插件式開發,結合VS擴展,效果還是蠻不錯的。
我這里做了一個WinForm版的demo,來簡單介紹一下。
首先安裝項目Tools目錄下NanQi.IDE.vsix擴展包,由於對VS擴展不熟,花了我不少時間去弄。
安裝好后,可以在工具-擴展管理器和幫助-關於中查看:
打開解決方案,展開Form1和Form2項目,在文件夾上點擊右鍵,會發現多出來一個編譯交易的選項。
每個頁面可以說成一個交易,而編譯交易就是把當前鼠標選擇的文件夾下的頁面編譯成單獨的DLL。
可以打開NanQi.Project.Host\bin\Debug\Trades查看編譯的DLL文件。
主程序啟動,加載菜單樹,每個菜單對應一個類的FullName,當點擊一個菜單時,程序會找到指定目錄下【FullName】.DLL那個文件,然后反射加載、呈現。
添加一個窗體基本需要以下幾步:
- 新建一個窗體T_Test,選擇繼承窗體,找到指定的Libs文件夾內的NanQi.Framework.Control.dll文件,繼承NormalTradeWindow
- 在項目的Trade.xml文件中增加一條,Key值與窗體類名相同:T_Test
- 在項目中增加一個文件夾,文件夾名稱與窗體類名相同:T_Test
- 把新建的窗體拖到新建的文件夾中
- 在主程序NanQi.Project.Host的Menu.xml中添加菜單,action必須是新建窗體的FullName
- 在新建文件夾上點右鍵,編譯交易
- 運行主程序,點擊相應菜單,打開新建的窗體
有人看到這里可能覺得這樣做太麻煩了。
是的,這是因為demo中的vs擴展還沒有做新建交易,新建交易項目等一些功能,現在這些都需要手動完成,如果把新建交易的功能添加上,只需要在交易項目上點擊右鍵,選擇新建交易,填入交易名稱和描述即可完成所有新建任務,然后點擊右鍵編譯交易即可完成。
優點與缺點
優點很明顯,框架基本不需要修改,新增頁面,也變得簡單,如果框架再提供大量的控件,方法去簡化開發人員,那么完全可以把寫窗體的一些任務交給新人完成,分工很明確。
頁面都是在菜單點擊后才加載相應的DLL,稍作改動,就是分模塊加載的一個典型例子。
而且修改頁面不需要重啟應用程序,程序可以一直啟動着,編譯好某個頁面,重新打開即可看到改動后的效果,對於一些啟動復雜的程序,能省下不少時間。
VS擴展如果再進一步,完全可以讓頁面開發人員做到傳說中的.NET程序猿(只會拖控件),真的只要拖拖控件就可以完成全部任務。(不要覺得不現實,這種東西早就有人實現了,頁面開發人員不需要寫過多的代碼,都是一些簡單的if、else判斷、賦值與調用方法,根本不需要寫循環、Sql語句等。)
缺點主要一點是由於各個頁面在獨立的DLL中,無法相互調用、傳遞數據就比較困難,即使最簡單的ShowDialog可能都變得十分麻煩。這時候,可能框架就需要提供一些方法去做這些事情。
而由於將原本一個項目分為兩個,就帶來了使用的不方便,每次框架修改完,必須生成相應的DLL,然后放在項目層的Lib下。而調試框架就要使用附加到進程的方式去調試。
關於demo
連帶寫博客算上,這個demo一共花了近2天時間,可算是付出太多。
其中包括學習VS擴展和MEF,也算小有收獲。
框架是參考公司現用的結構,不是我的,所以這里只是以demo的形式與大家交流,估計后續也沒有再多的時間去繼續完善。
關於WinForm與WPF的話題,我會繼續,通過這個demo,也能看到WinForm還是有很大的限制,沒有WPF下的路由事件、依賴屬性,很多功能都無法實現,就算實現也太過麻煩。
關於管理軟件的發展,很希望有人一起探討探討。
源碼地址: https://github.com/NanQi/demo/tree/master/NanQi.Project