如何在.NET中为不同的环境使用不同的.settings文件?

时间:2010-02-11 19:38:19

标签: .net settings application-settings

.NET允许您使用.settings文件来管理应用程序设置。我想以一种我可以这样做的方式单独存储生产,开发和测试设置:

EnvironmentSettings environmentSettings;

// get the current environment (Production, Development or Test)
ApplicationEnvironment Environment = (ApplicationEnvironment)
    Enum.Parse(typeof(ApplicationEnvironment), Settings.Default.ApplicationEnvironment);

switch (Environment)
{
    case ApplicationEnvironment.Production:
        environmentSettings = Settings.Production;
        break;
    ...
}

string reportOutputLocation = environmentSettings.ReportOutputLocation;

基本上,我需要两个单独的Settings类:存储所选环境和非环境特定属性的常规Settings类,以及名为EnvironmentSettings的第二个类的3个静态实例。使用的实例应取决于常规Settings类中指定的环境。

有没有办法在静态构造函数或其他东西中手动设置所有这些设置的值?如果我必须这样做,我宁愿只有一个大的Settings类,其中包含“DevOutputLocation”,“LiveOutputLocation”等属性。

我的项目中可以有多个.settings文件,但这只是创建了不相互派生的单独类。所以我可以创建DevelopmentSettings.settings,ProductionSettings.settings和TestSettings.settings文件并给它们相同的属性,但是我需要在任何地方使用一堆switch语句来确定要使用哪个类,因为它们不是从公共类派生的

6 个答案:

答案 0 :(得分:2)

一种想法是,在一系列静态值之间切换听起来像是一种相当令人兴奋的做事方式。 我建议查找Singleton模式。此模式为您提供了在类的所有引用之间共享的单个类实例,但是当它首次加载时,您可以执行常规初始化位来检查您的环境并相应地设置值。

同样地,您不是要设计一个接口,而是让每个类实现该接口,而不是使用开关来处理不同的类?

答案 1 :(得分:2)

我对.config文件使用这种方法,我相信它也会对你有帮助。 只需查看Scott Hanselman's blog postthis question 即可。意识形态就像地狱一样简单,但效果很好。您只需要:

  1. 为不同的配置创建多个文件
  2. 按惯例命名,例如my.dev.settings,my.live.settings
  3. 创建帖子构建事件(请参阅链接)
  4. enjoy =)
  5. 具有设置的类的实例化代码将始终以默认设置(在每次构建后将使用所需的设置替换),因此这种方法只需要很少的工作量。

答案 2 :(得分:1)

进行检查以确定您正在运行的环境涉及到一些开销。如果您正在谈论Web环境,那么这可能意味着性能受到重大影响。我建议创建三个单独的配置文件,并设置一个持续集成和部署系统,根据环境处理命名和推出正确的设置文件。在您的情况下,您将有三个文件,Production.config,Development.config和Test.config。然后,集成服务器将根据环境为web.config或app.config创建此文件的副本。

对于在进行配置更改时维护三个单独文件所涉及的任何其他维护,我们保持文件自动格式化并使用类似WinMerge的内容轻松查看差异并使它们保持正确同步。这些类型的文件通常不需要进行很多更改,当它们发生时,它们通常是次要的添加。

答案 3 :(得分:1)

我目前做的事情类似于pdavis提到的解决方案。但是为了简化多个配置文件,我使用T4模板来创建特定于环境的配置文件。这样就有一个web.tt文件可以处理默认web.config文件的生成。每个环境都有自己的模板文件(qa.tt,production.tt等),它继承自web.tt并包含任何特定于环境的覆盖。对Web配置的任何更改 - 新的应用程序设置,配置设置等都会通过重新生成模板自动传播到所有区域特定的配置文件,您不必担心使用diff工具保持文件同步。

答案 4 :(得分:0)

只是一个想法,但它可能有用......

  • 您需要N + 2个设置文件(N. 不同的构建; 2个主人) 包含相同的键。

  • 清除“自定义工具”属性 对于他们所有人,但其中一个主人(所以 只有一个主人生成)。

  • 修改每个版本的预构建脚本,将相应的设置文件内容复制到build-master文件中。

  • 修改构建后脚本,将辅助主文件内容复制回原始主文件。

注意:如果您可以在构建前和构建后脚本中使用源代码管理提供程序,则不需要辅助主服务器 - 您可以在预构建中检出并撤消检出生成后。但是,这可能会导致持续集成环境中出现问题,因为锁定的文件需要构建失败。

我也从未这样做过;虽然有时候我希望在VS中有一种更为前瞻性的做法。

答案 5 :(得分:0)

关于基于.NET环境的配置文件的一些额外信息,而不使用上述实现:

自V3.0起,企业库具有此功能: Summary

Visual Studio 2010也将具有此功能。它被称为Config Transformation