2

在我的组织中,我们有多个环境(Dev、QA、Stage、Prod、灾难恢复),我希望我的 app/web.config 文件在 URI、连接字符串等中不包含特定于环境的详细信息。我首选的方法是执行运行时替换,例如:

<endpoint address="http://MyDevWebServer/SomeService" binding="basicHttpBinding"...

我更喜欢这样的东西:

<endpoint address="http://{Env:WebServerName}/SomeService" binding="basicHttpBinding"...

这对于从我可以控制的类中读取的配置设置很简单(只需提供一个包装器,用该环境的实际服务器名称执行替换 {Env:WebServerName}),但我也希望在从中读取设置时进行这种替换我无法控制的类(例如 WCF、NHibernate 等)。有谁知道注入这种替换逻辑的方法。我假设 AOP 方法可能是可能的,但个人对 AOP 框架没有太多经验。

4

6 回答 6

1

您应该能够通过从提供此替换的ApplicationSettingsBase派生自定义类来做到这一点。

我建议阅读Application Settings Architecture。它描述了制作你自己的设置架构的过程,包括设置你自己的处理程序,它可以从任何源读取,或者在这个过程中做其他工作。

于 2009-10-06T16:18:14.627 回答
1

一种方法是将 ConfigSource 用于配置部分(appSettings、connectionStrings 等)。有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/system.configuration.sectioninformation.configsource.aspx。这样,web/app.config 可以包含核心信息,并且可以在该环境的文件中设置独特的环境设置。

于 2009-10-06T16:20:07.983 回答
1

我们有一个构建后的 nant 脚本,它使用 XPath 来识别和替换特定于环境的值,具体取决于我们所针对的环境。默认情况下,所有配置值都是针对开发环境的。这给构建过程增加了短暂的延迟,但在实践中证明是一个非常强大的解决方案——即没有混乱或交叉的环境设置。

于 2009-10-06T16:27:26.313 回答
0

我们将设置移至数据库,此后无需处理此问题,请参见此处。

于 2009-10-06T16:34:06.327 回答
0

我完全同意这种替换是可取的,并在 Microsoft Connect 上请求了此功能

微软对它的兴趣不大 :(

于 2009-10-06T17:52:45.980 回答
0

当您试图找到一种方法来进行运行时替换时,我建议在这种情况下构建时替换将是一个更好的解决方案。例如,我们在构建期间使用 nant 任务xmlpoke替换配置值。您还可以尝试在Web 部署项目中替换 web.config 部分,或者从 MSBuild 社区任务(示例)中尝试​​ XmlMassUpdate 任务。

于 2009-10-06T18:19:39.437 回答