基於窗體設計器的企業管理軟體開發工具

hrdzkj發表於2013-06-27

from:http://www.cnblogs.com/JamesLi2015/archive/2010/02/09/1666796.html

基於窗體設計器的企業管理軟體開發工具

因為工作的關係,接觸到企業管理軟體開發平臺。一套很完備的工具集,方法論和應用案例。這東西有點像軟體工廠,可以根據業務需求不同,生產各種型別的軟體。大部分通用的功能,比如資料的增刪查改,報表,都可以預先做好,然後根據各專案業務不同,載入不同的業務模組,組裝成產品。
以我的理解,做這麼一套工具集,需要很強的程式設計功力,至少還要有一個團隊,可以分工協作,做基礎模組的要保證穩定,做應用模組的,做出的程式要有很強的適應能力,可以應對各種需求的變化。

一套完整的開發平臺,應該包括
實體設計器 可以設計業務實體,生成SQL指令碼程式碼和類程式碼。
窗體設計器  設計使用者介面,一次設計,可以同時生成Desktop,Web兩種介面
業務流程設計器 設計系統流程,可適應各行業的流程需求
部署工具  部署使用者定製設計的內容

下面以我的理解,談談窗體設計器的前前後後相關的內容。因為這些工具是我業餘時間折騰的,和公司的平臺和技術毫不相關,所以我能放心的與你分享我的設計思路。
1  首先要有一個窗體設計器。這東東,到現在為止,還是個很寶貴的工具,網上(google)幾乎找不到可以拿來用的,有一些DEMO演示,但不完善,還要做很多工作。
如果你知道rehost技術,還知道SharpDevelop這本書,可以找到窗體設計器的原始碼。還有這篇文章,《用.NET Framework 2.0建立 Form設計器》,都可以解決窗體設計器的原始碼問題。
CodeProject上面也有幾個不錯的例子,可以直接拿來就用的。
2  找到了窗體設計器的原始碼,接下來做的工作就是分析它的機制,要滿足幾條才能應用
1)序列化機制 XML格式是最好的儲存格式,因為XML可以跨平臺,被任何語言和工具解析,將來被移植的可能性大,XML格式可以被各種小工具和小應用程式解析,比如在實際應用中要判斷窗體對應的表是否存在,可以直接讀取相應的XML片段,判斷即可。
CodeProject上面有一個很好的窗體設計器,就是因為它把窗體序列化為二進位制格式,解析起來相當不方便,只好忍痛放棄。
2)可支援擴充套件。比如需要在設計器中載入第三方的控制元件,可以通過增加一行配置就保證執行正常。
image

如圖,Windows Forms工具箱載入.NET提供的基礎控制元件,Flex Forms工具箱載入自定義的控制元件。
為什麼要載入自定義控制元件呢?為了平臺的方便。比如,如果用TextBox接受使用者的輸入,輸入本月購買直接物料的數量,在儲存窗體檔案時,需要檢查輸入的型別是數值型別,這樣的檢查需要很多重複的程式碼。如果把TextBox換成IntegerBox,這個控制元件只接受整型的數值,否則會報錯。這樣,檢查使用者輸入的程式碼就可以移到窗體設計器的執行時碼中,減少程式碼重複。

3 於是,拖拖拉拉設計好窗體,點選儲存,問題又來了,如何儲存呢?
1)直接儲存到電腦本地檔案,這樣可以隨時修改。因為要做一系列的窗體,比如一個採購審批系統,要有采購申請單,部門經理稽核單,財務經理稽核單。當這些窗體多了以後,需要規範的管理起來,不能在電腦上到處亂放。於是,在指定的目錄,放相同模組的窗體檔案。
好處很明顯,查詢容易,修改也容易。缺點是檔案容易被篡改,不安全
2)把檔案上載到伺服器。點選儲存按鈕時,把當前的窗體檔案上傳到伺服器的指定的目錄下。
3)把檔案儲存到資料庫中。這個是目前我採用的方案,直接放到資料庫中,安全是沒有問題。但是每次需要讀取資料,解析,還原成XML窗體檔案。當窗體的控制元件很多時,執行和設計都很慢
4)把檔案編譯成Assembly檔案,直接放到當前程式集目錄下。這個方案可以解決文字檔案不安全的問題,也可以解決速度問題,因為是在本機,可以很方便的讀取,而且是assembly格式,不容易被破壞。
儲存的時候,也有講究。不能用名字,因為名字可能會重複。用不會重複的GUID,但是不容易識別,還要配合名字,方便使用者查詢。

4  窗體檔案被儲存後,如何被快速檢索呢?
做到這一步,需要開始涉及業務方面的處理。首先,需要一個管理工具,按照系統的劃分層次,可以建立應用程式(Application),建立模組(Module),然後把設計的窗體檔案劃分到具體的類別當中。
比如,設計一個採購系統,命名為Purchase Management,再建立幾個模組,申請模組和審批模組,還有涉及到庫存,也要設計好。
當上傳窗體檔案的時候,就需要按照當前的窗體的作用,放到選定的模組中。
於是,可以按照模組來檢索窗體檔案,根據需要,做相應的修改或調整。
為了方便,也可按照名字,搜尋窗體,找到後,直接在設計器中開啟。
雖然窗體檔案是用GUID來識別的,但是使用者很少能記住這一長串的字母,很少去用ID來查詢窗體。

