11

.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;

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

除了在静态构造函数中手动设置所有这些设置的值之外,还有什么方法可以做到这一点?如果我必须这样做,我宁愿只拥有一个具有“DevOutputLocation”、“LiveOutputLocation”等属性的大型设置类。

我的项目中可以有多个 .settings 文件,但这只会创建不相互派生的单独类。所以我可以制作 DevelopmentSettings.settings、ProductionSettings.settings 和 TestSettings.settings 文件并赋予它们相同的属性,但是我需要到处使用一堆 switch 语句来确定要使用哪个类,因为它们不是从公共类派生的.

4

6 回答 6

3

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

同样,与其使用开关来作用于不同的类,您是否会考虑设计一个接口,并让每个类都实现该接口?

于 2010-02-11T23:04:28.783 回答
2

我将这种方法用于 .config 文件,我相信它也会对您有所帮助。只需查看Scott Hanselman 的博客文章这个问题。意识形态很简单,但效果很好。您只需要:

  1. 为不同的配置创建多个文件
  2. 按约定命名,例如 my.dev.settings、my.live.settings
  3. 创建构建后事件(见链接)
  4. 享受 =)

带有设置的类的实例化代码将始终查看默认设置(在每次构建后将替换为所需的设置),因此这种方法需要最少的努力。

于 2010-02-12T09:13:44.983 回答
1

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

至于在进行配置更改时维护三个单独文件所涉及的任何额外维护,我们保持文件自动格式化并使用 WinMerge 之类的工具轻松查看差异并保持它们正确同步。这些类型的文件通常不需要很多更改,并且当它们这样做时,它们通常是少量的添加。

于 2010-02-12T20:17:16.100 回答
1

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

于 2010-02-13T04:33:48.140 回答
0

只是一个想法,但它可能会奏效......

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

  • 清除除一个主控之外的所有“自定义工具”属性(因此只有一个主控生成)。

  • 修改每个版本的预构建脚本,将适当的设置文件内容复制到构建主文件中。

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

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

我也从来没有这样做过;虽然有时我希望在 VS 中有一种更先进的方式来做这样的事情。

于 2010-02-11T20:52:03.063 回答
0

只是一些关于基于 .NET 环境的配置文件的额外信息,而无需专门使用您的上述实现:

Enterprise Library 从 V3.0 开始就有这个特性: 总结

Visual Studio 2010 也将具有此功能。它称为配置转换

于 2010-02-12T19:02:59.810 回答