覆盖配置设置

问题描述 投票:0回答:4

我有一个在多个项目中使用的配置文件,

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
在这种情况下有效。我可以从
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 
c# .net configuration app-config
4个回答
4
投票

MSDN有助于回答这个问题:

您可以使用文件属性 指定一个配置文件 提供附加设置或 覆盖的设置 在 appSettings 元素中指定。 您可以在中使用文件属性 源代码控制团队开发 场景,例如当用户想要 覆盖项目设置 在申请中指定 配置文件。配置 文件中指定的文件 属性必须具有 appSettings 元素而不是配置 元素作为根节点。

因此,

general.config
中的设置将覆盖
app.config
中的项目。这与您想要的相反(让
app.config
项目覆盖
general.config
项目)。您必须在 C# 代码中解决这个问题(它不可避免地看起来很难看)。


1
投票

您使用

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

Microsoft 的目的是让

file
属性加载覆盖单个应用程序设置的通用设置。

这在 Microsoft 文档

中有详细讨论

为了克服这个问题,我们偶尔会在公共文件中声明基本设置,然后在应用程序配置中适当命名覆盖。然而,这确实需要额外的代码,这有点难看。例如

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
投票

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

由于您在父文件中使用

remove
,它的有效作用是删除您在 app.config 中指定的元素,但之后会将 General.config 中的元素推入。现在在 General.config 中说您说删除
 mykey3
在你的 app.config 中,你会看到最终的集合没有
mykey3
这样的键。

简而言之,这是行不通的。希望这对您有帮助。


0
投票

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

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

在 app.config appsettings 部分将如下所示

<appSettings file="Test.config">
   <add key="mykey1" value="myvalue1"/>
</appSettings>
© www.soinside.com 2019 - 2024. All rights reserved.