вторник, 2 декабря 2008 г.

LINQ to XML правда здорово?

В последнее время я работаю над корпоративным приложением, которое состоит из серверной части и из нескольких клиентских. Для логгирования работы этих приложений используюется замечательный инструмент log4net. Его использование обусловлено не тем, что у нас продвинутые пользователи и они будут смотреть, как наше приложение работает, а исключительно удобством решения проблем непосредственно у клиента. Идея предложить пользователю открыть far и ручками поменять logLevel, как-то не вдохновляет, поэтому возникла идея настройки уровней логгирования программным способом. Для этой цели как нельзя лучше подошли новые инструменты в виде LINQ to XML.

// Вызов ToList обусловлен устранением отложенности

// операции Select

var configFiles = (from fn in

                   Directory.GetFiles(Application.StartupPath, "*.log4net").ToList()

                   select new {Filename = fn, Xml = XDocument.Load(fn)}).ToList();

// Здесь я получаю набо объектов анонимного класса, которые

// содержат имя конифгурационного файла, имя логгера, уровень

// логгирования, а также атрибут, который нужен для обновления

// уровня логгирования

var loggers = from cf in configFiles

              from lvl in cf.Xml.Descendants("level")

              let fi = new FileInfo(cf.Filename)

              select new { Filename = fi.Name,

                  Logger = (string)lvl.Parent.Attribute("name"),

                  Level = (string)lvl.Attribute("value"),             

                  Attribute = lvl.Attribute("value")};

//Обновление также не составляет труда!

foreach (var l in loggers)

{    

    l.Attribute.SetValue("INFO");

}

//Теперь нужно сохранить все конфиги обратно

foreach (var cfg in configFiles)

{    

    cfg.Xml.Save(cfg.Filename);

}

Кратко, понятно и вообще этот код прекрасно демонстрирует преимущества декларативного стиля программирования над императивным!

4 комментария:

  1. И ради этого стоило городить LINQ? Из пушки по воробьям :)

    ОтветитьУдалить
  2. Я же не городил LINQ, я его использовал. И привел хороший пример, когда это оправдано, т.к. это самый простой способ решить поставленную задачу.
    Если рассмотреть альтернативы (классический DOM XML API) получится гораздо больше кода, и будет гораздо менее понятно, что код делает:)

    ОтветитьУдалить
  3. Какой смысл два раза вызывать .ToList() и "устранять отложенность"?

    ОтветитьУдалить