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

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

Мои вопросы:

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

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

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

7
задан Jeffrey Cameron 13 September 2019 в 09:52
поделиться

4 ответа

Мне нравится использовать Settings. Они могут быть сгенерированы автоматически или путем создания файла настроек с помощью диалогового окна Add New File, или путем добавления файла настроек по умолчанию от свойств проекта.

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

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

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

Пока Вы не сохраняете науправляемый настройки, необходимо быть в безопасности, и настройки все еще довольно просты в использовании. Это статические настройки все же. Если тому же выполнению приложения нужны несколько экземпляров - это - неправильный подход.

7
ответ дан 6 December 2019 в 12:55
поделиться

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

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

Так как это - одиночный элемент, он создаст один и только один экземпляр себя в первый раз a public static на свойство ссылаются от Setting объект.

Когда объект создается, он читает из Settings.ini файл. Файл настроек является файлом простого текста с простым 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 и всегда доступный везде.

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

8
ответ дан 6 December 2019 в 12:55
поделиться

XmlDocument - можно генерировать определение класса с помощью XSD.exe

0
ответ дан 6 December 2019 в 12:55
поделиться

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

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

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

Удачи!

1
ответ дан 6 December 2019 в 12:55
поделиться