Erweitern des My-Namespace in Visual Basic

Der My-Namespace in Visual Basic stellt Eigenschaften und Methoden bereit, mit denen Sie die Leistungsfähigkeit von .NET Framework problemlos nutzen können. Der My-Namespace vereinfacht häufig auftretende Programmierprobleme, wodurch oft eine schwierige Aufgabe auf eine einzelne Codezeile reduziert werden kann. Außerdem ist der My-Namespace vollständig erweiterbar, sodass Sie das Verhalten von My anpassen und neue Dienste zur Hierarchie hinzufügen können, damit er spezifischen Anwendungsanforderungen entspricht. In diesem Thema wird erläutert, wie vorhandene Member des My-Namespace angepasst und eigene benutzerdefinierte Klassen zum My-Namespace hinzugefügt werden können.

Anpassen vorhandener My-Namespacemember

Der My-Namespace in Visual Basic stellt häufig verwendete Informationen zu Ihrer Anwendung, Ihrem Computer und vielem mehr bereit. Eine komplette Liste der Objekte im My-Namespace finden Sie unter My-Referenz. Möglicherweise müssen Sie vorhandene Member des My-Namespace anpassen, damit diese den Anforderungen Ihrer Anwendung besser entsprechen. Jede Eigenschaft eines Objekts im My-Namespace, die nicht schreibgeschützt ist, kann auf einen benutzerdefinierten Wert festgelegt werden.

Angenommen, Sie verwenden häufig das Objekt My.User, um auf den aktuellen Sicherheitskontext für den Benutzer zuzugreifen, der Ihre Anwendung ausführt. Ihr Unternehmen verwendet jedoch ein benutzerdefiniertes Benutzerobjekt, um zusätzliche Informationen und Funktionen für Benutzer innerhalb des Unternehmens verfügbar zu machen. In diesem Szenario können Sie den Standardwert der Eigenschaft My.User.CurrentPrincipal durch eine Instanz Ihres eigenen benutzerdefinierten Prinzipalobjekts ersetzen, wie im folgenden Beispiel gezeigt:

My.User.CurrentPrincipal = CustomPrincipal

Wenn Sie die CurrentPrincipal-Eigenschaft für das My.User-Objekt festlegen, ändert sich die Identität, unter der die Anwendung ausgeführt wird. Das My.User-Objekt wiederum gibt Informationen zum neu angegebenen Benutzer zurück.

Hinzufügen von Membern zu My-Objekten

Die von My.Application und My.Computer zurückgegebenen Typen sind als Partial-Klassen definiert. Aus diesem Grund können Sie die Objekte My.Application und My.Computer erweitern, indem Sie eine Partial-Klasse mit dem Namen MyApplication bzw. MyComputer erstellen. Die Klasse kann keine Private-Klasse sein. Wenn Sie die Klasse als Teil des My-Namespace angeben, können Sie Eigenschaften und Methoden hinzufügen, die in die Objekte My.Application oder My.Computer aufgenommen werden.

Im folgenden Beispiel wird eine Eigenschaft mit dem Namen DnsServerIPAddresses zum My.Computer-Objekt hinzugefügt:

Imports System.Net.NetworkInformation

Namespace My

  Partial Class MyComputer
    Friend ReadOnly Property DnsServerIPAddresses() As IPAddressCollection
      Get
        Dim dnsAddressList As IPAddressCollection = Nothing

        For Each adapter In System.Net.NetworkInformation.
          NetworkInterface.GetAllNetworkInterfaces()

          Dim adapterProperties = adapter.GetIPProperties()
          Dim dnsServers As IPAddressCollection = adapterProperties.DnsAddresses
          If dnsAddressList Is Nothing Then
            dnsAddressList = dnsServers
          Else
            dnsAddressList.Union(dnsServers)
          End If
        Next adapter

        Return dnsAddressList
      End Get
    End Property
  End Class

End Namespace

Hinzufügen benutzerdefinierter Objekte zum My-Namespace

