2016-09-01 43 views
5

.NET配置設置功能不像我想的那樣靈活。 如果我正確理解Application Settings,那麼我可以在何時更改/編輯設置。在C#中,應用程序設置分爲兩種不同的類型或範圍(「應用程序」和「用戶」),但兩者在如何更改或修改方面都存在限制。下表說明了differnce:編輯/修改C#應用程序設置

 
    SCOPE: | EDIT AT DESIGN-TIME: |  EDIT AT RUN-TIME:  | EDIT BETWEEN SESSIONS: 
--------------------------------------------------------------------------------------- 
    User  | Setings.settings | Settings.Default.Save() |  *Not supported*  
Application | Setings.settings |  *Not supported*  | edit app.exe.config 

有沒有「內置」的設置功能,讓我所有三種機制來編輯設置?使用配置文件的主要動機之一是允許用戶在不重新構建源代碼的情況下更改默認值(如使用應用程序範圍的設置可以完成的那樣)。但是,用戶不應該使用強制來編輯.config文件;他們還應該能夠在運行時進行更改,並在設置中保持不變(如可以使用用戶範圍的設置)。當然,必須有某種機制提供兩種功能。

底線:爲什麼在運行時不能編輯應用程序設置(app.exe.config)?這將解決我所有的問題。 據我所知,這可能會導致共享同一臺計算機的用戶出現問題。但誰又這樣做?

潛在解決方法:反正是有改變用戶設置配置文件默認存儲位置爲非隱藏文件夾?


(澄清)更新: 我想說的是,我希望能夠在設計時更改默認設置,在運行時中間會話(即通過編輯配置文件)。但是,當使用由Settings.settings提供的內置C#持久性機制時,我必須在3中選擇至多2個。我是否錯過了某些東西?還有另外一個我不知道的選擇嗎?

[使用案例:我想存儲一個「默認」數據庫名稱連接字符串,但我希望用戶能夠在運行時(可以指定不同的數據庫,從而成爲「新」該用戶的默認值)。但我也希望能夠通過寫在配置文件中的默認,而無需重新運行或重新構建,應用]

[更好的使用案例:(迴應評論)

我有一個計算模型,其中包含模型中參數的默認值的配置文件。用戶A啓動模型並決定改變幾個參數的值。該更改需要持續對於所有未來會話對於該用戶(即,在RTunTime編輯)。隨後,該用戶想要與他的團隊共享修改後的配置文件(例如通過版本控制存儲庫或電子郵件)。這將允許用戶B更新她的默認參數值(以匹配用戶A)而不必在應用(即,在會話之間編輯)中手動改變它們。所有這些mod都應該在設計時發生。]

* 我知道我可以在位於AppData的隱藏文件夾中的文件app.exe.config「技術上」編輯用戶範圍設置,但是這是一個隱藏的文件,而不是所有用戶都可以有足夠的權限查看它。 (但請參閱上面的「潛在解決方法」。)

+0

由於我缺乏知識,我沒有克服這種情況。但使用app.config可以在名稱值對中定義您的設置,並可以在運行時相應地選擇名稱。 –

+1

在瞭解C#之後,我首先了解到的第一件事就是序列化。雖然字典很好,但它們並不適合包含複雜的數據,每次訪問數據時都需要進行轉換,容易產生錯誤(特別是由於用戶編輯)......使用「XmlSerializer」進行序列化/反序列化非常簡單,那麼爲什麼還要麻煩與'設置'在所有?我發現json是保存設置的最佳格式。 – Sinatr

+2

如果沒有管理員提升,用戶應該無法更新適用於所有用戶的設置,因爲一個用戶可能會進行不利的更改,這會影響其他用戶。因此,更改應用程序設置更加困難...... – Phil1970

回答

0

所有您需要做的就是結合這兩種技術!

在會話開始時,從配置文件讀取配置的設置,並將其存儲到可寫的全局靜態變量(或任何形式的持久性)中。

然後,當用戶決定更改此設置時,只需更改設置的值。

public static Program { 

    public static string ConnectionString { get; set; } 

    void Main(string connectionString) { 
     ConnectionString = connectionString; 
    } 

} 

public class SomeOtherClass { 
    public void SomeOtherMethod() { 
     Program.ConnectionString = "new value"; 
    } 
} 

這只是一個非常簡單的例子,你將如何使用它。請注意,不是將字符串作爲參數傳遞給程序,而是可能選擇從應用程序設置中讀取默認值。您也可能會將用戶配置的連接字符串存儲到某種數據庫中,以便爲每個用戶使用不同的數據庫。

+0

恐怕這似乎沒有解決我的問題。我沒有看到這種方法與我原始文章中描述的「用戶範圍」有何不同。另外,我不確定將數據庫連接字符串存儲在數據庫中是如何合理的。 (請參閱我的文章中的用例。) – kmote

+0

所以你說你希望能夠在應用程序啓動時更改默認設置?另外,當然你的連接字符串是正確的,所以這個例子有點歪曲。我試圖解決的一點是,在存儲用戶配置的設置時(除非訪問存儲取決於設置),您可以選擇任何持久性方法。 – Glubus

+0

我在說的是,我希望能夠在設計時,運行時(即,應用程序啓動時),或兩者之間的會話中更改默認設置。 – kmote

0

如果您在案例研究中嘗試了以下內容並且可能會將其推廣,該怎麼辦?

  1. 只要用戶可以更改默認的數據庫名稱,所以這主要應用戶範圍下定義,而不是應用範圍
  2. 在安裝我假設一個Windows應用程序的應用程序,並在首先運行,檢查user.config是否具有數據庫名稱的值,如果是,請繼續加載應用程序,否則,請轉至步驟3.
  3. 向用戶顯示數據庫名稱的屏幕具有默認值,用戶可以更改設置,並確保在這裏進行一些驗證,完成設置頁面後,將它們存儲在user.config文件中,以便您的應用程序在下一次運行時,將會找到所需的設置以正常運行。
  4. 對於管理員權限,您可以在運行時顯示按鈕以更改設置。

我用這種技術從用戶需求定義,如「在哪裏存儲圖像,數據庫名,連接字符串,...等」

希望這將一些重要的細節所有的應用程序給你一個提示或東西

+0

謝謝,哈迪。這基本上是我現在使用的過程(儘管沒有在步驟2中檢查)。我希望找到一種解決方案,允許用戶在不運行程序的情況下更改默認設置。 – kmote

相關問題