Расширение пространства имен My в Visual Basic
Пространство имен My в Visual Basic предоставляет свойства и методы, позволяющие легко воспользоваться мощными средствами платформы. NET Framework. Пространство имен My упрощает решение типовых задач программирования, часто сводя сложную задачу к одной строке кода. Кроме того, пространство имен My является полностью расширяемым, что позволяет настраивать поведение объекта My и добавлять новые службы в его иерархию для адаптации к потребностям конкретного приложения. В этом разделе обсуждается настройка существующих членов пространства имен My и добавление собственных пользовательских классов в пространство имен My.
Содержание раздела
Настройка существующих элементов пространства имен My
Добавление элементов в объекты My
Добавление пользовательских объектов в пространство имен My
Добавление элементов в пространство имен My
Добавление событий к пользовательским объектам My
Правила разработки
Разработка библиотек классов для My
Упаковка и развертывание расширений
Настройка существующих элементов пространства имен My
Пространство имен My в Visual Basic предоставляет часто используемые сведения о приложении, компьютере и т.д. Полный список объектов пространства имен My содержится в разделе Ссылка My (Visual Basic). Возможно, вам потребуется настроить существующие члены пространства имен 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.
Например, в следующем примере к объекту My.Computer добавляется свойство с именем DnsServerIPAddresses.
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. В результате каждый поток, который обращается к расширенному свойству, получает собственный экземпляр возвращенного типа. В следующем примере в пространство имен My добавляется свойство с именем SampleExtension, имеющее тип SampleExtension:
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 выберите вкладку Application и нажмите кнопку View Application Events. Будет создан новый файл с именем 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. Общие принципы проектирования библиотек классов см. в разделе Руководство по разработке библиотек классов.
Упаковка и развертывание расширений
Можно включить расширения пространства имен My в шаблон проекта Visual Studio, а можно упаковать их и развернуть в виде шаблона элемента Visual Studio. При упаковке расширений пространства имен My в качестве шаблона элемента Visual Studio можно воспользоваться дополнительными возможностями, предоставляемыми Visual Basic. Это дает возможность включить расширение, когда проект ссылается на отдельную сборку, а также явно добавить расширение пространства имен My с использованием страницы Мои расширения в конструкторе проекта Visual Basic.
Сведения о развертывании расширений пространства имен My см. в разделе Упаковка и развертывание пользовательских расширений пространства имен My (Visual Basic).
См. также
Ссылки
Страница "Мои расширения" конструктор проектов (Visual Basic)
Страница "Приложение" в конструкторе проектов (Visual Basic)
Основные понятия
Упаковка и развертывание пользовательских расширений пространства имен My (Visual Basic)