Obwohl der My-Namespace Lösungen für viele gängige Programmieraufgaben bereitstellt, können Sie auf Aufgaben stoßen, die der My-Namespace nicht abdeckt. Beispielsweise kann Ihre Anwendung auf benutzerdefinierte Verzeichnisdienste für Benutzerdaten zugreifen, oder die Anwendung verwendet Assemblys, die nicht standardmäßig mit Visual Basic installiert werden. Sie können den My-Namespace erweitern, um benutzerdefinierte Lösungen für häufige Aufgaben zu integrieren, die für Ihre Umgebung spezifisch sind. Der My-Namespace kann problemlos erweitert werden, um neue Member hinzuzufügen und so wachsende Anwendungsanforderungen zu erfüllen. Darüber hinaus können Sie Ihre My-Namespaceerweiterungen anderen Entwicklern als Visual Basic-Vorlage bereitstellen.

Hinzufügen von Membern zum My-Namespace

Da My ein Namespace wie jeder andere ist, können Sie ihm Eigenschaften der obersten Ebene hinzufügen. Dazu fügen Sie einfach ein Modul hinzu und geben einen Namespace vom Typ My an. Versehen Sie das Modul mit dem Attribut HideModuleName, wie es im folgenden Beispiel gezeigt ist. Durch das HideModuleName-Attribut wird sichergestellt, dass IntelliSense den Modulnamen nicht anzeigt, wenn die Member des My-Namespace angezeigt werden.

Namespace My
  <HideModuleName()> 
  Module MyCustomModule

  End Module
End Namespace

Um dem My-Namespace Member hinzuzufügen, fügen Sie dem Modul nach Bedarf Eigenschaften hinzu. Fügen Sie für jede Eigenschaft, die dem My-Namespace hinzugefügt wird, ein privates Feld vom Typ ThreadSafeObjectProvider(Of T) hinzu, wobei der Typ der von der benutzerdefinierten Eigenschaft zurückgegebene Typ ist. Mithilfe dieses Felds werden threadsichere Objektinstanzen erstellt, die durch Aufrufen der GetInstance-Methode von der Eigenschaft zurückgegeben werden. Folglich erhält jeder Thread, der auf die erweiterte Eigenschaft zugreift, eine eigene Instanz des zurückgegebenen Typs. Im folgenden Beispiel wird eine Eigenschaft mit dem Namen SampleExtension vom Typ SampleExtension zum My-Namespace hinzugefügt:

Namespace My
  <HideModuleName()> 
  Module MyCustomExtensions
    Private _extension As New ThreadSafeObjectProvider(Of SampleExtension)
    Friend ReadOnly Property SampleExtension() As SampleExtension
      Get
        Return _extension.GetInstance()
      End Get
    End Property
  End Module
End Namespace

Hinzufügen von Ereignissen zu benutzerdefinierten My-Objekten

Mithilfe des My.Application-Objekts können Sie Ereignisse für Ihre benutzerdefinierten My-Objekte bereitstellen, indem Sie die partielle Klasse MyApplication im My-Namespace erweitern. Bei Windows-basierten Projekten können Sie im Projektmappen-Explorer auf den Knoten Mein Projekt für Ihr Projekt doppelklicken. Klicken Sie im Projekt-Designer von Visual Basic auf die Registerkarte Anwendung und dann auf die Schaltfläche Anwendungsereignisse anzeigen. Eine neue Datei mit dem Namen ApplicationEvents.vb wird erstellt. Sie enthält den folgenden Code zum Erweitern der MyApplication-Klasse:

Namespace My
  Partial Friend Class MyApplication
  End Class
End Namespace

