2011-11-10 90 views
1

我们如何在运行时覆盖配置文件。我有DEV,TEST,UAT,PROD的四个配置文件。基于用户选择,我需要用选择特定的配置文件之一完全覆盖默认配置文件。这些配置文件不仅具有appsettings部分,而且还具有复杂的cutom部分和具有很多属性的子元素。我需要在运行时动态覆盖和refreshsections。我知道有很多关于编辑appsettings部分的文章。但我想完全覆盖整个文件。感谢您在VB.net中的帮助。在wpf项目运行时更改或更新app.config

我有自定义部分:

回答

1

使用ClickOnce,我不相信你可以或应该安装文件夹中的文件更改,因为它是只读的。所以,你有一个选择:去与MSI安装和自定义安装操作以切换到相应的配置文件构建一些自定义配置元素来封装您的不同环境。

在我们的应用程序中,我们完成了后者。我们在我们的主app.config中有如下的自定义配置部分。

<myApp defaultEnvironmentName="prod">  
    <environments> 
    <add name="prod" title="Production" description="Full production environment" injectionContainers="prod"> 
     ... 
     <!-- Add custom elements the affect your environment --> 
     ... 
    </add> 
    <add name="qa" title="Quality Assurance" description="Full production environment except running off our mock database" injectionContainers="prod qa"> 
     ... 
     <!-- Add custom elements the affect your environment --> 
     ... 
    </add> 
    </environments> 
</myApp> 

... <!-- Other elements that are common to all environments --> ... 

然后我们使用一个run-time flag or command line argument,使你轻松的环境之间进行切换。正在使用的环境值存储在用户设置文件中,以便在后续使用时应用程序将加载上次使用的环境。

当我们需要访问的东西,每个环境的变化,我们直接在其使用的自定义配置节的CurrentEnvironment财产拨打上述设定去解决它:

var title = MyAppSection.Configured.CurrentEnvironment.Title; 

注意,在这里,MyAppSection.Configured只是一个单例实例,基于ConfigurationManager.GetSection(...)加载。

我意识到配置代码的小船负载的前景是你想要的最后一件事,但它会让你清楚地定义和隔离配置文件中的环境变量。