我有一个客户端 - 服务器应用程序,其中有两个服务器选项 - 独立可执行文件或客户端中的另一个AppDomain,这非常便于调试。服务器的选择对客户端是透明的,唯一需要更改的文件是客户端app.config。
为了从独立服务器切换到本地服务器,需要取消注释某些部分(如nhibernate配置,仅与服务器相关)以及各个设置(如身份验证实现,仅限于与服务器相关的。)
截至目前,在两种模式之间切换是单调乏味且容易出错的,因为必须(取消)对几个部分和个别设置进行评论。
有没有办法在app.config中指定条件设置/部分?或者也许有一种方法可以在app.config中包含另一个配置文件?通过这种方式,我们可以将所有本地服务器特定设置放在另一个文件中,并且仅(un)注释其包含。
我想强调一个事实,除了应用程序设置之外,我希望有条件部分。
最后的说明。所描述的场景显然不适合生产。它专门用于运行单元测试。我们使用mstest进行单元测试。
感谢。
答案 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>
答案 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'作为命令行参数,并使用该参数的存在来在运行时配置软件以执行我需要它做的事情。
没有任何参数会导致软件表现得像是在生产中。当软件准备发布时,我将完全删除参数逻辑。