синхронизация узлов XML между классом и файлом с использованием C # - PullRequest
0 голосов
/ 16 июня 2010

Я пытаюсь написать класс IXmlSerializable, который синхронизируется с файлом XML. Файл XML имеет следующий формат:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <logging>
    <logLevel>Error</logLevel>
  </logging>
  ...potentially other sections...
</configuration>

У меня есть класс DllConfig для всего XML-файла и класс LoggingSection для представления <logging> и его содержимого, т. Е. <logLevel>. DllConfig обладает этим свойством:

[XmlElement(ElementName = LOGGING_TAG_NAME,
    DataType = "LoggingSection")]
public LoggingSection Logging { get; protected set; }

То, что я хочу, - чтобы файл XML базы данных обновлялся (то есть переписывался), когда установлено свойство. У меня уже есть DllConfig, когда установлено Logging. Тем не менее, как я должен делать это, когда установлен Logging.LogLevel? Вот пример того, что я имею в виду:

var config = new DllConfig("path_to_backing_file.xml");
config.Logging.LogLevel = LogLevel.Information; // not using Logging setter, but a
                                                // setter on LoggingSection, so how
                                                // does path_to_backing_file.xml
                                                // have its contents updated?

Мое текущее решение - иметь класс SyncedLoggingSection, который наследуется от LoggingSection, а также принимает экземпляр DllConfig в конструкторе. Он объявляет new LogLevel, что, когда установлено, обновляет LogLevel в базовом классе, а также использует заданный DllConfig для записи всего DllConfig в файл XML поддержки. Это хорошая техника?

Я не думаю, что смогу просто сериализовать SyncedLoggingSection сам по себе в резервный XML-файл, потому что будет записано не все содержимое, а только узел <logging>. Затем я получу XML-файл, содержащий только раздел <logging> с его обновленным <logLevel>, вместо всего файла конфигурации с обновленным <logLevel>. Следовательно, мне нужно передать экземпляр DllConfig в SyncedLoggingSection.

Похоже, что мне нужен обработчик событий, один из DllConfig, который бы замечал, когда были заданы определенные свойства (т.е. LogLevel) в его свойствах (то есть Logging). Возможна ли такая вещь?

1 Ответ

0 голосов
/ 16 июня 2010

Поскольку вы сами реализуете IXmlSerializable, вы можете сделать DllConfig.Logging приватным.Затем добавьте открытый метод в DllConfig для установки LogLevel вместо прямой установки Logging.LogLevel.Это будет единственный способ изменить LogLevel.В реализации этого открытого метода вы можете сериализовать весь DllConfig для перезаписи xml.

...