Расширение пространства имен My
в Visual Basic
Пространство имен My
в Visual Basic предоставляет свойства и методы, позволяющие с легкостью пользоваться возможностями .NET Framework. Пространство имен My
упрощает решение распространенных проблем программирования, часто превращая сложную задачу в одну строку кода. Кроме того, пространство имен My
является полностью расширяемым. Это позволяет настроить поведение My
и добавить в его иерархию новые службы, в соответствии с конкретными потребностями приложения. В этом разделе обсуждаются способы настройки существующих элементов пространства имен My
и добавления настраиваемых классов в пространство имен My
.
Настройка существующих элементов пространства имен My
Пространство имен My
в Visual Basic предоставляет часто используемые сведения о приложении, компьютере и многое другое. Полный список объектов в пространстве имен My
см. в разделе Справочные материалы по My. Возможно, потребуется настроить существующие элементы пространства имен My
, чтобы они лучше соответствовали потребностям приложения. Для любого свойства объекта в пространстве имен My
, которое доступно не только для чтения, можно установить настраиваемое значение.
Например, предположим, что вы часто используете объект My.User
для доступа к текущему контексту безопасности для пользователя, запустившего приложение. При этом модифицированный объект-пользователь используется для предоставления дополнительных сведений и возможностей пользователям внутри компании. В этом сценарии значение по умолчанию свойства My.User.CurrentPrincipal
можно заменить экземпляром вашего собственного объекта principal, как показано в следующем примере:
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
будет доступно при выборе параметра Мои события приложения в левом раскрывающемся списке над редактором кода при редактировании файла ApplicationEvents.vb.
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. Дополнительные сведения см. в статье "Упаковка и развертывание расширений" дальше в этом разделе. Размещение всего кода расширения пространства имен
My
в одном файле или в отдельной папке проекта также поможет пользователям находить расширение пространства именMy
.
Разработка библиотек классов для My
Как и в случае с большинством объектных моделей, некоторые шаблоны проектирования хорошо работают в пространстве имен My
, а другие — нет. При разработке расширения для пространства имен My
учитывайте следующие принципы.
- Методы без отслеживания состояния. Методы в пространстве имен
My
должны обеспечивать завершенное решение для конкретной задачи. Убедитесь, что значения параметров, передаваемые в метод, предоставляют все входные данные, необходимые для выполнения такой задачи. Избегайте создания методов, полагающихся на существующее состояние, например на открытые соединения с ресурсами. - Глобальные экземпляры. Единственное состояние, поддерживаемое в пространстве имен
My
, является глобальным по отношению к проекту. Например,My.Application.Info
инкапсулирует состояние, которое является общим для всего приложения. - Простые типы параметров. Простоты ради избегайте сложных типов параметров. Вместо этого создавайте методы, которые либо не принимают ввод параметров, либо принимают простые типы ввода, такие как строки, примитивные типы и т. д.
- Фабричные методы. Создание экземпляров некоторых типов по необходимости остается сложным. Предоставление фабричных методов в качестве расширений пространства имен
My
упрощает обнаружение и использование типов, попадающие в эту категорию. Примером хорошо работающего фабричного метода являетсяMy.Computer.FileSystem.OpenTextFileReader
. В .NET Framework доступно несколько типов потоков. Указывая конкретно текстовые файлы,OpenTextFileReader
помогает пользователю понять, какой поток использовать.
Эти рекомендации не исключают общих принципов разработки для библиотек классов. Они лишь являются специальными рекомендациями для разработчиков, использующих Visual Basic и пространство имен My
. Общие принципы создания библиотек классов см. в разделе Рекомендации по проектированию на основе Framework.
Упаковка и развертывание расширений
Расширения пространства имен My
можно включить в шаблон проекта Visual Studio или упаковать и развернуть в качестве шаблона элемента Visual Studio. При упаковке расширений пространства имен My
в качестве шаблона элемента Visual Studio можно воспользоваться дополнительными возможностями, предоставляемыми Visual Basic. Эти возможности позволяют включать расширение, когда проект ссылается на определенную сборку, или разрешить пользователям прямо добавлять расширение пространства имен My
с помощью Мои расширения на странице конструктора проектов Visual Basic.
Сведения о развертывании расширений пространства имен My
см. в разделе Упаковка и развертывание пользовательских расширений пространства имен My.