C# 存储配置信息的位置

C# 存储配置信息的位置,c#,.net,configuration,C#,.net,Configuration,我有一个控制台应用程序,正在从C重建到C。此应用程序必须能够支持传统方法,即存储来自命令行的参数和来自自定义每次运行的文件(称为系统参数)的参数等信息。系统参数文件为纯文本,具有简单的键值结构 我的问题是: 我应该将这些不同的参数组合到一个配置对象中吗 如何从代码中调用此配置对象来存储参数 如何从代码中调用此配置对象以检索参数? 这个对象应该是强类型的吗 我需要从代码中的许多不同位置访问此结构。在不到处传递对象本身的情况下检索对象中的值的最优雅的方法是什么 我有一种感觉,它应该是一个单一

我有一个控制台应用程序,正在从C重建到C。此应用程序必须能够支持传统方法,即存储来自命令行的参数和来自自定义每次运行的文件(称为系统参数)的参数等信息。系统参数文件为纯文本,具有简单的键值结构

我的问题是:
  • 我应该将这些不同的参数组合到一个配置对象中吗
  • 如何从代码中调用此配置对象来存储参数
  • 如何从代码中调用此配置对象以检索参数?
    • 这个对象应该是强类型的吗
  • 我需要从代码中的许多不同位置访问此结构。在不到处传递对象本身的情况下检索对象中的值的最优雅的方法是什么
我有一种感觉,它应该是一个单一的强类型对象,应该是一个使用静态检索方法从存储库中检索的实例化对象,但是我确实希望验证这个方法。

我喜欢使用。可以通过使用“添加新文件”对话框创建设置文件或通过从项目属性添加默认设置文件来自动生成这些设置

每个设置可能在用户或应用程序范围内,用于控制用户是否可以更改它们或将它们限制为默认值。它们可以通过
Save()
方法轻松保存,并自动加载到静态
Default
属性中


此类似乎用于应用程序或基于用户的设置。我正在寻找每次跑步的设置。在这种情况下,您仍然建议使用此类吗?-x97mdr

对。如果同时具有基于用户/应用程序的设置和每次运行设置,则应使用两个不同的类-正常(保存)设置和每次运行设置


只要不保存每次运行的设置,就应该是安全的,并且设置仍然很容易使用。但这些都是静态设置。如果同一个应用程序运行需要几个实例-这是错误的方法。

XmlDocument-您可以使用生成类定义。我发现,每当我必须处理遗留系统时,坚持旧格式几乎总是最有效的。通常情况下,其他人会将遗留格式用于其他任务(例如,应用程序的自动化),因此如果重新编码应用程序处理输入的方式,可能会破坏其他系统

另一方面,如果您非常自信您知道所有使用该系统的人,并且他们告诉您他们不在乎您是否更改了这些类型的内容,那么我可能会将所有内容都转换为XML。从应用程序的角度来看,除了XML的所有优秀特性(如ASCII格式,便于人工修改、自文档化等),XML还可以节省时间,因为您不必编写自己的I/O或解析器。已经有各种各样的库,特别是在.NET3.0/3.5中,它们做得非常好。(当你要搬到C#时,我猜你已经在思考这些问题了:)

因此,最终,您必须根据实现成本做出决定:如果您通过使用XML或类似技术来降低实现成本,请确保您不会因为使用新的应用程序框架而增加其他人的实现成本


祝你好运

我将使用一个配置对象,如下所示:

using System;
using System.IO;
using System.Reflection;
public sealed class Setting {
  public static int FrameMax { get; set; }
  public static string VideoDir { get; set; }
  static readonly string SETTINGS = "Settings.ini";
  static readonly Setting instance = new Setting();
  Setting() {}
  static Setting() {
    string property = "";
    string[] settings = File.ReadAllLines(SETTINGS);
    foreach (string s in settings)
      try {
        string[] split = s.Split(new char[] { ':' }, 2);
        if (split.Length != 2)
          continue;
        property = split[0].Trim();
        string value = split[1].Trim();
        PropertyInfo propInfo = instance.GetType().GetProperty(property);
        switch (propInfo.PropertyType.Name) {
          case "Int32":
            propInfo.SetValue(null, Convert.ToInt32(value), null);
            break;
          case "String":
            propInfo.SetValue(null, value, null);
            break;
        }
      } catch {
        throw new Exception("Invalid setting '" + property + "'");
      }
  }
}
由于这是一个实例,因此在第一次从
设置
对象引用
公共静态
属性时,它将仅创建一个自身实例

创建对象时,它会从
Settings.ini
文件中读取。设置文件是一个纯文本文件,具有简单的
key:value
结构,可能如下所示:

FrameMax : 12
VideoDir : C:\Videos\Best
对象使用反射来发现每个属性并存储其初始值。在本例中,定义了两个特性:

    public static int FrameMax { get; set; }
    public static string VideoDir { get; set; }
编写的代码处理
Int32
String
类型。通过向
switch
语句添加额外的
case
语句,您可以轻松地添加对
Float
Decimal
等类型的支持

要更改设置,请使用以下命令:

Setting.FrameMax = 5;
if (Setting.FrameMax > 10) ...
要检索设置,您可以使用以下内容:

Setting.FrameMax = 5;
if (Setting.FrameMax > 10) ...
您会注意到所有属性都是强类型的。此外,您不必传递
设置
对象,因为所有
设置
属性都是
静态的
,并且在任何地方都可用


我希望这个想法有帮助。

这个课程似乎是针对应用程序或基于用户的设置。我正在寻找每次跑步的设置。在这种情况下,您仍然建议使用这个类吗?我现在必须能够支持遗留格式。不过,我想在将来转向XML。您如何看待上面描述的设置类?但是如何处理版本控制?最简单的方法是添加新的配置设置。这似乎不会将设置更改保留到文件中。。。例如,Setting.MyValue=19不会将其保存到Settings.ini文件中。版本控制(最简单的情况是添加新的配置项)如何?如果使用由较旧版本的应用程序创建的配置文件,它会崩溃吗?但是如何处理版本控制?最简单的方法是添加新的配置设置。