因為工作的關係,接觸到企業管理軟體開發平台。一套很完備的工具集,方法論和應用案例。這東西有點像軟體工廠,可以根據業務需求不同,生產各種類型的軟體。大部分通用的功能,比如資料的增刪查改,報表,都可以預先做好,然後根據各項目業務不同,載入不同的業務模組,組裝成產品。
以我的理解,做這麼一套工具集,需要很強的編程功力,至少還要有一個團隊,可以分工協作,做基礎模組的要保證穩定,做應用模組的,做出的程式要有很強的適應能力,可以應對各種需求的變化。
一套完整的開發平台,應該包括
實體設計器 可以設計業務實體,產生SQL指令碼代碼和類代碼。
表單設計器 設計使用者介面,設計一次,可以同時產生Desktop,Web兩種介面
協調流程設計師 設計系統流程,可適應各行業的流程需求
部署工具 部署使用者定製設計的內容
下面以我的理解,談談表單設計器的前前後後相關的內容。因為這些工具是我業餘時間折騰的,和公司的平台和技術毫不相關,所以我能放心的與你分享我的設計思路。
1 首先要有一個表單設計器。這東東,到現在為止,還是個很寶貴的工具,網上(google)幾乎找不到可以拿來用的,有一些DEMO示範,但不完善,還要做很多工作。
如果你知道rehost技術,還知道SharpDevelop這本書,可以找到表單設計器的源碼。還有這篇文章,《用.NET Framework 2.0建立 Form設計器》,都可以解決表單設計器的源碼問題。
CodeProject上面也有幾個不錯的例子,可以直接拿來就用的。
2 找到了表單設計器的源碼,接下來做的工作就是分析它的機制,要滿足幾條才能應用
1)序列化機制 XML格式是最好的儲存格式,因為XML可以跨平台,被任何語言和工具解析,將來被移植的可能性大,XML格式可以被各種小工具和小應用程式解析,比如在實際應用中要判斷表單對應的表是否存在,可以直接讀取相應的XML片段,判斷即可。
CodeProject上面有一個很好的表單設計器,就是因為它把表單序列化為二進位格式,解析起來相當不方便,只好忍痛放棄。
2)可支援擴充。比如需要在設計器中載入第三方的控制項,可以通過增加一行配置就保證運行正常。
,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),可以容納表單運行。在容器啟動時,需要載入一系統的服務,以保證表單的運行;容器同時也提供表單的測試環境,把設計器設計好的檔案丟到容器中跑一下,看看有什麼問題,以方便診斷。
,可以直接開啟表單設計完成後的XML檔案,看看啟動並執行效果;也可以連到伺服器,開啟伺服器中的表單檔案,作出適當的調整。這個工具集表單測試,診斷分析於一體,相當的好用。
6 做一個應用介面,載入必要的服務,根據伺服器中的應用程式(Application)和模組(Module),建立導航介面,引導使用者進入相應的模組。使用者設計的一般是分散的應有,很少考慮整個系統的完整性,同時,使用者設計的表單也不容易載入擴充外掛程式,比如業務外掛程式,流程外掛程式。需要自己寫一個容器,把使用者設計的介面,整合到一起,同時提供一些基礎的服務。
到這一步,一個基於表單設計器的應用軟體就已經設計完成,所有的過程不需要編碼。
7 資料如何被儲存到資料庫中,又是如何被查詢出來?
在設計介面的時候,介面上的控制項就已經和資料庫中的表進行了綁定。
在建立一個資料輸入類型的表單,會有一個DataTable屬性,用於指定該表單對應的資料庫表
在表單中每個需要輸入資料,並進行儲存的控制項,也有一個DataColumn屬性,於是指定資料的列
還有一個DataType屬性,把使用者輸入的內容,輸化為DataType類型的資料,存到DataColumn指定的資料列中。
這些設計都以可視化的方式完成,減少出錯。如,直接擷取一個表的欄位資訊,用於填充表單控制項
如果是查詢表單,也可以用SQL智能的查詢分析器,協助使用者快速構建查詢結果
使用者可以手寫SQL語句,也可以點擊查詢按鈕,用查詢分析器來寫SQL。
這裡有個疑問,一直沒搞懂。用ICSharpCode.TextEditor.dll作文法高亮編輯器,無論檔案是否超過一屏,它都會出現橫向捲軸,很不美觀,在網上找了很久也搞不定。My Code產生器也是這樣。
如果一個SQL語句只有幾個字元,它也顯示橫向的捲軸,看著很不舒服。
在檢索表單的時候,會檢查這個表單是否有資料,如果有資料,會載入資料。如果是建立一個表單,比如建立一個採購申請單,則不載入資料。
8 業務外掛程式如何載入,系統如何擴充?
這是同一個問題。用標準的assembly格式,寫好需要被調用的方法。在表單運行之前,會載入一系列的服務,這個服務包含載入設定檔中指定的類庫。用簡單的文法,在需要調用自訂邏輯的地方,指定方法名和參數,運行時引擎分析這個參數(是個字串),解析成反射的方法調用文法,調用指定的類庫中的方法。為了方便,系統會預先寫好一些常用的類庫,比如時間處理,序號處理。
如果使用者需要擴充系統,把assembly放到指定的目錄下,在設定檔中指定需要載入的程式集,然後只管在需要的地方調用,引擎會處理好怎麼去找程式集,如何反射到方法並調用。
比如,我為了驗證這種方法的可行性,故意寫了個Database Backup工具
介面布局有點亂。取到介面上的使用者輸入的Server,UID,Password的值,傳到Backup按鈕的點擊事件中,該事件運用反射,調用我寫好的類庫,Database 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);
}
還有一些細節沒有考慮到,比如資料庫的表如何設計,表與表單如何關聯,如何驗證表單,如何把表單與工作流程綁定。有時間的時候再補充。
搞這個東東還是很辛苦的,也不見得有什麼成效。真正做起項目來,客戶需求一改再改,介面換了一次又一次,如果都用平台來做,估計會累死。我折騰過幾次,也沒有大的成效,技術的提升只是額外的收穫。有理解的不對的地方,請各位多多指教。