2011-06-29 322 views
8

我有一個在多個項目中使用,general.config一個配置文件,看起來像:覆蓋配置設置

<?xml version="1.0" encoding="utf-8" ?> 
<appSettings> 
    <add key="mykey1" value="myvalue1"/>  
    <add key="mykey2" value="myvalue2"/> 
</appSettings> 

在項目中的一個,我需要重寫的兩個設置之一。所以這個項目的app.config樣子:

<?xml version="1.0"?> 
<configuration> 
    <appSettings file="general.config"> 
    <remove key="mykey1"/> 
    <add key="mykey1" value="anothervalue"/> 
    <add key="mykey3" value="myvalue3"/> 
    </appSettings> 
</configuration> 

remove不能在這裏工作。如何在不中斷mykey2的情況下覆蓋mykey1add在這種情況下工作。我可以從ConfigurationManager得到myvalue3

編輯:general.config在編譯時自動複製到輸出文件夾。不要擔心路徑問題。目前,我得到:

ConfigurationManager.AppSettings["mykey1"] 
    //I got "myvalue1", but I want "anothervalue" here 
    //that is, this item is "overrided", just like virtual methods in C# 
ConfigurationManager.AppSettings["mykey2"] 
    //this setting will not be modified, currently it works fine 
ConfigurationManager.AppSettings["mykey3"] //good 
+0

你指的是'config'轉型? –

+0

希望通過'file'指定的路徑與配置相關,否則將被忽略 – V4Vendetta

+0

@ V4Vendetta:你是對的。編譯時,general.config被複制到輸出文件夾。 –

回答

2

我的一個朋友回答了這個問題。從MSDN

您可以使用文件屬性爲 指定配置文件 提供額外設置或 覆蓋是在的appSettings元素中指定 的設置。 您可以使用文件屬性中 源控制團隊開發 情況下,當用戶想要 來覆蓋 在應用程序中 配置文件中指定的項目設置,如。在文件 屬性中指定的配置文件 必須具有appSettings 元素而不是配置 元素作爲根節點。

所以在這個問題上,在app.configgeneral.config覆蓋項目的設置,從我認爲不同的(希望)app.config項目將覆蓋general.config項目。現在我想我必須在C#代碼中解決這個問題(這將不可避免地看起來很醜)。

+0

是的..正如我指出的那樣..其實並不是你想要的方式 – V4Vendetta

0

的元素從孩子改變,目前我的意思是你的app.config是父文件和值由現有General.config

的那些取代

由於您在父文件中使用的是remove,它的有效操作是刪除您在app.config中指定的元素,但之後會從general.config中將元素推入。現在在General.config中說,您可以刪除mykey3這是在你的app.config中,你會看到最終的集合沒有密鑰mykey3

總之這不起作用。希望這對你有所幫助。

+0

不正確。 'general.config'不是一個完整的配置文件,它是配置文件的一個常見部分(部分),由我的所有配置文件共享。 –

0

你可以添加另一個配置文件說Test.config。

<appSettings> 
    <add key="mykey1" value="New value"/> 
</appSettings> 

和在應用程序中。配置appSettings部分看起來像這樣

<appSettings file="Test.config"> 
    <add key="mykey1" value="myvalue1"/> 
</appSettings> 
+0

但是在這種情況下,我失去了'general.config'中的所有其他項目,比如'mykey2'。 –

+0

@Danny Chen:工作正常。它只是用鍵'mykey1'替換屬性的值。並且所有其他值與app.config文件中的值相同 –

0

您使用file屬性的加載與鍵直接添加到<appSettings>元素將覆蓋這些常見的設置是可以理解的期待常用設置,但不幸的是不是如何作品。

微軟的意圖是爲file屬性加載覆蓋個別應用程序設置的常用設置。

這在一些細節的Microsoft Documentation

討論爲了克服這個問題,我們很偶然在共同文件中聲明的基礎設置,然後適當命名的應用程序配置覆蓋。然而,這確實需要額外的代碼,這有點難看。例如

var config = ConfigurationManager.AppSettings["MSG_QUEUE_PROVIDER_OVERRIDE"] 
    ?? ConfigurationManager.AppSettings["MSG_QUEUE_PROVIDER"] 
    ?? "ActiveMQ"; 

<appSettings file="common.config"> 
    <!-- Override the common values --> 
    <add key="MSG_QUEUE_PROVIDER_OVERRIDE" value="RabbitMQ"/> 
</appSettings>