Sie können Ereignishandler für Ihre benutzerdefinierten My-Objekte hinzufügen, indem Sie der MyApplication-Klasse benutzerdefinierte Ereignishandler hinzufügen. Mithilfe von benutzerdefinierten Ereignissen können Sie Code hinzufügen, der dann ausgeführt wird, wenn ein Ereignishandler hinzugefügt oder entfernt oder das Ereignis ausgelöst wird. Beachten Sie, dass der AddHandler-Code für ein benutzerdefiniertes Ereignis nur dann ausgeführt wird, wenn der Code von einem Benutzer zur Behandlung des Ereignisses hinzufügt wird. Angenommen, das SampleExtension-Objekt aus dem vorherigen Abschnitt weist ein Load-Ereignis auf, für das Sie einen benutzerdefinierten Ereignishandler hinzufügen möchten. Das folgende Codebeispiel zeigt einen benutzerdefinierten Ereignishandler mit dem Namen SampleExtensionLoad, der bei Auftreten des Ereignisses My.SampleExtension.Load aufgerufen wird. Wenn Code zur Behandlung des neuen My.SampleExtensionLoad-Ereignisses hinzugefügt wird, wird der AddHandler-Teil dieses benutzerdefinierten Ereigniscodes ausgeführt. Die Methode MyApplication_SampleExtensionLoad ist im Codebeispiel enthalten, um ein Beispiel für einen Ereignishandler zu zeigen, der das Ereignis My.SampleExtensionLoad behandelt. Beachten Sie, dass das SampleExtensionLoad-Ereignis verfügbar ist, wenn Sie beim Bearbeiten der Datei ApplicationEvents.vb oberhalb des Code-Editors in der linken Dropdownliste die Option Meine Anwendungsereignisse auswählen.

Namespace My

  Partial Friend Class MyApplication

    ' Custom event handler for Load event.
    Private _sampleExtensionHandlers As EventHandler

    Public Custom Event SampleExtensionLoad As EventHandler
      AddHandler(ByVal value As EventHandler)
        ' Warning: This code is not thread-safe. Do not call
        ' this code from multiple concurrent threads.
        If _sampleExtensionHandlers Is Nothing Then
          AddHandler My.SampleExtension.Load, AddressOf OnSampleExtensionLoad
        End If
        _sampleExtensionHandlers = 
            System.Delegate.Combine(_sampleExtensionHandlers, value)
      End AddHandler
      RemoveHandler(ByVal value As EventHandler)
        _sampleExtensionHandlers = 
          System.Delegate.Remove(_sampleExtensionHandlers, value)
      End RemoveHandler
      RaiseEvent(ByVal sender As Object, ByVal e As EventArgs)
        If _sampleExtensionHandlers IsNot Nothing Then
          _sampleExtensionHandlers.Invoke(sender, e)
        End If
      End RaiseEvent
    End Event

    ' Method called by custom event handler to raise user-defined
    ' event handlers.
    <Global.System.ComponentModel.EditorBrowsable( 
         Global.System.ComponentModel.EditorBrowsableState.Advanced)> 
      Protected Overridable Sub OnSampleExtensionLoad( 
                ByVal sender As Object, ByVal e As EventArgs)
      RaiseEvent SampleExtensionLoad(sender, e)
    End Sub

    ' Event handler to call My.SampleExtensionLoad event.
    Private Sub MyApplication_SampleExtensionLoad( 
        ByVal sender As Object, ByVal e As System.EventArgs
        ) Handles Me.SampleExtensionLoad

    End Sub
  End Class
End Namespace

Entwurfsrichtlinien

Verwenden Sie beim Entwickeln von Erweiterungen für den My-Namespace die folgenden Richtlinien, um die Wartungskosten der Erweiterungskomponenten zu minimieren:

  • Schließen Sie nur die Erweiterungslogik ein. Die in der My-Namespaceerweiterung enthaltene Logik sollte nur den Code umfassen, der benötigt wird, um die erforderliche Funktionalität im My-Namespace verfügbar zu machen. Da Ihre Erweiterung in Benutzerprojekten als Quellcode enthalten ist, verursacht das Aktualisieren der Erweiterungskomponente hohe Wartungskosten und sollte nach Möglichkeit vermieden werden.
  • Minimieren Sie Projektannahmen. Wenn Sie die Erweiterungen des My-Namespace erstellen, setzen Sie nicht eine Gruppe von Verweisen, Importe auf Projektebene oder bestimmte Compilereinstellungen (z. B. Option Strict deaktiviert) als Annahme voraus. Minimieren Sie stattdessen Abhängigkeiten, und nehmen Sie eine vollständige Qualifizierung aller Typverweise mithilfe des Schlüsselworts Global vor. Stellen Sie außerdem sicher, dass die Erweiterung mit aktivierter Option Strict-Einstellung kompiliert wird, um Fehler in der Erweiterung zu minimieren.
  • Isolieren Sie den Erweiterungscode. Wenn Sie den Code in einer einzelnen Datei ablegen, kann Ihre Erweiterung problemlos als Visual Studio-Elementvorlage bereitgestellt werden. Weitere Informationen finden Sie unter „Packen und Bereitstellen von Erweiterungen“ weiter unten in diesem Thema. Wenn Sie den gesamten Code der My-Namespaceerweiterung in einer einzelnen Datei oder in einem separaten Ordner in einem Projekt ablegen, können die Benutzer die My-Namespaceerweiterung auch leichter finden.

