天天看點

閑話WinFrom與WPF(4) 架構篇——結合VS擴充,插件式開發架構

當我的閑話WinFrom與WPF,還在進行的時候,突然出來介紹插件式開發架構,總覺得又會半途而廢,最後偷懶,決定把這一篇定為閑話WinFrom與WPF的架構篇,倒也說的過去,反正還是使用WinForm,也沒跑題。

先說說由來。

也就在去年的5月,我離開了上一家公司來現在的公司繼續當一個苦逼程式猿,沒有使用過WPF,AIX,Oracle……好多的不會,看到公司的一套WPF系統,感覺很驚訝,之後随着接觸項目,這份驚訝也越來越淡,感覺系統也很稀松平常。

之後和上司一次閑談時說起管理軟體近幾年的發展,如我這等隻做了兩年程式的人都開始大言不慚的談軟體【這幾年】的發展,想起都有點可笑。

當時上司拿公司這個WPF項目舉例,說曾經公司一直想做一個自己的IDE工具,好簡化開發人員,但是技術有限,而且也大多都是抄開源的SharpDevelop。現在這套架構,就直接使用VS擴充去做,這就是管理軟體的一個發展。

本篇文章不是談論管理軟體的發展,不論上司說的正确與否,以上都屬閑話,是以還是到此為止。

簡介

插件式開發和VS擴充都不是新技術,擴充開發工具用在項目中我記得早在VC的年代就有很多項目這樣做了,最簡單的就是寫一套模闆去開發,而插件式開發幾乎所有大型軟體都有。

技術不新,但是插件式開發,結合VS擴充,效果還是蠻不錯的。

我這裡做了一個WinForm版的demo,來簡單介紹一下。

首先安裝項目Tools目錄下NanQi.IDE.vsix擴充包,由于對VS擴充不熟,花了我不少時間去弄。

閑話WinFrom與WPF(4) 架構篇——結合VS擴充,插件式開發架構

安裝好後,可以在工具-擴充管理器和幫助-關于中檢視:

閑話WinFrom與WPF(4) 架構篇——結合VS擴充,插件式開發架構
閑話WinFrom與WPF(4) 架構篇——結合VS擴充,插件式開發架構

打開解決方案,展開Form1和Form2項目,在檔案夾上點選右鍵,會發現多出來一個編譯交易的選項。

閑話WinFrom與WPF(4) 架構篇——結合VS擴充,插件式開發架構

每個頁面可以說成一個交易,而編譯交易就是把目前滑鼠選擇的檔案夾下的頁面編譯成單獨的DLL。

可以打開NanQi.Project.Host\bin\Debug\Trades檢視編譯的DLL檔案。

主程式啟動,加載菜單樹,每個菜單對應一個類的FullName,當點選一個菜單時,程式會找到指定目錄下【FullName】.DLL那個檔案,然後反射加載、呈現。

添加一個窗體基本需要以下幾步:

  1. 建立一個窗體T_Test,選擇繼承窗體,找到指定的Libs檔案夾内的NanQi.Framework.Control.dll檔案,繼承NormalTradeWindow
  2. 在項目的Trade.xml檔案中增加一條,Key值與窗體類名相同:T_Test
  3. 在項目中增加一個檔案夾,檔案夾名稱與窗體類名相同:T_Test
  4. 把建立的窗體拖到建立的檔案夾中
  5. 在主程式NanQi.Project.Host的Menu.xml中添加菜單,action必須是建立窗體的FullName
  6. 在建立檔案夾上點右鍵,編譯交易
  7. 運作主程式,點選相應菜單,打開建立的窗體

有人看到這裡可能覺得這樣做太麻煩了。

是的,這是因為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

繼續閱讀