0

我正在关注网站上的教程,该教程讨论了使用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 对其中一个键的值使用解密方法,然后返回它而不是键值吗?

我假设这是不可能的,因为您无法在接口中定义方法,但想看看是否还有另一种我遗漏的方法。

4

1 回答 1

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

于 2016-03-22T16:21:56.807 回答