5  窗體設計好了,也儲存成功,現在需要一個窗體執行容器(Container,Runntime),可以容納窗體執行。在容器啟動時,需要載入一系統的服務,以保證窗體的執行;容器同時也提供窗體的測試環境,把設計器設計好的檔案丟到容器中跑一下,看看有什麼問題,以方便診斷。
image

如圖,可以直接開啟窗體設計完成後的XML檔案,看看執行的效果;也可以連到伺服器,開啟伺服器中的窗體檔案,作出適當的調整。這個工具集窗體測試,診斷分析於一體,相當的好用。

6 做一個應用介面,載入必要的服務,根據伺服器中的應用程式(Application)和模組(Module),建立導航介面,引導使用者進入相應的模組。使用者設計的一般是分散的應有,很少考慮整個系統的完整性,同時,使用者設計的窗體也不容易載入擴充套件外掛,比如業務外掛,流程外掛。需要自己寫一個容器,把使用者設計的介面,整合到一起,同時提供一些基礎的服務。
到這一步,一個基於窗體設計器的應用軟體就已經設計完成,所有的過程不需要編碼。

7  資料如何被儲存到資料庫中,又是如何被查詢出來?
在設計介面的時候,介面上的控制元件就已經和資料庫中的表進行了繫結。
image
在新建一個資料輸入型別的窗體,會有一個DataTable屬性,用於指定該窗體對應的資料庫表
在窗體中每個需要輸入資料,並進行儲存的控制元件,也有一個DataColumn屬性,於是指定資料的列
還有一個DataType屬性,把使用者輸入的內容,輸化為DataType型別的資料,存到DataColumn指定的資料列中。
image 
這些設計都以視覺化的方式完成,減少出錯。如下圖,直接獲取一個表的欄位資訊,用於填充窗體控制元件
image

如果是查詢窗體,也可以用SQL智慧的查詢分析器,幫助使用者快速構建查詢結果 image
使用者可以手寫SQL語句,也可以點選查詢按鈕,用查詢分析器來寫SQL。
這裡有個疑問,一直沒搞懂。用ICSharpCode.TextEditor.dll作語法高亮編輯器,無論檔案是否超過一屏,它都會出現橫向滾動條,很不美觀,在網上找了很久也搞不定。我的程式碼生成器也是這樣。
如果一個SQL語句只有幾個字元,它也顯示橫向的滾動條,看著很不舒服。
在檢索窗體的時候,會檢查這個窗體是否有資料,如果有資料,會載入資料。如果是新建一個窗體,比如新建一個採購申請單,則不載入資料。

8  業務外掛如何載入,系統如何擴充套件?
這是同一個問題。用標準的assembly格式,寫好需要被呼叫的方法。在窗體執行之前,會載入一系列的服務,這個服務包含載入配置檔案中指定的類庫。用簡單的語法,在需要呼叫自定義邏輯的地方,指定方法名和引數,執行時引擎分析這個引數(是個字串),解析成反射的方法呼叫語法,呼叫指定的類庫中的方法。為了方便,系統會預先寫好一些常用的類庫,比如時間處理,序列號處理。
如果使用者需要擴充套件系統,把assembly放到指定的目錄下,在配置檔案中指定需要載入的程式集,然後只管在需要的地方呼叫,引擎會處理好怎麼去找程式集,如何反射到方法並呼叫。
比如,我為了驗證這種方法的可行性,故意寫了個資料庫備份工具
image 
介面佈局有點亂。取到介面上的使用者輸入的Server,UID,Password的值,傳到Backup按鈕的點選事件中,該事件運用反射,呼叫我寫好的類庫,資料庫備份功能。
public void Backup(string server, string database, string uid,string password)
   {
SQLDMO.SQLServer svr = new SQLDMO.SQLServerClass();
svr.Connect(ServerName, UserName, Password);
SQLDMO.Backup bak = new SQLDMO.BackupClass();
bak.Action = 0;
bak.Initialize = true;
SQLDMO.BackupSink_PercentCompleteEventHandler pceh = new SQLDMO.BackupSink_PercentCompleteEventHandler(Step);
bak.PercentComplete += pceh;
bak.Files = strFileName;
bak.Database = strDbName;
bak.SQLBackup(svr);

}

還有一些細節沒有考慮到,比如資料庫的表如何設計,表與窗體如何關聯,如何驗證窗體,如何把窗體與工作流程繫結。有時間的時候再補充。
搞這個東東還是很辛苦的,也不見得有什麼成效。真正做起專案來,客戶需求一改再改,介面換了一次又一次,如果都用平臺來做,估計會累死。我折騰過幾次,也沒有大的成效,技術的提升只是額外的收穫。有理解的不對的地方,請各位多多指教。

相關文章