之前的那個開發框架好幾個朋友都用在了項目里面,也給我提出了很寶貴的意見,雖然最近一直沒有什么更新,但是針對朋友們提出的建議,我都仔細考慮了一翻,很多的意見我都融入了系統里面,將不足之處修改過來,本來想把報表的事兒給搞定,但是想了幾種方案結果都不了了之。曾經有一個朋友說很欣賞我那個讀取DLL文件的框架,以前我覺得寫得挺亂的,代碼也是比較混亂,有時候我自己翻出來居然要想很久才知道那些代碼是什么意思,當時之所以舍棄了這套框架,是因為覺得整個項目的Size會越來越大,因為每一個窗體都是一個類庫,然后編譯為DLL文件,程序去讀取並加載這些DLL文件,所以采取了直接寫在竹程序里面的方式,詳細介紹在這里:
http://www.cnblogs.com/allen0118/archive/2012/05/10/2494112.html
這樣一來也有一個問題,主程序的EXE越來越大,我覺得理論上是這樣,所以最近忙里偷閑,將原來的那套框架重新整理了一下,主要有以下幾個變化:
1.每一個窗體皆為一個類庫,實現相應的接口。
2.用戶打開窗體的時候不是直接Open窗體,而是加載DLL文件,讀取DLL文件里面的信息。
3.每一個窗體所實現的業務仍然在自己的類文件中完成。
4.只需要將生成的DLL文件放在指定的目錄,供程序讀取即可。
在新建的項目里面實現如下業務:
1 using System; 2 using System.Collections.Generic; 3 using System.Text; 4 5 using CP.Kernel.Base; 6 7 namespace sysUserGroup 8 { 9 [Serializable] 10 public class Plugins : IPugins 11 { 12 private FrmUserGroup f; 13 public void Activate() 14 { 15 f.Activate(); 16 } 17 public void Dispose() 18 { 19 f.Close(); 20 GC.Collect(); 21 GC.SuppressFinalize(this); 22 } 23 public void Hide() 24 { 25 f.Close(); 26 } 27 28 public string Name 29 { 30 get { return "角色資料設定"; } 31 } 32 33 public string GUID 34 { 35 get { return "F2080504B6DC4963BC0963FEFA0E1AAD"; } 36 } 37 38 public string Version 39 { 40 get { return "1.0.0.0"; } 41 } 42 43 public string Manufacturer 44 { 45 get { return "制造商"; } 46 } 47 48 public string Description 49 { 50 get { return "用於設定角色資料"; } 51 } 52 53 public string TCode 54 { 55 get { return "JSZL"; } 56 } 57 58 public string FrmUrl 59 { 60 get { return "sysUserGroup.dll"; } 61 } 62 } 63 }
這里入去傳入進來的DLL文件:
1 public void LoadDLL(string DllName) 2 { 3 try 4 { 5 if (DllName.Substring(DllName.Length - 4).ToUpper() == ".DLL") 6 { 7 DllName = DllName.Replace(".dll", ""); 8 } 9 10 if (string.IsNullOrEmpty(DllName)) 11 return; 12 13 if (!allenSingleton.DicLoadDll.ContainsKey(DllName)) 14 { 15 IPugins objLoadDll; 16 if (allenSingleton.DicPugins.ContainsKey(DllName)) 17 { 18 objLoadDll = allenSingleton.DicPugins[DllName]; 19 } 20 else 21 { 22 objLoadDll = CPUtility.LoadDll(DllName); 23 } 24 25 if (objLoadDll != null) 26 objLoadDll.Show(dockPanel, DockState.Document); 27 28 allenSingleton.DicLoadDll.Add(DllName, objLoadDll); 29 } 30 else 31 { 32 allenSingleton.DicLoadDll[DllName].Activate(); 33 } 34 } 35 catch (Exception ex) 36 { 37 ShowMsg(ex.Message); 38 } 39 40 41 } 42
這個框架比起之前的那一套,數據處理方面沒有什么變化,仍然采取存儲過程實現業務邏輯,程序里面基本上面看不到SQL語句;布局和風格也是沿用以前的做法,仍然是多文檔的布局模式,整體效果還是比較大方的,主要的變化就是核心部分,可以說現在的這套程序跟之前的那一套核心內容完全不一樣了,在耦合性方面也有一些改善。加載的窗體如下圖,都是DLL:
大致的效果:
多文檔布局模式預覽:
明天開始五一放長假10天,然后自己再接着請了幾天假,終於可以好好休息一下了,五一回來打算再好好優化一下,在這里祝大家五一愉快!