2010-11-30 18 views
4

Können Sie dieses Generikum verbessern?Beste Möglichkeit in VB.Net Generics für My.Settings Persistance zu verwenden?

Ich versuche, Code Bloat zu reduzieren, Fehler zu reduzieren und Codebehind durch Generics zu vereinfachen. In diesem Fall verwende ich Generics zur Deklaration persistabler Eigenschaften. Persistance wird von My.Settings implementiert. Hier ist der Code soweit.

' must be defined in same project as My.Settings! 
Public Class MySettingsProperty(Of T) 
    Implements System.ComponentModel.INotifyPropertyChanged 
    Private m_Name As String 
    Sub New(ByVal Name As String) 
     m_Name = Name 
    End Sub 
    Sub New(ByVal Name As String, ByVal InitialValue As T) 
     m_Name = Name 
     Value = InitialValue 
    End Sub 
    Public Property Value As T 
     Get 
      Return CType(My.Settings(m_Name), T) 
     End Get 
     Set(ByVal value As T) 
      My.Settings(m_Name) = value 
      RaiseEvent PropertyChanged(Me, New  System.ComponentModel.PropertyChangedEventArgs("Value")) 
     End Set 
    End Property 
    Private Event PropertyChanged(ByVal sender As Object, ByVal e As System.ComponentModel.PropertyChangedEventArgs) Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged 
End Class 

Verbrauch:

Public Property Host As New MySettingsProperty(Of String)("Host") 
Host.Value = "127.0.0.1" 
Debug.WriteLine(Host.Value) 

Vorteile:

  1. Verwendet My.Settings für persistance
  2. Code Reduziert hinter aufblasen von Getter und Setter
  3. Reduziert Codierungsfehler
  4. Bindbar
  5. Implementiert INotifiyPropertChanged

Nachteile

  1. Need ".Value" zu Eigenschaften anzuhängen.
  2. Müssen My.Settings-Eigenschaftsname als Zeichenfolge-Konstante angeben.
  3. Die Klasse muss sich in demselben Projekt befinden wie die My.Settings-Deklarationen.
+0

Ich bin mir nicht sicher, ob die Profis die Nachteile überwiegen, die .value Anforderung wäre ein Aufwand, und all die Strings rumliegen ist auch nicht zu groß. Persönlich würde ich nur die ganze "MySettings" -Klasse vermeiden und eigene rollen. Ich habe nie gemocht, wie MS Konfiguration handhabt. – DarinH

+0

Sie könnten einfach ein Objekt definieren und den DataContract Serializer zum Serialisieren/Deserialisieren verwenden. – DarinH

Antwort

0

ich dies nur c#-vb portiert so hoffentlich ist es geeignet:

Module SettingsHelper 

    Public Function GetSetting(Of TSetting)(ByVal selector As Func(Of My.MySettings, TSetting)) As TSetting 
     Return selector(My.Settings) 
    End Function 

    Public Sub SetSetting(ByVal action As Action(Of My.MySettings)) 
     action(My.Settings) 
    End Sub 

End Module 

Und Nutzung:

Debug.WriteLine(SettingsHelper.GetSetting(Function(s) s.Setting1)) 

SettingsHelper.SetSetting(Sub(s) s.Setting1 = "new value") 

Hoffnung, das hilft.

+0

Dies ist ein interessanter Ansatz. Ich weiß nicht, wann ich zu diesem Problem zurückkehren und Ihren Code ausprobieren kann. Sieht so aus, als ob es viel zu ändern und zu bewerten gibt. Ich werde es als die Antwort markieren, bis ich verifizieren kann oder nicht. – BSalita

+0

@BSalita - Ich werde interessiert sein zu sehen, was Sie kommen! – aligray