覆盖配置设置

11

我有一个在多个项目中使用的配置文件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而不破坏mykey2?在这种情况下使用add。 我可以从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 

你是指 config 转换吗? - Alex R.
希望通过“file”指定的路径是相对于配置文件的,否则它将被忽略。 - V4Vendetta
@V4Vendetta:你说得对。编译时,general.config会被复制到输出文件夹中。 - Cheng Chen
4个回答

4
我的一个朋友回答了这个问题。来自MSDN的解释如下:

您可以使用file属性指定配置文件,该文件提供额外的设置或覆盖在appSettings元素中指定的设置。您可以在源代码控制团队开发场景中使用file属性,例如当用户想要覆盖应用程序配置文件中指定的项目设置时。在file属性中指定的配置文件必须具有appSettings元素而不是configuration元素作为根节点。

所以在这个问题中,general.config中的设置会覆盖app.config中的项目,与我想要的相反。现在我认为我必须在C#代码中解决这个问题(看起来可能不太美观)。

1
您使用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>

0

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

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

在 app.config 的 appsettings 部分将会是这样的

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

但在这种情况下,我失去了general.config中的所有其他项,例如mykey2 - Cheng Chen
@Danny Chen:它正在正确地工作。它只替换具有键'mykey1'的属性值。而其他所有值都与app.config文件中的相同。 - Mahesh KP

0

元素是从子级更改的,我的意思是当前的app.config是父文件,值被现有的General.config中的值替换。

由于您在父文件中使用了remove,它实际上正在删除您在app.config中指定的元素,但在此之后,来自general.config的元素被推入。 现在假设在General.config中您说要删除mykey3,而这个键在您的app.config中存在,您将看到最终集合中没有mykey3键。

简而言之,这不会起作用。希望这可以帮助您。


不对。general.config 不是一个完整的配置文件,它是一个配置文件的公共部分(章节),被我所有的配置文件共享。 - Cheng Chen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接