覆盖配置设置
本文关键字:设置 配置 覆盖 | 更新日期: 2023-09-27 18:00:51
我有一个在几个项目中使用的配置文件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
的情况下覆盖mykey1
?add
在这种情况下起作用。我可以从ConfigurationManager
得到myvalue3
。
EDIT: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
我的一个朋友回答了这个问题。来自MSDN:
可以使用文件属性指定一个配置文件提供附加设置或替代在appSettings元素中指定。可以在中使用文件属性源代码管理团队开发场景,例如用户需要要覆盖在应用程序中指定配置文件。配置在文件中指定的文件属性必须具有appSettings元素而非配置元素作为根节点。
所以在这个问题中,general.config
中的设置覆盖了app.config
中的项目,与我认为(希望(app.config
项目覆盖general.config
中的项目不同。现在我想我必须在C#代码中解决这个问题(它不可避免地看起来很难看(。
使用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>
元素从子文件更改,我的意思是当前您的app.config是父文件,值被General.config 中现有的值替换
由于您在父文件中使用remove
,它的有效作用是删除您在app.config中指定的元素,但在此之后,general.config中的元素将被推入。现在,在general.config中,您说删除app.config上的mykey3
,您将看到最终集合没有mykey3
键。
简而言之,这是行不通的。希望这对你有所帮助。
您可以添加另一个配置文件,比如Test.config.
<appSettings>
<add key="mykey1" value="New value"/>
</appSettings>
在app.config的appsettings部分中
<appSettings file="Test.config">
<add key="mykey1" value="myvalue1"/>
</appSettings>