共用方式為


在 Visual Basic 中延伸My命名空間

My Visual Basic 中的命名空間會公開屬性和方法,讓您輕鬆利用 .NET Framework 的強大功能。 My命名空間可簡化常見的程式設計問題,通常會將一行程式代碼的難度降低為一行程序代碼。 此外, My 命名空間是完全可延伸的,因此您可以自定義 的行為 My ,並將新的服務新增至其階層,以適應特定的應用程式需求。 本主題討論如何自定義命名空間的現有成員 My ,以及如何將您自己的自定義類別新增至 My 命名空間。

自定義現有的 My 命名空間成員

My Visual Basic 中的命名空間會公開您應用程式、計算機等的常用資訊。 如需命名空間中 My 物件的完整清單,請參閱 我的參考。 您可能必須自定義命名空間的現有成員 My ,使其更符合應用程式的需求。 命名空間中 My 不是唯讀之物件的任何屬性都可以設定為自定義值。

例如,假設您經常使用 My.User 物件來存取執行應用程式之使用者的目前安全性內容。 不過,您的公司會使用自定義使用者對象來公開公司內使用者的其他資訊和功能。 在此案例中,您可以將 屬性的 My.User.CurrentPrincipal 預設值取代為您自己的自定義主體對象的實例,如下列範例所示:

My.User.CurrentPrincipal = CustomPrincipal

CurrentPrincipal 物件上設定 My.User 屬性會變更應用程式執行時的身分識別。 對象 My.User 接著會傳回新指定使用者的相關信息。

將成員新增至 My 物件

My.ApplicationMy.Computer 傳回的類型會定義為 Partial 類別。 因此,您可以藉由建立名為My.ApplicationMy.ComputerPartial類別來擴充MyApplicationMyComputer物件。 類別不能是類別 Private 。 如果您將 類別指定為命名空間的 My 一部分,您可以加入將隨附於 My.ApplicationMy.Computer 對象的屬性和方法。

下列範例會將名為 DnsServerIPAddresses 的屬性新增至 My.Computer 物件:

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

將自訂物件新增至 My 命名空間

My雖然命名空間提供許多常見程序設計工作的解決方案,但您可能會遇到命名空間未處理的工作My。 例如,您的應用程式可能會存取用戶數據的自定義目錄服務,或者您的應用程式可能會使用預設未與 Visual Basic 一起安裝的元件。 您可以擴充 My 命名空間,將自定義解決方案納入您環境專屬的一般工作。 My命名空間可以輕鬆地擴充,以新增成員以符合不斷成長的應用程式需求。 此外,您可以將 My 命名空間延伸模組作為 Visual Basic 範本部署到其他開發人員。

將成員新增至 My 命名空間

因為 My 是命名空間,就像任何其他命名空間一樣,只要新增模組並指定 NamespaceMy,即可將最上層屬性加入其中。 將模組標註為屬性 HideModuleName,如以下範例所示。 屬性 HideModuleName 可確保 IntelliSense 不會在顯示命名空間的成員 My 時顯示模組名稱。

Namespace My
  <HideModuleName()> 
  Module MyCustomModule

  End Module
End Namespace

若要將成員新增至 My 命名空間,請視需要將屬性新增至模組。 針對新增至 My 命名空間的每個屬性,請新增 類型的 ThreadSafeObjectProvider(Of T)私用字段,其中類型是自定義屬性所傳回的類型。 這個欄位可用來建立屬性傳回的線程安全物件實例,方法是呼叫 GetInstance 方法。 因此,存取擴充屬性的每個執行緒都會接收各自的傳回類型的實例。 下列範例會將名為 SampleExtensionSampleExtension 的屬性新增至 命名空間類型 My

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

將事件新增至自定義 My 物件

您可以使用 My.Application 對象來公開自定義 My 物件的事件,方法是擴充 MyApplication 命名空間中的 My 部分類別。 針對以 Windows 為基礎的專案,您可以在 [方案總管] 中按兩下您專案的 我的專案 節點。 在 Visual Basic 專案設計工具中,按兩下 [ 應用程式 ] 索引標籤,然後按兩下 [ 檢視應用程式事件 ] 按鈕。 將會建立名為 ApplicationEvents.vb 的新檔案。 包含下列程式代碼來擴充 MyApplication 類別:

Namespace My
  Partial Friend Class MyApplication
  End Class
End Namespace

