Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
保持C#应用程序设置/配置的最佳实践_C#_Mysql_Entity Framework_Application Settings_Configuration Management - Fatal编程技术网

保持C#应用程序设置/配置的最佳实践

保持C#应用程序设置/配置的最佳实践,c#,mysql,entity-framework,application-settings,configuration-management,C#,Mysql,Entity Framework,Application Settings,Configuration Management,我正在努力解决如何持久化我的C#应用程序读取并更新的首选项/设置/配置的问题。我的配置可以是 表示连接字符串、目录名、文件名等的单个整数、字符串、字节[] 字符串或其他值类型的集合 类对象实例,这些实例表示一组主要是值类型 ->这些设置在不同的、有时不相关的类中访问 鉴于以下要点,我目前正在思考您认为什么是最佳实践: 自写的键/值存储。在内部,键/值存储在哈希表中,哈希表被序列化/反序列化以实现持久性 实体框架:我可以访问MS实体框架并运行MySQL服务器实例 文本文件/XML文件 还有其

我正在努力解决如何持久化我的C#应用程序读取并更新的首选项/设置/配置的问题。我的配置可以是

  • 表示连接字符串、目录名、文件名等的单个整数、字符串、字节[]
  • 字符串或其他值类型的集合

  • 类对象实例,这些实例表示一组主要是值类型

->这些设置在不同的、有时不相关的类中访问

鉴于以下要点,我目前正在思考您认为什么是最佳实践:

  • 自写的键/值存储。在内部,键/值存储在哈希表中,哈希表被序列化/反序列化以实现持久性

  • 实体框架:我可以访问MS实体框架并运行MySQL服务器实例

  • 文本文件/XML文件

  • 还有其他/更好的主意吗

排除:

  • 我不想在settings.settings、App.config等中存储任何设置

  • 我不想使用注册表

  • 我不想将设置存储在任何模糊的漫游目录结构或其他隐藏目录中。设置应存储在专用数据库/表或应用程序可执行文件夹或子文件夹中

问题:

  • 我不确定是将所有配置对象存储在同一个实体中,还是应该设置几个这样的实体来存储配置组
  • 保存这些作为设置/配置的轻量级对象并在以后加载和访问它们的最佳方法是什么

您可以将设置存储在WMI名称空间中。我们在那里存储了一个特定于产品的设置和配置。另外,尽管您已排除App.config,但特定于应用程序的设置通常会存储在其中。

我建议在这种情况下使用XML

  • 它很容易写和读

  • 可读性强,易于手动打开和编辑

  • 使用LINQtoXML,您可以查询特定数据并将该数据转换为强类型对象

  • 广泛使用和理解,尤其是配置文件

  • 柔性结构

这些只是我想到的几件事。下面是查询文件中所有tcp类型协议的示例代码

XElement settings = XElement.Load("settings.xml");
IEnumerable<XElement> tcpSettings = settings.Elements("protocol").Where(o => o.Attribute("name").Value == "tcp")
// make some changes to the settings
settings.Save("settings.xml");
XElement settings=XElement.Load(“settings.xml”);
IEnumerable tcpSettings=settings.Elements(“协议”)。其中(o=>o.Attribute(“name”)。Value==“tcp”)
//对设置进行一些更改
保存(“settings.xml”);
编辑:


我想要一个专用的存储位置,它不能与其他MS特定的应用程序设置和配置混在一起。对于存储首选项来说,实体框架无疑是一个过火的工具。我只想使用一个
.json
文件,通过or读写,但那就是我。XML也一样好。为什么不使用System.Configuration命名空间中的类型?@DanAbramov,您将在哪里存储此类文件?此外,我还了解到,不能将所有集合轻松序列化为XML或Json。这就是为什么我保留了一个字典或哈希表,例如通过将其序列化为二进制。@AndrewKennan,因为我觉得它不是一个干净的解决方案,我不想将我的配置与MS特定的配置混淆。此外,我希望数据仍然可以从外部或通过其他应用程序访问。翻阅那些App.config文件感觉很尴尬。如果我做了错误的假设,请纠正我,但是我如何在app.config中存储字符串列表或字典?@Freddy,您可以扩展ConfigurationSection和ConfigurationElement类型来自定义配置文件的结构,您不需要将所有内容都放入AppSettings中。但是,因为您希望多个应用程序能够访问配置,所以数据库或某种类型的服务应用程序听起来更合适。到目前为止,听起来最合适,但我无法将.Net
字典
转换为XML是否准确?我可以序列化为二进制,但不确定它是否适用于XML?我还可以在同一个XML文件中存储许多完全不同类型的不相关对象吗?是的,您可以在一个XML文件中存储各种类型的对象。您可以使用LINQ手动读取和写入对象,也可以使用DataContractSerializer,它是fleixible xml序列化程序,尽管生成的xml可能不如人类可读/整洁。我以前用它来序列化字典,所以你只要试试就行了。我将编辑带有链接的答案。