条件.NET应用程序设置

时间:2009-07-21 15:33:13

标签: .net app-config

我有一个客户端 - 服务器应用程序,其中有两个服务器选项 - 独立可执行文件或客户端中的另一个AppDomain,这非常便于调试。服务器的选择对客户端是透明的,唯一需要更改的文件是客户端app.config。

为了从独立服务器切换到本地服务器,需要取消注释某些部分(如nhibernate配置,仅与服务器相关)以及各个设置(如身份验证实现,仅限于与服务器相关的。)

截至目前,在两种模式之间切换是单调乏味且容易出错的,因为必须(取消)对几个部分和个别设置进行评论。

有没有办法在app.config中指定条件设置/部分?或者也许有一种方法可以在app.config中包含另一个配置文件?通过这种方式,我们可以将所有本地服务器特定设置放在另一个文件中,并且仅(un)注释其包含。

我想强调一个事实,除了应用程序设置之外,我希望有条件部分

最后的说明。所描述的场景显然不适合生产。它专门用于运行单元测试。我们使用mstest进行单元测试。

感谢。

8 个答案:

答案 0 :(得分:4)

在ASP.NET中,可以在外部文件中进行一些设置(但我不确定它是否也可以在Windows应用程序中使用):

更新:这也适用于控制台/ winforms应用程序。

的web.config / app.config中:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <!-- comment one of the following two lines -->

  <!--appSettings-->
  <appSettings file="YourSettings.config">

    <add key="KeyToOverride" value="Original" />
    <add key="KeyToNotOverride" value="Standard" />

  </appSettings>
</configuration>

YourSettings.config:

<appSettings>
  <add key="KeyToOverride" value="Overridden" />
  <add key="KeyToBeAdded" value="EntirelyNew" />
</appSettings>

答案 1 :(得分:3)

对于普通的appSettings,规范就是使用它:

<appSettings file="appSettings.config" />

对于其他部分,您可以使用

<mySection configSource="mySection.config" />

每个部分必须有一个文件,而configSource只能用于相对路径。

对于您的特定情况,我建议为每个设置/配置建立一个文件夹。

<mySection1 configSource="setup1\mySection1.config" />
<mySection2 configSource="setup1\mySection2.config" />

然后,您可以在文件夹名称上手动执行文本“查找和替换”以在设置之间切换,或者运行批处理文件或构建步骤以切换文件系统上的文件夹(即将setup1文件夹复制到currentSetup文件夹)

请注意,您不能在system.serviceModel上使用configSource,但可以使用其子章节

答案 2 :(得分:1)

一种方法是使用构建事件。创建两个应用程序设置文件,每个文件根据部署类型命名。为每种类型的部署创建新的构建配置。

有一个预构建事件,用于确定正在执行的构建配置的类型,然后通过复制专用配置文件并将其命名为“app.config”来创建“app.config”文件。

答案 3 :(得分:1)

添加新设置 - AppType = Server / Standalone - 复制App.Config中基于Server / Standalone更改的每个设置,这样无论Server / Standalone如何,只有1个app.config。将条件选项移动到您的App中。

if(AppType == ApplicationType.Server)
{
   Setup(NHibernate);
   Setup(Authentication Implementation);
}
else
{
   Setup(Standalone app stuff);
}

答案 4 :(得分:1)

app.config或web.config文件可以引用外部配置文件。

<configuration>
  <appSettings file="external.config">
  </appSettings>
</configuration>

MSDN appSettings reference

答案 5 :(得分:1)

System.Configuration支持包含configsource属性的包含文件。请参阅此处http://msdn.microsoft.com/en-us/library/system.configuration.sectioninformation.configsource.aspx或此处http://rizwanshah.blogspot.com/2007/10/use-configsource-attribute-to-manage.html

你可以像这样使用它:

<SomeSection configSource="myOtherFile.config" />

我们习惯在声明性wcf配置等/ / / p>中添加不同的部分

答案 6 :(得分:0)

nAnt可能是另一种解决方案。

答案 7 :(得分:0)

简单回答:只需使用命令行参数即可。我目前正在开发一个项目,需要在“本地”(用于测试/调试目的)和“服务器”(当我将其部署到生产机器时)之间切换。当我处于调试模式时,我只是将visual studio传递给'local'作为命令行参数,并使用该参数的存在来在运行时配置软件以执行我需要它做的事情。

没有任何参数会导致软件表现得像是在生产中。当软件准备发布时,我将完全删除参数逻辑。