Свободная форма Динамический web.config регион - PullRequest
7 голосов
/ 01 июня 2011

С выпуском .NET4 кто-нибудь когда-либо создавал динамический элемент web.config, который позволит вам вводить в конфигурацию все, что вы хотите, а затем вы можете получить доступ ко всему этому из объекта dynamic?

Объем работ по созданию пользовательских разделов конфигурации просто непомерен, казалось бы, без причины.Это заставило меня задуматься, не заменил ли кто-то песню и танец тем, что ему просто нужно создавать 5+ классов, чтобы каждый раз бросать новый раздел конфигурации.

(Обратите внимание, когда я говорю «свободная форма», я, очевидно,ожидать, что он будет соответствовать действительному элементу xml)

1 Ответ

3 голосов
/ 06 июня 2011

Если вы просто хотите получить доступ к разделу appSettings файла конфигурации, вы можете наследовать от класса DynamicObject и переопределить метод TryGetMember:

public class DynamicSettings : DynamicObject {
    public DynamicSettings(NameValueCollection settings) {
        items = settings;
    }

    private readonly NameValueCollection items;

    public override bool TryGetMember(GetMemberBinder binder, out object result) {
        result = items.Get(binder.Name);
        return result != null;
    }
}

Тогда, если предположить, что это ваш app.config файл:

<configuration>
  <appSettings>
    <add key="FavoriteNumber" value="3" />
  </appSettings>
</configuration>

... доступ к настройке 'FavoriteNumber' можно получить следующим образом:

class Program {
    static void Main(string[] args) {
        dynamic settings = new DynamicSettings(ConfigurationManager.AppSettings);
        Console.WriteLine("The value of 'FavoriteNumber' is: " + settings.FavoriteNumber);
    }
}

Обратите внимание, что попытка получить доступ к неопределенному ключу приводит к выдаче RuntimeBinderException. Вы можете предотвратить это, изменив переопределенный TryGetMember, чтобы он всегда возвращал true, и в этом случае неопределенные свойства просто вернут null.

...