2010-02-11 43 views
11

.NET允許您使用.settings文件來管理應用程序設置。我想在某種程度上,我可以做這樣的事情分開存放生產,開發和測試設置:如何在.NET中爲不同的環境使用不同的.settings文件?

EnvironmentSettings environmentSettings; 

// get the current environment (Production, Development or Test) 
ApplicationEnvironment Environment = (ApplicationEnvironment) 
    Enum.Parse(typeof(ApplicationEnvironment), Settings.Default.ApplicationEnvironment); 

switch (Environment) 
{ 
    case ApplicationEnvironment.Production: 
     environmentSettings = Settings.Production; 
     break; 
    ... 
} 

string reportOutputLocation = environmentSettings.ReportOutputLocation; 

基本上,我想兩個獨立設置類:用來存儲選定環境和非一般設置類特定於環境的屬性以及名爲EnvironmentSettings的第二個類的3個靜態實例。使用的實例應該取決於一般設置類中指定的環境。

有沒有什麼辦法可以做到這一點手動設置靜態構造函數或所有這些設置的值?如果我必須這樣做,我寧願只有一個大的設置類與「DevOutputLocation」,「LiveOutputLocation」等屬性。

我可以在我的項目中有多個.settings文件,但只是創建單獨的類這並不是來自對方。因此,我可以製作DevelopmentSettings.settings,ProductionSettings.settings和TestSettings.settings文件併爲它們提供相同的屬性,但是隨後我需要一堆switch語句來確定要使用哪個類,因爲它們不是從普通類派生的。

+0

您可以通過使用爲每個環境不同的用戶做到這一點,但不知何故,我認爲,造成更多的問題比它解決的。 – 2010-02-12 01:14:59

回答

2

我對.config文件使用這種方法,我相信它也會對你有所幫助。只要看看上Scott Hanselman's blog postthis question。意識形態像地獄一樣簡單,但作品相當不錯。所有你需要的是:

  1. 按照慣例,例如創建幾個文件進行不同的配置
  2. 他們的名字my.dev.settings,my.live.settings
  3. 創建後生成事件(見鏈接)
  4. 享受=)

實例化代碼爲您的設置總是會在默認設置類(這將在每次構建後都需要替換),所以這種方法只需要很少的工作。

+0

這真的是唯一的方法嗎?我想,如果它得到了Scott H.的支持,那看起來就像是一場非常混亂的黑客攻擊。你會認爲你可以指定什麼.settings或.config文件用於每個生成配置。 – Carl 2010-02-12 14:16:45

+0

我剛剛回顧了我以前提出的問題,並注意到我從未將此標記爲已回答,因此您可以繼續。再次感謝。 – Carl 2011-07-06 17:12:20

+0

另一種可能性是使用XML變換等[SlowCheetah]工具(https://visualstudiogallery.msdn.microsoft.com/69023d00-a4f9-4a34-a6cd-7e854ba318b5) – 2015-03-17 20:34:57

0

只是一個想法,但它可能工作...

  • 你需要N + 2個的設置文件(N 不同的構建;碩士2名)與 含有相同的密鑰。

  • 清除了「自定義工具」爲所有的人,但主人(所以 只有一個主設備產生)的一個屬性 。

  • 修改每個發行版的預構建腳本,以將相應的設置文件內容複製到構建主文件中。

  • 修改生成後腳本以將輔助主文件內容複製回原始主文件。

注意:如果你能在你的源代碼控制的前置和後置構建腳本,你不需要輔助主 - 你可以檢查出在預構建和撤銷在後期製作中檢查。但是,這可能會導致持續集成環境中的問題,因爲鎖定的文件需要構建失敗。

我也從來沒有這樣做;儘管有些時候我希望在VS中做一些這樣的事情。

2

一個想法是,在一系列靜態值之間切換聽起來像是一種相當充滿活力的做事方式。 我會建議查找Singleton模式。這種模式爲您提供了一個在類的所有引用之間共享的類實例,但是當它第一次加載時,您可以執行正常的初始化位來檢查您的環境並相應地設置值。同樣,而不是使用開關來處理不同的類,你不是在設計一個接口,而是讓每個類都實現該接口嗎?

0

只是在.NET環境下基於配置文件中的一些額外的信息,而無需使用您上面的實現具體爲:

企業庫具有自V3.0此功能: Summary

的Visual Studio 2010將有此功能也。其所謂的Config Transformation

1

有參與決策檢查,以確定你是在運行什麼樣的環境一點的開銷。如果你在談論一個網絡環境那麼這可能意味着一個顯著的性能損失。我建議創建三個獨立的配置文件,並建立一個持續集成和部署系統,以處理命名並根據環境推出適當的設置文件。在你的情況下,你將有三個文件,Production.config,Development.config和Test.config。然後,集成服務器將根據環境爲web.config或app.config創建此文件的副本。

至於參與維持每當配置變更三個單獨的文件的任何額外的維護,我們保持文件自動格式化並使用類似的WinMerge很容易地看到差異,並讓他們在恰當的同步。這些類型的文件通常不需要進行很多更改,而當他們做這些時,通常是很小的添加。

1

我目前做的類似於pdavis提到的解決方案的東西。但爲了簡化多個配置文件,我使用T4模板來創建環境特定的配置文件。這樣就有一個web.tt文件處理默認web.config文件的生成。每個環境都有自己的模板文件(qa.tt,production.tt等),它們是從web.tt繼承而來的,幷包含任何環境特定的覆蓋。到web配置的任何變化 - 新的應用程序設置,配置設置等由再生模板自動傳播到所有區域特定的配置文件,您不必擔心使用一個diff工具保持同步文件。

相關問題