【问题标题】:Use multiple setting files and select them at run time使用多个设置文件并在运行时选择它们
【发布时间】:2017-11-08 20:21:33
【问题描述】:

截至今天,我的项目中有一个App.config 文件。

我在程序中这样使用我的配置设置:

ConfigurationManager.AppSettings["FileDir"];

其中 FileDirApp.config 中的设置,定义如下:

<appSettings>
  <add key="FileDir" value="C:\MyFolder" />
</appSettings>

如果我的项目名为MyProject,则在我的构建文件夹(DebugRelease)中,该文件将显示为MyProject.exe.config

我想添加多个具有完全相同变量但值不同的类似配置文件,并且我想使用命令行参数指向配置文件,以便我可以重用相同的程序但具有不同的设置。

如何告诉我的程序选择哪个配置文件?

【问题讨论】:

  • 为什么不直接创建许多键并使用前缀作为 id?
  • @MarcoSalerno 也可以。但我不认为这是最优的,是吗?我的客户也不想更改旧版本程序中的任何设置。如果我找不到更好的选择,我会选择它。
  • 用我的解决方案回答了
  • 可以使用ConfigurationManager.OpenExeConfiguration(path_to_file) - “将指定的客户端配置文件作为Configuration对象打开。”
  • @stuartd 我会试一试,然后再回复你。谢谢。

标签: c# application-settings


【解决方案1】:

我会这样做:

<appSettings>
    <add key="WordV1" value="abc" />
    <add key="WordV2" value="def" />
    <add key="WordV3" value="ghi" />
</appSettings>

string word = ConfigurationManager.AppSettings["WordV" + user.version];

【讨论】:

    【解决方案2】:

    通常的方法是使用基于构建配置应用的转换文件。因此,您仍然只有一个配置文件,但根据构建的预期用途,它的构建方式会有所不同。

    像 SlowCheetah 这样的东西可以做到这一点,或者如果你使用 octopus deploy 这样的东西进行部署,那么可以在部署时做到这一点。

    https://marketplace.visualstudio.com/items?itemName=VisualStudioProductTeam.SlowCheetah-XMLTransforms

    【讨论】:

    • OP 要求 runtime 选择过程,但您的答案是 build-time 选择过程。
    【解决方案3】:

    另外的解决方案怎么样,尤其是在说明之后:

    截至今天,我的项目中有一个 App.config 文件。

    为什么你没有自己的设置类?您可以使用代码中的一组默认设置来维护它——这比尝试维护多个 App.config 文件要干净得多。比如:

    [Serializable]
    public class AppSettings
    {
      public string FileDir { get; set; }
    
      public AppSettings()
      {
        FileDir = string.Empty;
      }
    
      public AppSettings(string fDir)
      {
        FileDir = fDir;
      }
    
      public void SetDefault()
      {
        FileDir = "SomeDefault";
      }
    }
    

    您可以有不同的实例,或者根据您的需要,您可以加载第二组设置:

    m_dSettings = SettingsIO.GetSettings(Path.Combine(Application.StartupPath, "DefaultSettings.xml"));
    m_cSettings = SettingsIO.GetSettings(Path.Combine(Application.StartupPath, "CustomSettings.xml"));
    m_eSettings = new AppSettings("F:\\Dir");
    
    SettingsIO.WriteSettings(m_dSettings, Path.Combine(Application.StartupPath, "DefaultSettings.xml"));
    SettingsIO.WriteSettings(m_dSettings, Path.Combine(Application.StartupPath, "CustomSettings.xml"));
    SettingsIO.WriteSettings(m_eSettings, Path.Combine(Application.StartupPath, "ExtraSettings.xml"));
    

    持久化上述内容的类:

    using System.Xml.Serialization;
    using System.IO;
    
    public static class SettingsIO
    {
      public static void WriteSettings(AppSettings settings, string settingsFilePath)
      {
        XmlSerializer serializer = new XmlSerializer(typeof(AppSettings));
    
        if (!Directory.Exists(Path.GetDirectoryName(settingsFilePath)))
          Directory.CreateDirectory(Path.GetDirectoryName(settingsFilePath));
    
        using (StreamWriter SW = new StreamWriter(settingsFilePath))
          serializer.Serialize(SW, settings);
      }
    
      public static AppSettings GetSettings(string settingsFilePath)
      {
        AppSettings m_Settings = null;
    
        if (File.Exists(settingsFilePath))
        {
          XmlSerializer serializer = new XmlSerializer(typeof(AppSettings));
    
          using (FileStream FS = new FileStream(settingsFilePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
            using (StreamReader SR = new StreamReader(FS))
              m_Settings = (AppSettings)serializer.Deserialize(SR);
        }
    
        if (m_Settings == null)
          m_Settings = new AppSettings();
    
        return m_Settings;
      }
    }
    

    【讨论】:

    • 看起来很结实。让我试试然后回来。
    猜你喜欢
    • 2014-11-03
    • 1970-01-01
    • 2014-07-21
    • 2012-06-17
    • 2010-11-16
    • 2011-02-22
    • 1970-01-01
    • 2012-07-05
    • 1970-01-01
    相关资源
    最近更新 更多