Где хранить информацию о конфигурации - PullRequest
6 голосов
/ 23 февраля 2009

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

Мои вопросы:

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

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

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

Ответы [ 4 ]

7 голосов
/ 28 февраля 2009

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

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

Поскольку это singleton , при первом обращении к свойству 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 и всегда доступны везде.

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

7 голосов
/ 23 февраля 2009

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

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

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

1 голос
/ 23 февраля 2009

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

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

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

Удачи!

0 голосов
/ 23 февраля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...