2011-06-29 254 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>