2017-02-02 4 views
1

Ich verwende Konfigurationsbindung in einer ASP.NET Core 1.1-Lösung. Grundsätzlich hat ich einigen einfachen Code für die Bindung in meinem ConfigureServices Startup Abschnitt, der wie folgt aussieht:Benutzerdefinierte Konfigurationsmappe für Eigenschaft

services.AddSingleton(Configuration.GetSection("SettingsSection").Get<SettingsClass>()); 

Die Falte ist, dass meine Klasse als int-Eigenschaft, die normalerweise in einen int-Wert in der Konfigurationsdatei gebunden ist, könnte aber stattdessen an die Zeichenfolge "disabled" gebunden werden. Unter der Haube möchte ich, dass die Eigenschaft den Wert -1 erhält, wenn sie an die Zeichenfolge "disabled" gebunden ist.

Es kann komplizierter sein als dies, aber ich vereinfache der Kürze halber.

Meine Frage ist dies: Wie stelle ich einen benutzerdefinierten Binder/Konverter für die Konfiguration Bindung für eine bestimmte Eigenschaft in SettingsClass überschreibt, so dass bei einer Zeichenfolge Konvertierung "deaktiviert" in -1 konvertiert, anstatt zu werfen eine Ausnahme, die "deaktiviert" nicht zu einem Int32 konvertiert werden kann?

Antwort

1

Es scheint, dass, da der ConfigurationBinder den TypDescriptor des Typs verwendet, um den Konverter zu erhalten, die einzige Möglichkeit für das, was ich versuche, ist, einen benutzerdefinierten Typkonverter zu implementieren und in den TypeDescriptor für die Klasse I einzufügen bin zu (in diesem Fall Int32) konvertiert. diese

Also, im Grunde, fügen Sie vor der Konfiguration geschieht:

TypeDescriptor.AddAttributes(typeof(int), new TypeConverterAttribute(typeof(MyCustomIntConverter))); 

Wo MyCustomIntConverter etwa wie folgt aussieht:

public class MyCustomIntConverter : Int32Converter 
{ 
    public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) 
    { 
     if (value != null && value is string) 
     { 
      string stringValue = value as string; 
      if(stringValue == "disabled") 
      { 
       return -1; 
      } 
     } 
     return base.ConvertFrom(context, culture, value); 
    } 
} 

scheint übertrieben, wie jetzt "gesperrt" wird immer convery auf -1 für Int32 überall in der Anwendung. Wenn jemand einen weniger invasiven Weg kennt, lass es mich wissen.

Verwandte Themen