在 Visual Basic 中延伸
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.Application
和 My.Computer
傳回的類型會定義為 Partial
類別。 因此,您可以藉由建立名為My.Application
或My.Computer
的Partial
類別來擴充MyApplication
和MyComputer
物件。 類別不能是類別 Private
。 如果您將 類別指定為命名空間的 My
一部分,您可以加入將隨附於 My.Application
或 My.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
是命名空間,就像任何其他命名空間一樣,只要新增模組並指定 Namespace
的 My
,即可將最上層屬性加入其中。 將模組標註為屬性 HideModuleName
,如以下範例所示。 屬性 HideModuleName
可確保 IntelliSense 不會在顯示命名空間的成員 My
時顯示模組名稱。
Namespace My
<HideModuleName()>
Module MyCustomModule
End Module
End Namespace
若要將成員新增至 My
命名空間,請視需要將屬性新增至模組。 針對新增至 My
命名空間的每個屬性,請新增 類型的 ThreadSafeObjectProvider(Of T)
私用字段,其中類型是自定義屬性所傳回的類型。 這個欄位可用來建立屬性傳回的線程安全物件實例,方法是呼叫 GetInstance
方法。 因此,存取擴充屬性的每個執行緒都會接收各自的傳回類型的實例。 下列範例會將名為 SampleExtension
SampleExtension
的屬性新增至 命名空間類型 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
命名空間延伸模組的詳細資訊,請參閱 封裝和部署自定義我的延伸模組。