2011-11-10 104 views
1

我們如何在運行時覆蓋配置文件。我有DEV,TEST,UAT,PROD的四個配置文件。基於用戶選擇,我需要用選擇特定的配置文件之一完全覆蓋默認配置文件。這些配置文件不僅具有appsettings部分,而且還具有複雜的cutom部分和具有很多屬性的子元素。我需要在運行時動態覆蓋和refreshsections。我知道有很多關於編輯appsettings部分的文章。但我想完全覆蓋整個文件。感謝您在VB.net中的幫助。在wpf項目運行時更改或更新app.config

我有自定義部分:

回答

1

使用ClickOnce,我不相信你可以或應該安裝文件夾中的文件更改,因爲它是隻讀的。所以,你有一個選擇:去與MSI安裝和自定義安裝操作以切換到相應的配置文件構建一些自定義配置元素來封裝您的不同環境。

在我們的應用程序中,我們完成了後者。我們在我們的主app.config中有如下的自定義配置部分。

<myApp defaultEnvironmentName="prod">  
    <environments> 
    <add name="prod" title="Production" description="Full production environment" injectionContainers="prod"> 
     ... 
     <!-- Add custom elements the affect your environment --> 
     ... 
    </add> 
    <add name="qa" title="Quality Assurance" description="Full production environment except running off our mock database" injectionContainers="prod qa"> 
     ... 
     <!-- Add custom elements the affect your environment --> 
     ... 
    </add> 
    </environments> 
</myApp> 

... <!-- Other elements that are common to all environments --> ... 

然後我們使用一個run-time flag or command line argument,使你輕鬆的環境之間進行切換。正在使用的環境值存儲在用戶設置文件中,以便在後續使用時應用程序將加載上次使用的環境。

當我們需要訪問的東西,每個環境的變化,我們直接在其使用的自定義配置節的CurrentEnvironment財產撥打上述設定去解決它:

var title = MyAppSection.Configured.CurrentEnvironment.Title; 

注意,在這裏,MyAppSection.Configured只是一個單例實例,基於ConfigurationManager.GetSection(...)加載。

我意識到配置代碼的小船負載的前景是你想要的最後一件事,但它會讓你清楚地定義和隔離配置文件中的環境變量。