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


Расширение пространства имен 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)

Partial (Visual Basic)

Основные понятия

Упаковка и развертывание пользовательских расширений пространства имен My (Visual Basic)

Расширение модели приложения Visual Basic

Настройка доступа к объектам через My (Visual Basic)