覆盖配置设置

时间:2011-06-29 06:01:17

标签: c# .net configuration app-config

我有一个配置文件,用于多个项目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在这里不起作用。如何在不破坏mykey1的情况下覆盖mykey2add适用于此案例。我可以从myvalue3获得ConfigurationManager

编辑: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 

4 个答案:

答案 0 :(得分:3)

我的一个朋友回答了这个问题。来自MSDN

  

您可以使用file属性   指定一个配置文件   提供其他设置或   覆盖的设置   在appSettings元素中指定。   您可以使用文件属性   源控制团队开发   场景,例如用户想要的场景   覆盖项目设置   在应用程序中指定   配置文件。组态   文件中指定的文件   属性必须具有appSettings   元素而不是配置   element作为根节点。

因此,在此问题中,general.config中的设置会覆盖app.config中与我认为(想要)app.config项目不同的项目会覆盖general.config中的项目。现在我认为我必须用C#代码来解决这个问题(它将不可避免地看起来很丑陋)。

答案 1 :(得分:1)

您使用file属性来加载常见设置,并期望直接添加到<appSettings>元素的键会覆盖这些常用设置,这是可以理解的,但不幸的是,这不是它的工作原理。< / p>

Microsoft的意图是file属性加载覆盖单个应用程序设置的常用设置。

Microsoft Documentation

中对此进行了详细讨论

为了解决这个问题,我们偶尔会在公共文件中声明基本设置,然后在应用程序配置中适当地命名覆盖。但是,这确实需要额外的代码,这有点难看。 e.g。

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>

答案 2 :(得分:0)

元素是从孩子改变的,我的意思是当前你的app.config是父文件,值被General.config中存在的值替换

由于您在父文件中使用remove,它实际上正在删除您在app.config中指定的元素,但之后将推入general.config中的元素。现在请在General.config中说明你说删除了app.config上的mykey3,你会看到最终的集合没有mykey3的密钥。

简而言之,这是行不通的。希望这有助于你。

答案 3 :(得分:0)

您可以添加另一个配置文件,例如Test.config。

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

并在app.config appsettings部分中看起来像这样

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