Поделиться через


Расширение пространства имен 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 является пространством имен, как и в случае с любым другим пространством имен, в него можно добавлять свойства верхнего уровня, просто добавив модуль и указав NamespaceMy. Снабдите модуль атрибутом 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.

См. также