将方法添加到Castle DictionaryAdapterFactory接口

时间:2016-03-22 15:35:15

标签: c# castle castle-dictionaryadapter

我正在关注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对其中一个键的值使用解密方法然后返回该值而不是键值吗?

我假设这是不可能的,因为你不能在界面中定义方法,但是想看看是否还有另外一种我缺失的方法。

1 个答案:

答案 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