Erstellung eines sehr einfachen Provider

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von exc-jdbi.

    Erstellung eines sehr einfachen Provider

    Hallo Community

    Hab mir einen sehr einfachen Provider gemacht. Der funkst auch.

    Das einzige was mich aber stört ist folgende Zeile in der Main.

    VB.NET-Quellcode

    1. Dim provider = DirectCast(top.Provider, IProvider1)

    Ich muss also die Variable raus nehmen, und kurz konvertieren, damit ich dann Zugriff auf die Methoden 'Start' habe.

    Hat jemand einen Tipp wie man das machen könnte, ohne das die Variable rausgenommen werden muss, aber der Zugriff auf die Methoden Start trotzdem vorhanden sind? Oder soll ich da wirklich auf eines der Pattern zurückgreifen?

    Danke für die Antwort.

    Freundliche Grüsse

    exc-jdbi


    Spoiler anzeigen

    VB.NET-Quellcode

    1. Option Strict On
    2. Option Explicit On
    3. Public Module Module2
    4. Public Sub Main()
    5. Dim top = New TopProvider(1)
    6. 'top.Provider ' <<< Keinen Zugriff auf die Methoden 'Start'
    7. Dim provider = DirectCast(top.Provider, IProvider1)
    8. Console.WriteLine(provider.Start())
    9. Stop
    10. End Sub
    11. End Module
    12. Public Class TopProvider
    13. Public Provider As IProvider
    14. Sub New(_provider As Int32)
    15. Me.NewInit(_provider)
    16. End Sub
    17. Public Sub NewInit(_provider As Int32)
    18. If _provider = 1 Then Me.Provider = New Provider1 : Return
    19. If _provider = 2 Then Me.Provider = New Provider2 : Return
    20. Throw New TypeInitializationException(GetType(Provider1).FullName,
    21. New Exception(NameOf(_provider)))
    22. End Sub
    23. End Class
    24. Public Interface IProvider
    25. End Interface
    26. Public Interface IProvider1
    27. Inherits IProvider
    28. Function Start() As String
    29. End Interface
    30. Public Interface IProvider2
    31. Inherits IProvider
    32. Function Start() As String
    33. End Interface
    34. Friend Class Provider1
    35. Implements IProvider1
    36. Private Function IProvider1_Start() As String Implements IProvider1.Start
    37. Return NameOf(Provider1)
    38. End Function
    39. End Class
    40. Friend Class Provider2
    41. Implements IProvider2
    42. Public Function IProvider2_Start() As String Implements IProvider2.Start
    43. Return NameOf(Provider2)
    44. End Function
    45. End Class
    @exc-jdbi Klar. Die Prozedur Start() ist nur in den abgeleiteten Interfaces vorhanden. Du kannst nur dann per IProvider darauf zugreifen, wenn sie in IProvider deklariert wurde:

    VB.NET-Quellcode

    1. Public Interface IProvider
    2. Function Start() As String
    3. End Interface
    und feddich.
    Welchen Zweck hat denn die Implementierung der Interfaces IProvider1 und IProvider2?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Danke @RodFromGermany

    Ich hab mir schon eine etwas angepasste Lösung jetzt gemacht. Das reicht für den kleinen Zweck für das ich es brauche.
    Wollte keinen grossen Umfang machen, und trotzdem die Flexibilität haben zum späteren Zeitpunkt weitere solcher "Providers" hinzufügen, ohne das ich den Code gross umstellen muss.

    Ach so das habe ich vergessen zu erwähnen, nur die Interfaces sind Public. Die Klassen sind Friend bzw. internal und das Ganze befindet sich in einer Dll ausser natürlich die Main.


    Spoiler anzeigen

    VB.NET-Quellcode

    1. Option Strict On
    2. Option Explicit On
    3. Public Module Module3
    4. Public Sub Main()
    5. Dim tp = New GlobalProvider(Of IProvider11)
    6. Dim provider = tp.ToProvider
    7. provider.Start()
    8. Stop
    9. End Sub
    10. End Module
    11. Public Class GlobalProvider(Of T As Class)
    12. Private Provider As IProvider(Of T)
    13. Sub New()
    14. If GetType(T) Is GetType(IProvider11) Then Me.Provider = DirectCast(New Provider11, IProvider(Of T))
    15. If GetType(T) Is GetType(IProvider22) Then Me.Provider = DirectCast(New Provider22, IProvider(Of T))
    16. If Me.Provider Is Nothing Then
    17. Throw New TypeAccessException
    18. End If
    19. End Sub
    20. Public Function ToProvider() As T
    21. Return DirectCast(Me.Provider, T)
    22. End Function
    23. End Class
    24. Public Interface IProvider(Of T)
    25. End Interface
    26. Interface IProvider11
    27. Inherits IProvider(Of IProvider11)
    28. Function Start() As String
    29. End Interface
    30. Interface IProvider22
    31. Inherits IProvider(Of IProvider22)
    32. Function Start() As String
    33. End Interface
    34. Friend Class Provider11
    35. Implements IProvider11
    36. Public Function Start() As String Implements IProvider11.Start
    37. Return NameOf(IProvider11)
    38. End Function
    39. End Class
    40. Friend Class Provider22
    41. Implements IProvider22
    42. Public Function Start() As String Implements IProvider22.Start
    43. Return NameOf(IProvider22)
    44. End Function
    45. End Class

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „exc-jdbi“ ()