企業級 WinForm 系統隨業務增長,模組化是控制複雜度的關鍵。本文實戰分享三大高頻模組——資料字典、參數配置、權限管理——的獨立設計、即插即用整合,以及開發期/運行期的分合之道。

app.config / Settings.settings —— 適合少量鍵值,難以支援複雜結構、多環境同步。

SystemConfig.Default 靜態類,IntelliSense 直達。
double hours = span.Hours;
hours = (hours < SystemConfig.Default.KFPartAtLeaseHoure)
? SystemConfig.Default.KFPartAtLeaseHoure : hours; // 最小計費小時
if (span.Minutes < 60 && span.Minutes >= SystemConfig.Default.KFPartHourMinutes)
hours += 1;
else if (span.Minutes > SystemConfig.Default.KFPartHalfHourMinte
&& span.Minutes < SystemConfig.Default.KFPartHourMinutes)
hours += 0.5;

// 登入驗證
string identity = userBLL.VerifyUser(loginName, pwd, Guid.NewGuid().ToString());
if (!string.IsNullOrEmpty(identity))
{
UserInfo info = userBLL.GetUserByName(loginName);
// 載入功能清單至全域快取
var funcList = functionBLL.GetFunctionsByUser(info.ID, "HOTELMS");
foreach (var f in funcList)
if (!Portal.gc.FunctionDict.ContainsKey(f.ControlID))
Portal.gc.FunctionDict.Add(f.ControlID, f);
Portal.gc.LoginInfo = info;
this.DialogResult = DialogResult.OK;
}
if (Portal.gc.HasFunction("KTV"))
{
var band = new OutlookBarBand("KTV包間管理");
if (Portal.gc.HasFunction("KTV/View")) band.Items.Add(new OutlookBarItem("KTV包間狀態視圖", 0));
if (Portal.gc.HasFunction("KTV/Setting")) band.Items.Add(new OutlookBarItem("KTV包間設置", 1));
if (Portal.gc.HasFunction("KTV/Goods")) band.Items.Add(new OutlookBarItem("KTV商品設置", 3));
// ...
outlookBar1.Bands.Add(band);
}
HasFunction 封裝字典查找,效能極高。| 模組 | 獨立性 | 整合點 | 核心價值 |
|---|---|---|---|
| 資料字典 | 高 (僅資料表+DLL) | 資料庫表、公共 DLL | 業務編碼集中維護、零代碼擴充 |
| 參數配置 | 高 (VS Add-in + 獨立 DLL) | 強型別靜態類、用戶端界面 | 開發/使用雙端體驗、強型別防呆 |
| 權限管理 | 高 (獨立 EXE + 資料庫) | 資料庫表、登入流程、選單渲染 | 職責分離、細粒度授權、部署彈性 |
「開發之道,順手拈來;分合之需,順其自然;優碼不語,潤物無聲。」三大模組實戰證明:高內聚、低耦合、介面統一 是模組化成敗關鍵。歡迎留言交流您的模組化心得!