Где хранить информацию о конфигурации

У меня есть консольное приложение, которое я перестраиваю с C на C#. Это приложение должно поддерживать устаревший метод хранения информации, такой как параметры из командной строки и параметры из файла (называемые системными параметрами), которые настраивают каждый запуск. Файл параметров системы находится в текстовом формате с простым ключом: структура значений.

мои вопросы:

  • должен ли я объединить эти различные параметры в одну конфигурацию объект?
  • как бы я назвал этот объект конфигурации из кода для хранения параметров?
  • как я могу вызвать этот объект конфигурации из кода для получения параметров?
    • должен ли этот объект быть строго типизированным?
  • мне понадобится доступ к этой структуре из множества разных мест в коде, каков самый элегантный способ получить значения в объекте без передачи самого объекта везде?

У меня такое чувство, что это должен быть один, строго типизированный объект и что это должен быть экземпляр объекта, который извлекается из репозитория со статическим методом извлечения, однако я действительно хочу проверить этот метод.

спасибо заранее

4 ответов


мне нравится использовать Settings. Они могут быть созданы автоматически либо путем создания файла параметров с помощью диалогового окна Добавить новый файл, либо путем добавления файла параметров по умолчанию из свойств проекта. Каждый параметр может находиться в области пользователя или приложения, которая определяет, может ли пользователь изменять их или они ограничены значениями по умолчанию. Они легко сохраняются с помощью Save() метод и автоматически загружается в static Default собственность.

этот класс, похоже, предназначен для приложений или пользовательских настроек. Я ищу настройки для каждого запуска. Вы все еще рекомендуете использовать этот класс в этом случае? - x97mdr

Да. Если у вас есть настройки пользователя/приложения и параметры для каждого запуска, вы должны использовать два разных класса-обычные (сохраненные) настройки и параметры для каждого запуска. Пока вы не сохраняете настройки для каждого запуска, вы должны быть в безопасности, а настройки по-прежнему довольно просты в использовании. Эти статические однако настройки. Если для одного и того же запуска приложения требуется несколько экземпляров - это неправильный подход.


я бы использовал один объект конфигурации следующим образом:

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 + "'");
      }
  }
}

так как это синглтон, он создаст один и только один экземпляр самого себя в первый раз public static свойство ссылается из . Файл настроек представляет собой текстовый файл с простым key : value структура, которая может выглядеть так:

FrameMax : 12
VideoDir : C:\Videos\Best

объект использует отражение, чтобы обнаружить каждое свойство и сохранить его начальное значение. В этом примере определены два свойства:

    public static int FrameMax { get; set; }
    public static string VideoDir { get; set; }

код как написано ручки Int32 и String типы. Путем добавления дополнительных case заявления switch заявление, вы можете легко добавить поддержку для типов вроде Float и Decimal.

чтобы изменить настройку, вы должны использовать что-то вроде:

Setting.FrameMax = 5;

чтобы получить настройку, вы бы использовали что-то например:

if (Setting.FrameMax > 10) ...

вы заметите, что все свойства строго типизированы. Кроме того, вам не нужно проходить Setting объект вокруг, как все Setting свойства static и всегда доступны везде.

я надеюсь, что эта идея полезна.


Я считаю, что всякий раз, когда мне приходится иметь дело с устаревшей системой, придерживаться старого формата почти всегда работает лучше всего. Часто есть другие люди, использующие устаревшие форматы для других задач (например, автоматизация приложения), поэтому, если вы перекодируете способ обработки входных данных приложением, вы можете сломать другие системы.

с другой стороны, если вы уверены, что знаете всех людей, использующих систему, и они говорят вам, что им все равно, если вы измените эти типы вещей, я бы, вероятно, переместил все в XML. Помимо всех приятных особенностей XML с точки зрения приложения (например, в ASCII, поэтому он легко модифицируется людьми ,будучи самодокументированным и т. д...), XML также экономит время, поскольку вам не нужно писать свой собственный ввод-вывод или парсер. Там уже есть большое разнообразие библиотек, особенно в .NET 3.0 / 3.5, которые делают очень хорошо. (Когда вы переходите на C#, я предполагаю, что вы уже думаете об этом :)

поэтому в конечном итоге вам придется основывать свое решение на стоимости реализации: если вы снизите код стоимость реализации, перейдя в XML или аналогичный, убедитесь, что вы не поднимаете чужие стоимость реализации для перехода на новую структуру приложений.

удачи!


XmlDocument - вы можете создать определение класса, используя xsd можно.exe