2014-02-24 82 views
1

添加行爲,我使用的字典適配器作爲這個博客帖子描述:應用程序設置 - 在運行時

http://kozmic.net/2013/11/21/on-strongly-typed-application-settings-with-castle-dictionaryadapter/

用於獲取應用程序設置的依賴關係。定義

我有2個屬性:

AppSettingsFromConfigAttribute - for holding a keyprefix 

AppSettingsBehavior : KeyPrefixAttribute, IDictionaryPropertyGetter, IPropertyDescriptorInitializer 

這是AppSettingsAttribute的翻版屬性類在博客文章。

這是註冊:

Configure(component => component.UsingFactoryMethod(
       () => 
       { 
        var attrib = (AppSettingsFromConfigAttribute)Attribute.GetCustomAttribute(component.Implementation, typeof(AppSettingsFromConfigAttribute)); 

        var prop = new PropertyDescriptor(); 

        prop.AddBehavior(new AppSettingsBehavior(attrib.KeyPrefix)); 

        return configFactory.GetAdapter(component.Implementation, new NameValueCollectionAdapter(ConfigurationManager.AppSettings), prop); 
       }))); 

所以我用我的自定義屬性,以避免依賴於整個Castle.Core我的代碼庫,而是試圖在運行時通過註冊加入相同的行爲。這是工作,keyprefix部分 - 但不是抓取部分。這隻會在第一次使用時失效,而不是在施工中。

如果我在界面上靜態使用AppSettingsBehavior,它可以正常工作,讀取並在構建時失敗。那麼我在向字典適配器添加行爲時會出錯?

回答

0

經過幾個小時的觀察來源,抓我的頭和一杯咖啡。找到一個解決方案:)

基本上在addbehavior調用我得到添加字典行爲,而我需要的是一個接口/屬性行爲來觸發(預)獲取。在源代碼中,儘管方法簽名可能會說什麼,但這些人正在檢查所提供類型的屬性,但僅從prop描述符對象中提取字典初始值設定項,而不是接口/屬性。因此,即使我添加的行爲具有界面行爲 - 它從來沒有被讀取過,只有字典行爲。

所以,我使用不同的電話。而不是調用factory.GetAdapter - 我反而得到了factory.GetAdapterMeta() - 它給了我一個帶有一個很好的屬性getter的元對象 - 它具有實際接口屬性的集合。

因此,代碼變爲:

Configure(component => component.UsingFactoryMethod(
       () => 
       { 
        var attrib = (AppSettingsFromConfigAttribute)Attribute.GetCustomAttribute(component.Implementation, typeof(AppSettingsFromConfigAttribute)); 

        var prop = new PropertyDescriptor(); 

        prop.AddBehavior(new AppSettingsBehavior(attrib.KeyPrefix)); 

        var meta = configFactory.GetAdapterMeta(component.Implementation); 

        foreach (var entry in meta.Properties) 
        { 
         entry.Value.Fetch = true; 
        } 

        return meta.CreateInstance(new NameValueCollectionAdapter(ConfigurationManager.AppSettings), prop); 
       }))); 
相關問題