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

7
我还没有看到一个令人满意的答案,所以我想问一下。在文件中存储UI设置是否有最佳实践?
情景是这样的:我们有一个内部C#应用程序,我想在其中存储文件/文件夹数组以及其他随机内容(在执行外部命令时使用的标志,传递给可选比较算法的可选参数等)。由于这些值的性质,使用内置的app.config方法不起作用。因此,在将半复杂的设置存储到设置文件中时,是否有最佳实践?
目前,我存储的最复杂的将是需要存储文件名、比较算法和参数文本的单个条目列表。因此,它不全是简单的键/值数据。
我正在寻求以下方面的建议:
  • 布局(例如,如果是XML,则值应该在属性中而不是节点值中)
  • 格式(XML、YAML等)
  • 框架
这不会存储敏感数据,因此安全性不是问题。
我目前打算只使用XmlDocument和为每个不同集合创建单独的类。但我觉得应该已经存在某些现有的框架来完成这个任务。
谢谢!

我认为这不是重复的问题,因为那个问题的答案都描述了如何存储WPF设置和/或该文件的位置。我正在寻找存储结构化设置和最佳实践的方法。 - Jason S.
“最佳实践”是“你对此有什么看法?”的同义词,这个问题不在讨论范围内(因为主观性答案会引起麻烦)。 - George Stocker
2个回答

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(),如下所示:

MyConfigSettings settings = JsonConvert.DeserializeObject<MyConfigSettings>(jsonString);

这里,MyConfigSettings是配置设置类。相应的成员将必须声明为带有适当get; set;属性的public属性。

这将加载所有的配置设置到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 或更高版本。

一个快速入门示例在这个链接中给出。


使用配置部分的开箱即用解决方案,我认为这远非最佳实践。 - Ivo
我喜欢这个解决方案,但正如ivowiblo所提到的,拥有一些开箱即用的东西更理想。我觉得如果我不是在编写C#程序,那么我可能会实现这个。 - Jason S.

2
您还可以定义自定义配置部分,然后将设置放在单独的配置文件中,以避免杂乱无章地填满app.config。自定义配置模块允许您为自己的复杂设置定义结构,并将它们存储在标准配置文件中。如果您使用过Entity Framework、Enterprise Library或类似工具,则可能已经看到它们在文件顶部被定义。在谷歌上快速搜索一下,就能找到关于此主题的另一个StackOverflow帖子。
如需了解更多信息,请参阅:如何在app.config中创建自定义配置部分

我有点想沿着这个方向思考。谢谢! - Jason S.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接