我正在关注this网站上的教程,其中讨论了如何使用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对其中一个键的值使用解密方法然后返回该值而不是键值吗?
我假设这是不可能的,因为你不能在界面中定义方法,但是想看看是否还有另外一种我缺失的方法。
答案 0 :(得分:0)
您可以使用包装器类将接口包装为实现自定义方法的类。
您在界面上添加[AppSettingWrapper]:
[AppSettingWrapper]
public interface ISettings
{
string dog { get; }
string cat { get; }
}
AppSettingWrapper类在下面的类中定义,让您在getter和设置中执行所需的操作。
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。