打印標簽程序包含「配置窗體」與「主窗體」。配置窗體設置參數(如打印機名、標簽尺寸),主窗體打印時需讀取這些配置。求高效、合理的共享方案。
| 方案 | 實現要點 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|---|
| 靜態類/屬性 | public static class Config { public static string PrinterName { get; set; } } | 極簡、全局可訪問、無需實例傳遞 | 進程重啟丟失、難以單元測試、耦合度高 | 輕量級工具、臨時參數、不需持久化 |
| 單例模式 | public sealed class Config { private static Config _inst = new Config(); public static Config Instance => _inst; public string PrinterName { get; set; } } | 受控實例、可擴展懶加載/線程安全、便於註冊到 DI 容器 | 本質仍是全局狀態、需手動持久化 | 中型應用、需在多處共享且可能擴展行為 |
| 配置文件 (App.config / JSON) | ConfigurationManager.AppSettings["PrinterName"] 或 JsonSerializer 讀寫 config.json | 持久化、跨進程/重啟保留、可手動編輯、部署友好 | 讀寫有 I/O 開銷、需處理併發寫入、結構變更需遷移 | 用戶可見配置、需持久化、多實例部署 |
| 數據庫表 | 建 Config 表,主窗體啟動讀取、配置窗體寫入 | 集中管理、多客戶端同步、支持複雜查詢/審計 | 架構複雜、需 DB 連接、過度設計簡單需求 | 企業級、多終端、配置動態下發 |
| 應用程序域/內存緩存 | MemoryCache、AppDomain.SetData | 高性能、支持過期策略 | 進程隔離、重啟丟失 | 高頻讀取、臨時計算結果緩存 |
ConfigService 持有當前配置對象,提供 Get/Set 方法,UI 綁定其屬性。ConfigService 內部封裝 JsonSerializer 讀寫 %AppData%\MyApp\config.json。Load() 反序列化到內存單例。Save() 序列化落盤。INotifyPropertyChanged,主窗體訂閱變更事件即時刷新 UI(如打印機下拉框)。public sealed class ConfigService : INotifyPropertyChanged {
private static readonly Lazy _instance = new Lazy(() => new ConfigService());
public static ConfigService Instance => _instance.Value;
private ConfigModel _model; // POCO 類
public string PrinterName { get => _model.PrinterName; set { _model.PrinterName = value; OnPropertyChanged(); } }
// ... 其他屬性
private ConfigService() { Load(); }
public void Load() { /* 讀 JSON 到 _model */ }
public void Save() { /* _model 寫 JSON */ }
public event PropertyChangedEventHandler PropertyChanged;
void OnPropertyChanged([CallerMemberName] string n = null) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(n));
}
// 配置窗體保存按鈕
btnSave.Click += (s,e) => { ConfigService.Instance.Save(); this.Hide(); };
// 主窗體打印
var printer = ConfigService.Instance.PrinterName; // 直接用
CSDN 完整示例:WinForm 多窗體配置共享完整實現
「單例內存模型 + JSON 文件持久化 + 事件通知」兼顧性能、持久化、解耕與實時性,是 WinForm 窗體間配置共享的工程級最優解。