Добавить методы в интерфейс Castle DictionaryAdapterFactory

На этом сайте я следую учебному пособию, в котором говорится об использовании Castle DictionaryAdapterFactory и интерфейса для доступа к ключам приложения app.setting без использования строк в коде.

Как это работает, вы определяете Интерфейс, который имеет имена ключей для вашего app.settings

   public interface ISettings
   {
    string dog { get; }
    string cat { get; }
   }

Затем используйте DictionaryAdapterFactory для кодирования интерфейса и словаря app.settings.

var factory = new DictionaryAdapterFactory();                    
var settings = factory.GetAdapter<ISettings>(ConfigurationManager.AppSettings);

Теперь вы можете получить доступ к таким значениям:

settings.dog
settings.cat

Мой вопрос: возможно ли иметь что-то более сложное, чем простой добытчик? Например, я могу сказать DictionaryAdapterFactory использовать метод дешифрования для значения одного из ключей, а затем вернуть его вместо значения ключа?

Я предполагаю, что это невозможно, так как вы не можете определить методы в интерфейсе, но хотел посмотреть, есть ли другой способ, который я пропустил.

1 ответ

Вы можете использовать класс-оболочку, чтобы обернуть ваш интерфейс классом, который реализует пользовательские методы.

Вы добавляете [AppSettingWrapper] через интерфейс:

[AppSettingWrapper]
public interface ISettings
{
string dog { get; }
string cat { get; }
}

Класс AppSettingWrapper определен в классе ниже и позволяет вам делать то, что вы хотите в геттере и настройке.

public class AppSettingWrapperAttribute : DictionaryBehaviorAttribute, IDictionaryKeyBuilder, IPropertyDescriptorInitializer, IDictionaryPropertyGetter
{
    public string GetKey(IDictionaryAdapter dictionaryAdapter, string key, PropertyDescriptor property)
    {
        return key;
    }

    public object GetPropertyValue(IDictionaryAdapter dictionaryAdapter, string key, object storedValue, PropertyDescriptor property, bool ifExists)
    {
        return storedValue;
    }

    public void Initialize(PropertyDescriptor propertyDescriptor, object[] behaviors)
    {
        propertyDescriptor.Fetch = true;
    }

}

Большая часть этого решения взята с https://gist.github.com/kkozmic/7858f4e666df223e7fc4.

Другие вопросы по тегам