是否存在将UI设置存储在文件中的最佳实践?

时间:2013-08-23 05:40:35

标签: c# user-interface settings configuration-files

我还没有看到令人满意的答案,所以我想我会问。是否有将UI设置存储在文件中的最佳实践?

场景是我们有一个内部C#应用程序,我想存储一个文件/文件夹数组以及其他随机的东西(执行外部命令时使用的标志,传递给可选择的比较算法的可选参数,等等)。由于这些值的性质,使用内置的app.config方法是行不通的。那么在将半复杂设置存储到设置文件时是否有任何最佳实践?

目前我存储的最复杂的是一个列表,其中包含一个需要存储文件名,比较算法和参数文本的条目。所以它不是所有简单的键/值数据。

我在寻找想法:

  • 布局(例如,如果XML,值应该在属性vs node.value中)
  • 格式(XML,YAML等)
  • 框架

这不会存储敏感数据,因此安全性不是问题。

我目前正在寻找使用XmlDocument并为每个不同的集合分离类。但我觉得应该有一些现有的框架。

谢谢!

2 个答案:

答案 0 :(得分:10)

您是对的,不应将此类设置存储在app.config文件中。它只是增加了混乱。在这种情况下,最好像在票证中提到的那样创建另一个配置文件。

您计划将此配置文件构造为XML文档。这是一个好主意。这也意味着您的配置数据是结构化的。那太好了。

我建议你选择JSON。这将允许您在运行时使用非常少的代码行将配置设置加载到您的应用程序中。试试NewtonSoft.JSON(又名.JSON.Net)。

您可以按照以下步骤快速添加和使用配置设置:

  1. 使用Nuget包管理器安装NewtonSoft.JSON
  2. 将对此库的引用添加到项目和.cs文件(使用NewtonSoft.Json)
  3. 为您的配置设置创建一个C#类。对于重复块,您可以使用List<string>或任何其他相关数据类型,甚至是int - 因此您也不必进行任何类型转换。
  4. 将JSON文件读入字符串对象
  5. 使用JsonConvert.DeserializeObject()
  6. MyConfigSettings settings = JsonConvert.DeserializeObject<MyConfigSettings>(jsonString);

      

    此处MyConfigSettings是配置设置类。必须将相应的成员声明为public属性,并定义了正确的get; set;属性。

         

    这会将所有配置设置加载到settings对象。最好的部分是,任何缺少的配置值都将被自动跳过,因此您不必拥有任何复杂的解析算法。

    要将配置值写入JSON文件,您可以填充settings对象中的值并使用以下命令对其进行序列化:

    // Indented so that it looks readable when the config file is opened in editor like Notepad
    string data = JsonConvert.SerializeObject<MyConfigSettings>(settings, Formatting.Indented);
    // Now just store string object data to the config file
    
      

    注意:这需要.Net 4.0 +

    this example中提供了快速入门。

答案 1 :(得分:2)

如果您不想混淆app.config,还可以定义自定义配置部分,然后将设置放在单独的配置文件中。自定义配置模块允许您为自己的复杂设置定义结构,并将它们存储在标准配置文件中。如果您使用过Entity Framework,Enterprise Library等,那么您可能已经在文件顶部看到了它们。谷歌的快速搜索发现了另一篇关于这个主题的StackOverflow帖子。

How to create custom config section in app.config