Добавить методы в интерфейс 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.