【问题标题】:Override config settings覆盖配置设置
【发布时间】:2011-09-24 20:56:43
【问题描述】:

我有一个用于多个项目的配置文件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 

【问题讨论】:

  • 你指的是config转换吗?
  • 希望通过file指定的路径是相对于配置的,否则会被忽略
  • @V4Vendetta:你说得对。编译时将general.config复制到输出文件夹。

标签: c# .net configuration app-config


【解决方案1】:

您使用file 属性加载常用设置并期望直接添加到&lt;appSettings&gt; 元素的键会覆盖这些常用设置是可以理解的,但不幸的是它不是这样工作的。

Microsoft 的意图是让 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>

【讨论】:

    【解决方案2】:

    您可以添加另一个配置文件,例如 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
    • @Danny Chen:它工作正常。它只用键“mykey1”替换属性的值。其他值与app.config文件中的值相同
    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

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

      由于您在父文件中使用remove,它的有效作用是删除您在 app.config 中指定的元素,但之后将来自 general.config 的元素推入。现在在 General.config 中说您说删除 app.config 中的 mykey3,您会看到最终集合没有 mykey3 的键。

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

      【讨论】:

      • 不正确。 general.config 不是一个完整的配置文件,它是一个配置文件的公共部分(部分),由我所有的配置文件共享。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-14
      • 2023-01-28
      • 1970-01-01
      • 2017-09-08
      • 2014-07-02
      • 1970-01-01
      相关资源
      最近更新 更多