首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

WinForm 窗體間配置信息共享:單例模式、靜態類與配置文件方案對比

     編輯:程式設計綜合問答

場景

打印標簽程序包含「配置窗體」與「主窗體」。配置窗體設置參數(如打印機名、標簽尺寸),主窗體打印時需讀取這些配置。求高效、合理的共享方案。

方案對比

方案實現要點優點缺點適用場景
靜態類/屬性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高性能、支持過期策略進程隔離、重啟丟失高頻讀取、臨時計算結果緩存

推薦最佳實踐:分層策略

  1. 內存層:單例 ConfigService 持有當前配置對象,提供 Get/Set 方法,UI 綁定其屬性。
  2. 持久層:ConfigService 內部封裝 JsonSerializer 讀寫 %AppData%\MyApp\config.json。
    - 啟動時 Load() 反序列化到內存單例。
    - 配置窗體點「保存」調用 Save() 序列化落盤。
    - 主窗體打印前直接讀單例屬性,零 I/O 延遲。
  3. 通知層:單例實現 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 窗體間配置共享的工程級最優解。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved