2008-09-11 43 views
5

我對.Net v2的.Net配置的.Net配置的各種配置選項感到困惑 - 特別是在考慮配置文件在UI /端的影響時鏈的用戶端。幫助瞭解.Net配置選項

因此,例如,一些應用程序的我,使我們與訪問使用設置工作:

string blah = AppLib.Properties.Settings.Default.TemplatePath; 

現在,這個選擇似乎冷靜,因爲成員是stongly類型的,我不能鍵入Visual Studio 2005 IDE中不存在的屬性名稱。我們最終在一個命令行可執行項目的App.Config中這樣的臺詞:

<connectionStrings> 
     <add name="AppConnectionString" connectionString="XXXX" /> 
     <add name="AppLib.Properties.Settings.AppConnectionString" connectionString="XXXX" /> 
    </connectionStrings> 

(如果我們沒有第二個設定,有人釋放一個DLL調試到直播盒可能已經建立其中嵌入調試連接字符串 - 克朗)

我們也有這樣的訪問設置:

string blah = System.Configuration.ConfigurationManager.AppSettings["TemplatePath_PDF"]; 

現在,這些似乎很酷,因爲我們可以從DLL的代碼訪問該設置,或EXE/aspx代碼,以及我們在Web或App.config中需要的全部內容是:

<appSettings> 
    <add key="TemplatePath_PDF" value="xxx"/> 
    </appSettings> 

但是,當然值可能不會在配置文件中設置,或者字符串名稱可能錯誤輸入,所以我們有一組不同的問題。

因此......如果我的理解是正確的,前面的方法給出了強大的輸入,但dll和其他項目之間的值分享不好。後者提供更好的共享,但打字更弱。

我覺得我必須錯過一些東西。目前,我甚至不關心應用程序能夠將值寫回配置文件,加密或類似的東西。另外,我決定存儲任何非連接字符串的最佳方式是在數據庫中......然後,我必須做的下一件事是在數據庫連接問題的情況下將電話號碼存儲到文本人員,所以他們必須存儲在數據庫之外!

回答

2

Nij,我們在思維上的差異來自我們不同的觀點。我正在考慮開發主要使用WinForms客戶端的企業應用程序。在這種情況下,業務邏輯包含在應用程序服務器上。每個客戶端都需要知道要撥打的電話號碼,但如果該電話號碼發生更改,則將其置於每個客戶端的App.config中會出現問題。在這種情況下,將應用程序配置信息(或應用程序範圍設置)存儲在數據庫中似乎很明顯,並讓每個客戶端都從中讀取設置。另一種.NET方式(我之所以這樣區分,是因爲我們已經在.NET .NET以前的版本中將存儲的應用程序設置存儲在數據庫表中)是將應用程序設置存儲在app.config文件中,並通過生成的設置類。

我離題了。你的情況聽起來不同。如果所有不同的應用程序位於同一臺服務器上,則可以將設置放置在更高級別的web.config中。但是,如果它們不是,那麼您也可以有一個單獨的「配置服務」,以便所有三個應用程序進行通信以獲取其共享設置。至少在這個解決方案中,你不會在三個地方複製代碼,在添加設置時會增加維護問題的可能性。聽起來有點過於設計了。

我個人的偏好是使用強類型設置。我實際上根據數據庫中的設置表生成了我自己的強類型設置類。這樣我就可以擁有兩全其美的了。智能感知我的設置和存儲在數據庫中的設置(注意:這是在沒有應用程序服務器的情況下)。

我對此感興趣瞭解其他人的策略:)

+0

@rob_g遲來的感謝和'接受的答案'爲您的評論在這裏。我最終創建了一個設置數據庫表,每行一行。我認爲我沒有達到'完美的解決方案',但比以前好很多。 – Nij 2010-03-05 21:19:15

0

我認爲你的困惑來自這樣一個事實:它看起來像你的第一個例子是一個家庭釀造的庫,而不是.NET的一部分。 配置管理器示例是內置功能的示例。

3

如果您使用VS 2005+中的設置選項卡,則可以添加強類型設置並獲取智能感知,例如在第一個示例中。

string phoneNum = Properties.Settings.Default.EmergencyPhoneNumber; 

這實際上存儲在App.Config中。

您仍然可以使用配置文件的appSettings元素,甚至可以滾動您自己的ConfigurationElementCollection,ConfigurationElement和ConfigurationSection子類。

至於在哪裏存儲您的設置,數據庫或配置文件,在非連接字符串的情況下:這取決於您的應用程序體系結構。如果您有一個應用程序服務器由所有客戶端共享,請使用上述方法,在應用程序服務器上的App.Config中。否則,您可能不得不使用數據庫。將它放置在每個客戶端的App.Config上會導致版本/部署頭痛。

0

我支持Rob Grays的答案,但想稍微添加一下。這可能過於明顯,但如果您使用多個客戶端,app.config應該存儲所有安裝特定的設置,並且數據庫應該存儲幾乎所有其他設置。

單個客戶端(或服務器)應用程序有所不同。這真的是更多的個人選擇。一個明顯的例外是,如果該設置是數據庫中的記錄的ID,在這種情況下,我總是將設置存儲在數據庫與外鍵,以確保引用不會被刪除。

0

是的 - 我認爲我/我們處於頭痛的狀況Rob descibes - 我們需要訪問相同數據庫的三臺獨立服務器上有5或6個不同的網站和應用程序。根據情況,每個人都有自己的Web或App.config,其中描述了設置和/或覆蓋主DB訪問DLL庫中的設置。

Rob - 當你說應用服務器時,我不確定你的意思?我能想到的最近的事情是,我們至少可以在同一臺計算機上的站點之間共享一些設置,方法是將它們放在目錄層次結構中更高的web.config中......但這也不是我能夠調查的東西......認爲更重要的是瞭解哪些強弱型路線是「更好」的。