2016-03-22 5 views
0

ich auf this Website nach dem Tutorial bin, die über die Verwendung der Castle DictionaryAdapterFactory und eine Schnittstelle spricht mit einem Anwendungs ​​Zugriff app.setting Tasten ohne Saiten in Ihrem Code zu verwenden.hinzufügen Methoden zur Burg DictionaryAdapterFactory Schnittstelle

Die Funktionsweise ist es, Ihnen eine Schnittstelle definieren, die die Schlüsselnamen für Ihre AnwendgsOptionen hat

public interface ISettings 
    { 
    string dog { get; } 
    string cat { get; } 
    } 

dann die DictionaryAdapterFactory verwenden, um die Codierung zwischen der Schnittstelle und Ihr AnwendgsOptionen Wörterbuch zu tun.

var factory = new DictionaryAdapterFactory();      
var settings = factory.GetAdapter<ISettings>(ConfigurationManager.AppSettings); 

Jetzt können Sie die Werte wie folgt zugreifen:

settings.dog 
settings.cat 

Meine Frage ist, ist es möglich, etwas mehr als ein kompliziert zu haben, als eine einfache Getter. Kann ich beispielsweise DictionaryAdapterFactory anweisen, eine Entschlüsselungsmethode für den Wert eines Schlüssels zu verwenden und dann anstelle des Schlüsselwerts zurückzugeben?

Ich gehe davon aus, dass dies nicht möglich ist, da Sie Methoden in einer Schnittstelle nicht definieren können, aber sehen wollten, ob es eine andere Möglichkeit gab, die mir fehlte.

Antwort

0

Sie können eine Wrapper-Klasse verwenden, um Ihre Schnittstelle mit einer Klasse zu umhüllen, die benutzerdefinierte Methoden implementiert.

Sie fügen [AppSettingWrapper] über Ihre Schnittstelle:

[AppSettingWrapper] 
public interface ISettings 
{ 
string dog { get; } 
string cat { get; } 
} 

Die AppSettingWrapper Klasse in der Klasse definiert ist unten und können Sie tun, was Sie in dem Getter und Einstellung mögen.

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; 
    } 

}

Die meisten dieser Lösung kommt von https://gist.github.com/kkozmic/7858f4e666df223e7fc4.

Verwandte Themen