В последнее время я работаю над корпоративным приложением, которое состоит из серверной части и из нескольких клиентских. Для логгирования работы этих приложений используюется замечательный инструмент 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);
}
Кратко, понятно и вообще этот код прекрасно демонстрирует преимущества декларативного стиля программирования над императивным!
И ради этого стоило городить LINQ? Из пушки по воробьям :)
ОтветитьУдалитьЯ же не городил LINQ, я его использовал. И привел хороший пример, когда это оправдано, т.к. это самый простой способ решить поставленную задачу.
ОтветитьУдалитьЕсли рассмотреть альтернативы (классический DOM XML API) получится гораздо больше кода, и будет гораздо менее понятно, что код делает:)
Какой смысл два раза вызывать .ToList() и "устранять отложенность"?
ОтветитьУдалитьА хз, давно это было:)
ОтветитьУдалить