Entwerfen von Klassenbibliotheken für My

Wie bei den meisten Objektmodellen funktionieren einige Entwurfsmuster im My-Namespace gut und andere nicht. Beachten Sie beim Entwerfen einer Erweiterung für den My-Namespace die folgenden Prinzipien:

  • Zustandslose Methoden. Methoden im My-Namespace sollten eine komplette Lösung für eine bestimmte Aufgabe bereitstellen. Stellen Sie sicher, dass die an die Methode übergebenen Parameterwerte sämtliche Eingaben bereitstellen, die zum Ausführen der jeweiligen Aufgabe erforderlich sind. Vermeiden Sie das Erstellen von Methoden, die auf einem vorherigen Zustand beruhen, z. B. offene Verbindungen mit Ressourcen.
  • Globale Instanzen. Der einzige Zustand, der im My-Namespace beibehalten wird, ist für das Projekt global. Beispielsweise kapselt My.Application.Info den Zustand, der in der gesamten Anwendung gemeinsam verwendet wird.
  • Einfache Parametertypen. Vermeiden Sie der Einfachheit halber komplexe Parametertypen. Erstellen Sie stattdessen Methoden, die entweder keine Parametereingaben erfordern oder einfache Eingabetypen wie Zeichenfolgen, primitive Typen usw. akzeptieren.
  • Factorymethoden. Einige Typen sind notwendigerweise schwer zu instanziieren. Wenn Sie Factorymethoden als Erweiterungen für den My-Namespace bereitstellen, können Sie Typen, die in diese Kategorie fallen, leichter ermitteln und nutzen. Ein Beispiel für eine gut funktionierende Factorymethode ist My.Computer.FileSystem.OpenTextFileReader. Es sind mehrere Streamtypen in .NET Framework verfügbar. Durch die spezifische Angabe von Textdateien kann der Benutzer mithilfe von OpenTextFileReader besser verstehen, welcher Stream zu verwenden ist.

Diese Richtlinien schließen allgemeinen Entwurfsprinzipien für Klassenbibliotheken nicht aus. Vielmehr handelt es sich um optimierte Empfehlungen für Entwickler, die Visual Basic und den My-Namespace verwenden. Allgemeine Entwurfsprinzipien zum Erstellen von Klassenbibliotheken finden Sie unter Framework-Entwurfsrichtlinien.

Packen und Bereitstellen von Erweiterungen

Sie können My-Namespaceerweiterungen in eine Visual Studio-Projektvorlage einschließen, oder Sie können Ihre Erweiterungen packen und als Visual Studio-Elementvorlage bereitstellen. Wenn Sie die My-Namespaceerweiterungen als Visual Studio-Elementvorlage packen, können Sie zusätzliche Funktionen nutzen, die von Visual Basic bereitgestellt werden. Mithilfe dieser Funktionen können Sie eine Erweiterung einbeziehen, wenn ein Projekt auf eine bestimmte Assembly verweist, oder Benutzern können Ihre My-Namespaceeweiterung über die Seite Meine Erweiterungen im Projekt-Designer von Visual Basic explizit hinzufügen.

Ausführliche Informationen zum Bereitstellen von My-Namespaceerweiterungen finden Sie unter Packen und Bereitstellen von benutzerdefinierten My-Erweiterungen.

Siehe auch