2009-11-23 65 views
2

PHP的網絡編程,我總是做了一個單輸出對象中,我可以把全球信息必須是可以從任何一行代碼。你把全局變量放在WPF應用程序中的哪個位置?

因此,在WPF應用程序中,我創建了以下類來執行相同的功能,例如,變量ReturnToPageIdCode返回處理某個任務後,另一個頁面應該返回到的頁面,並且可以在任何需要的位置設置並獲取該值。

這很好。

不過,我不禁想,在狀態 WPF環境,我這個單輸出對象重新創建輪

你在哪裏可以在你的WPF應用程序中保存應用程序範圍的值?有沒有一些標準的地方可以做到這一點?

public class Output 
{ 
    private Output output; 

    private static Output instance; 

    public string ReturnToPageIdCode { get; set; } 

    public static Output GetInstance() 
    { 
     if (instance == null) 
     { 
      instance = new Output(); 
     } 
     return instance; 
    } 

    public string GetTestMessage() 
    { 
     return "This is a global test message from the output singleton."; 
    } 
} 

回答

10

Globals?拒絕吧。 (對不起,有人不得不說)配置的東西,正如其他人所建議的,使用App.Config,
你提供的代碼看起來像一個M-V-VM給我 - 你應該檢查出來。 WPF通過它的本性來促進這一點。學習它,愛它,活下去。

+4

+1給格拉克扔全球的一把猴子sh * t。 – Will 2009-11-23 16:00:20

+0

感謝您的清晰思考,我刪除了我的輸出對象,並把例如ReturnToPageIdCode轉換成我正在注入每個頁面的PageManager對象,這很有道理 – 2009-11-24 10:07:10

4

我認爲那種全局狀態,我覺得你所描述的是配置信息。結果,我將它放置在App.config文件中,通常通過項目的屬性「設置」選項卡。

這將通過<WhateverNamespace>.Properties.Settings公開您的配置信息,以便於以類型安全的方式進行訪問。

如果你在描述別的東西,比如不是配置信息的可變應用程序狀態,我強烈建議將你的範例轉移到更多的客戶端應用程序表單中,這樣的全局狀態由於它是強烈的錯誤傾向性。 IE,重構您的應用程序模型,使其不依賴於全局數據 - 而是使用參數和對象。

+0

+1將Will for app.config。 :) – 2009-11-23 15:27:27

3

App.Config(雙擊項目中的「屬性」節點)查找用戶特定(讀/寫)和應用程序特定(只讀)原語。

對於諸如提供者(數據庫,日誌記錄等)的複雜類型,沒有「一個」地方。但今天最好的模式是使用某種形式的dependency injection,如UnityNInject

+0

+1給Greg D的app.config – Will 2009-11-23 15:24:30

+0

+1包括依賴注入(即使它必須是手動構造函數注入)。 – 2009-11-23 15:26:25

1

儘管我對全局信息普遍缺乏熱情,但至少應該承認中央WPF全局信息機制:應用程序的資源字典。有很多東西你不應該使用它(比如,你可以通過將XML數據源放入你的應用程序的資源字典中來創建一個類似於單例的對象,但真的,不要),但是有很多東西你應該做的事情 - 全局樣式,全局模板等。

1

試試這個

/// <summary> 
    /// "Global variables" or kind of "Session State" class. 
    /// To save a variable: ApplicationState.SetValue("currentCustomerName", "Jim Smith"); 
    /// To read a variable: MainText.Text = ApplicationState.GetValue<string>("currentCustomerName"); 
    /// </summary> 
    public static class ApplicationData 
    { 
     /// <summary> 
     /// Get an application-scope resource Formatted News 
     /// </summary> 
     /// <returns></returns> 
     public static DataContainerModel GetNews() 
     { 
      var formattedNews = (DataContainerModel)Application.Current.Resources["FormattedNews"]; 
      return formattedNews; 
     } 

     /// <summary> 
     /// Set an application-scope resource Formatted News 
     /// </summary> 
     /// <param name="dataContainerModel"></param> 
     public static void SetNews(DataContainerModel dataContainerModel) 
     { 
      Application.Current.Resources["FormattedNews"] = dataContainerModel; 
     } 

     private static ConcurrentDictionary<string, object> _values = new ConcurrentDictionary<string, object>(); 

     public static void SetValue(string key, object value) 
     { 
      if (_values.ContainsKey(key)) 
      { 
       var oldValue = new object(); 
       _values.TryRemove(key, out oldValue); 
      } 
      _values.TryAdd(key, value); 
     } 

     public static T GetValue<T>(string key) 
     { 
      if (_values.ContainsKey(key)) 
      { 
       return (T)_values[key]; 
      } 
      else 
      { 
       return default(T); 
      } 
     } 

    } 

所以在這裏你看到的兩種方法。我想擁有他們兩個。

哦! DataContainerModel將會是您需要的任何自定義類。

相關問題