您可以透過將自定義事件處理程式新增到 My 類別,來為您的自定義 MyApplication 物件新增事件處理程式。 自訂事件使您可以添加程式碼,以在事件處理常式新增、移除或事件被觸發時執行。 請注意, AddHandler 只有在使用者新增程式代碼來處理事件時,自定義事件的程式代碼才會執行。 例如,考慮之前部分中的 SampleExtension 物件具有一個 Load 事件,您想為其新增自訂事件處理程式。 下列程式代碼範例顯示了一個名為 SampleExtensionLoad 的自定義事件處理程式,當 My.SampleExtension.Load 事件發生時,該處理程式會被叫用。 新增程式代碼來處理新 My.SampleExtensionLoad 事件時, AddHandler 會執行這個自定義事件程式代碼的一部分。 方法包含在程式 MyApplication_SampleExtensionLoad 代碼範例中,以顯示處理 My.SampleExtensionLoad 事件的事件處理程式範例。 請注意,當您編輯 SampleExtensionLoad 檔案時,在程式代碼編輯器上方的左側下拉式清單中選取 [我的應用程式事件] 選項時, 事件將可供使用。

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

設計指導方針

當您開發命名空間的 My 延伸模組時,請使用下列指導方針來協助將擴充元件的維護成本降至最低:

  • 僅納入擴充邏輯。 命名空間延伸模組中包含的 My 邏輯應該只包含公開命名空間中 My 必要功能所需的程序代碼。 因為您的延伸模組會以原始程式碼的形式存在於用戶專案中,因此更新延伸模組元件會產生高維護成本,並應盡可能避免。
  • 最小化項目假設。 當您建立 My 命名空間的延伸模組時,請勿假設存在一組參考、專案層級匯入或特定的編譯器設定(例如 Option Strict 關閉)。 相反地,使用 Global 關鍵字將相依性降至最低,並完整限定所有類型參考。 此外,請確定擴充功能會使用 Option Strict 進行編譯,以將擴充功能中的錯誤降到最低。
  • 隔離延伸代碼。 將程式代碼放在單一檔案中,可讓您的延伸模塊輕鬆地部署為Visual Studio專案範本。 如需詳細資訊,請參閱本主題稍後的「Packaging and Deploying Extensions」。 My將所有命名空間擴展代碼放在單一檔案或專案中的個別資料夾,同樣有助於使用者找出My命名空間擴展。

My設計類別庫

與大部分物件模型的情況一樣,某些設計模式在命名空間中 My 運作良好,而其他模式則無法運作。 設計命名空間的 My 延伸模組時,請考慮下列原則:

  • 無狀態方法。 命名空間中 My 的方法應該為特定工作提供完整的解決方案。 請確定傳遞至 方法的參數值會提供完成特定工作所需的所有輸入。 避免建立需要依賴先前狀態的方法,例如開啟連線至資源。
  • 全域實例。 命名空間中 My 維護的唯一狀態是專案中的全域狀態。 例如, My.Application.Info 封裝整個應用程式共享的狀態。
  • 簡單參數類型。 避免複雜的參數類型,讓事情保持簡單。 相反地,請建立不採用任何參數輸入或採用簡單輸入類型的方法,例如字串、基本類型等等。
  • 工廠方法。 某些類型一定難以具現化。 提供 Factory 方法做為命名空間的 My 延伸模組,可讓您更輕鬆地探索和使用屬於此類別的類型。 正常運作的 Factory 方法範例為 My.Computer.FileSystem.OpenTextFileReader。 .NET Framework 中有數種可用的數據流類型。 藉由特別指定文本檔, OpenTextFileReader 可協助用戶瞭解要使用的數據流。

這些指導方針不會排除類別庫的一般設計原則。 相反地,它們是針對使用 Visual Basic 和 My 命名空間的開發人員優化的建議。 如需建立類別庫的一般設計原則,請參閱 架構設計指導方針

封裝和部署延伸模組

您可以在 My Visual Studio 專案範本中包含命名空間延伸模組,也可以封裝延伸模組,並將其部署為 Visual Studio 專案範本。 當您將 My 命名空間延伸模組封裝為 Visual Studio 專案範本時,您可以利用 Visual Basic 所提供的其他功能。 這些功能可讓您在項目參考特定元件時包含延伸模組,或讓使用者使用 Visual Basic 項目設計工具的 [My] 頁面明確新增命名空間延伸模組。

如需如何部署 My 命名空間延伸模組的詳細資訊,請參閱 封裝和部署自定義我的延伸模組

另請參閱