Одним из недостатков web.config / app.config является то, что это везде просто Magic Strings, так как это всего лишь файл XML.
Интерпретируемые языки, такие как PHP или Ruby, имеют то преимущество, что конфигурация - это просто исполняемый код. В .net выполнение чего-либо в коде требует перераспределения, что противоречит цели.
Теперь, прежде чем я создам свою собственную замену web.config на основе Boo или PowerShell, я хотел узнать, существует ли уже существующий?
В качестве примера, это здесь тривиально в коде, но очень сложно / неудобно в web.config:
IList<TimeZoneInfo> allowedTimeZones =
System.TimeZoneInfo.GetSystemTimeZones()
.Where(tz => tz.DisplayName.Contains("Central"));
По сути, каждый раз, когда вам нужно выполнить сложные действия для создания объекта, конфигурации на основе XML / String становятся очень грязными.
Например, если на самом деле допускается, что allowTimeZones должны начинаться с «Central», но не содержать «Europe», то вы начинаете строить свой собственный DSL по существу поверх XML (Правила <add action="startswith" value="Central"/> <add action="doesnotcontain" value="Europe/>
). В коде мне нужно пройти через все эти циклы и либо иметь большой оператор switch, который переводит каждую строку в код, либо я мог бы использовать имена методов LINQ в качестве имен и использовать Reflection для их вызова.
Если в конфигурационном файле находится исполняемый код, я бы просто изменил его на
IList<TimeZoneInfo> allowedTimeZones =
System.TimeZoneInfo.GetSystemTimeZones()
.Where(tz => tz.DisplayName.StartsWith("Central") &&
!tz.DisplayName.Contains("Europe"));
Конечно, поскольку C # не является языком сценариев, этот пример будет представлен на языке, подобном Boo или PowerShell, который может быть просто выполнен приложением.