Compartir a través de


Extensión del espacio de nombres My en Visual Basic

El My espacio de nombres de Visual Basic expone propiedades y métodos que permiten aprovechar fácilmente la eficacia de .NET Framework. El My espacio de nombres simplifica los problemas comunes de programación, a menudo reduciendo una tarea difícil a una sola línea de código. Además, el My espacio de nombres es totalmente extensible para que pueda personalizar el comportamiento de My y agregar nuevos servicios a su jerarquía para adaptarse a necesidades específicas de la aplicación. En este tema se describe cómo personalizar los miembros existentes del My espacio de nombres y cómo agregar sus propias clases personalizadas al My espacio de nombres.

Personalización de los miembros del espacio de nombres My existentes

El My espacio de nombres de Visual Basic expone información que se usa con frecuencia sobre la aplicación, el equipo y mucho más. Para obtener una lista completa de los objetos del My espacio de nombres, vea Mi referencia. Es posible que tenga que personalizar los miembros existentes del My espacio de nombres para que coincidan mejor con las necesidades de la aplicación. Cualquier propiedad de un objeto del My espacio de nombres que no sea de solo lectura se puede establecer en un valor personalizado.

Por ejemplo, supongamos que usa con frecuencia el My.User objeto para acceder al contexto de seguridad actual para el usuario que ejecuta la aplicación. Sin embargo, la empresa usa un objeto de usuario personalizado para exponer información adicional y funcionalidades para los usuarios de la empresa. En este escenario, puede reemplazar el valor predeterminado de la My.User.CurrentPrincipal propiedad por una instancia de su propio objeto principal personalizado, como se muestra en el ejemplo siguiente:

My.User.CurrentPrincipal = CustomPrincipal

Establecer la CurrentPrincipal propiedad en el My.User objeto cambia la identidad en la que se ejecuta la aplicación. El My.User objeto, a su vez, devuelve información sobre el usuario recién especificado.

Agregar miembros a My objetos

Los tipos devueltos de My.Application y My.Computer se definen como Partial clases. Por lo tanto, puede extender los objetos My.Application y My.Computer creando una clase denominada Partial o MyApplication. La clase no puede ser una Private clase . Si especifica la clase como parte del My espacio de nombres, puede agregar propiedades y métodos que se incluirán con los My.Application objetos o My.Computer .

En el ejemplo siguiente se agrega una propiedad denominada DnsServerIPAddresses al My.Computer objeto :

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

Adición de objetos personalizados al namespace My

Aunque el My espacio de nombres proporciona soluciones para muchas tareas de programación comunes, es posible que encuentre tareas que el My espacio de nombres no direccione. Por ejemplo, la aplicación podría tener acceso a servicios de directorio personalizados para los datos de usuario o la aplicación podría usar ensamblados que no están instalados de forma predeterminada con Visual Basic. Puede ampliar el My espacio de nombres para incluir soluciones personalizadas a tareas comunes específicas de su entorno. El My espacio de nombres se puede ampliar fácilmente para agregar nuevos miembros para satisfacer las crecientes necesidades de la aplicación. Además, puede implementar las extensiones del espacio de nombres My para otros desarrolladores como una plantilla de Visual Basic.

Adición de miembros al espacio de nombres My

Dado que My es un espacio de nombres como cualquier otro espacio de nombres, puede agregarle propiedades de nivel superior simplemente agregando un módulo y especificando un Namespace de My. Anote el módulo con el HideModuleName atributo tal como se muestra en el ejemplo siguiente. El HideModuleName atributo garantiza que IntelliSense no mostrará el nombre del módulo cuando muestre los miembros del My espacio de nombres.

Namespace My
  <HideModuleName()> 
  Module MyCustomModule

  End Module
End Namespace

Para agregar miembros al My espacio de nombres, agregue propiedades según sea necesario al módulo. Para cada propiedad agregada al My espacio de nombres, agregue un campo privado de tipo ThreadSafeObjectProvider(Of T), donde el tipo es el tipo devuelto por la propiedad personalizada. Este campo se usa para crear instancias de objetos seguros para subprocesos que la propiedad devolverá mediante la llamada al método GetInstance. Como resultado, cada subproceso que accede a la propiedad extendida recibe su propia instancia del tipo devuelto. En el ejemplo siguiente se agrega una propiedad denominada SampleExtension que es de tipo SampleExtension al My espacio de nombres:

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

Adición de eventos a objetos personalizados My

Puede usar el objeto My.Application para exponer los eventos de los objetos personalizados My extendiendo la clase parcial MyApplication en el espacio de nombres My. En el caso de los proyectos basados en Windows, puede hacer doble clic en el nodo Mi proyecto del proyecto en el Explorador de soluciones. En el Diseñador de proyectos de Visual Basic, haga clic en la pestaña Aplicación y, a continuación, haga clic en el botón Ver eventos de aplicación . Se creará un nuevo archivo denominado ApplicationEvents.vb . Contiene el código siguiente para extender la MyApplication clase :

Namespace My
  Partial Friend Class MyApplication
  End Class
End Namespace

Puede agregar controladores de eventos para los objetos personalizados My agregando controladores de eventos personalizados a la MyApplication clase . Los eventos personalizados permiten agregar código que se ejecutará cuando se agregue o quite un manejador de eventos, o cuando se genere el evento. Tenga en cuenta que el AddHandler código de un evento personalizado solo se ejecuta si un usuario agrega código para controlar el evento. Por ejemplo, considere que el SampleExtension objeto de la sección anterior tiene un Load evento para el que desea agregar un controlador de eventos personalizado. En el ejemplo de código siguiente se muestra un controlador de eventos personalizado denominado SampleExtensionLoad que se invocará cuando se produzca el My.SampleExtension.Load evento. Cuando se agrega código para controlar el nuevo My.SampleExtensionLoad evento, se ejecuta la AddHandler parte de este código de evento personalizado. El MyApplication_SampleExtensionLoad método se incluye en el ejemplo de código para mostrar un ejemplo de un controlador de eventos que controla el My.SampleExtensionLoad evento. Tenga en cuenta que el SampleExtensionLoad evento estará disponible al seleccionar la opción Mis eventos de aplicación en la lista desplegable izquierda situada encima del Editor de código al editar el archivo 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

Directrices de diseño

Al desarrollar extensiones en el My espacio de nombres, use las instrucciones siguientes para ayudar a minimizar los costos de mantenimiento de los componentes de extensión:

  • Incluya solo la lógica de la extensión. La lógica incluida en la My extensión de espacio de nombres debe incluir solo el código necesario para exponer la funcionalidad necesaria en el My espacio de nombres. Dado que la extensión residirá en proyectos de usuario como código fuente, la actualización del componente de extensión incurre en un alto costo de mantenimiento y debe evitarse si es posible.
  • Minimice las suposiciones del proyecto. Al crear las extensiones del espacio de nombres My, no asuma un conjunto de referencias, importaciones de nivel de proyecto o configuraciones de compilador específicas (por ejemplo, Option Strict desactivada). En su lugar, minimice las dependencias y califique completamente todas las referencias de tipo mediante la Global palabra clave . Además, asegúrese de que la extensión se compila con Option Strict para minimizar los errores de la extensión.
  • Aísle el código de la extensión. Colocar el código en un único archivo hace que la extensión se pueda implementar fácilmente como una plantilla de elemento de Visual Studio. Para obtener más información, vea "Empaquetado e implementación de extensiones" más adelante en este tema. Colocar todo el código del espacio de nombres de la extensión My en un solo archivo o en una carpeta independiente de un proyecto también ayudará a los usuarios a localizar el espacio de nombres de la extensión My.

Diseño de bibliotecas de clases para My

Como sucede con la mayoría de los modelos de objetos, algunos patrones de diseño funcionan bien en el My espacio de nombres y otros no. Al diseñar una extensión en el My espacio de nombres, tenga en cuenta los siguientes principios:

  • Métodos sin estado. Los métodos del My espacio de nombres deben proporcionar una solución completa a una tarea específica. Asegúrese de que los valores de parámetro que se pasan al método proporcionan toda la entrada necesaria para completar la tarea determinada. Evite crear métodos que se basen en el estado anterior, como las conexiones abiertas a los recursos.
  • Instancias globales. El único estado que se mantiene en el espacio de nombres My es global para el proyecto. Por ejemplo, My.Application.Info encapsula el estado que se comparte en toda la aplicación.
  • Tipos de parámetros simples. Mantenga las cosas sencillas evitando tipos de parámetros complejos. En su lugar, cree métodos que no toman ninguna entrada de parámetro o que toman tipos de entrada simples, como cadenas, tipos primitivos, etc.
  • Métodos de fábrica. Algunos tipos son necesariamente difíciles de instanciar. Proporcionar Factory Method como extensiones para el espacio de nombres My permite detectar y consumir más fácilmente los tipos que se encuentran en esta categoría. Un ejemplo de un método de fábrica que funciona bien es My.Computer.FileSystem.OpenTextFileReader. Hay varios tipos de flujo disponibles en .NET Framework. OpenTextFileReader al especificar archivos de texto específicamente, ayuda al usuario a comprender qué flujo usar.

Estas directrices no excluyen los principios generales de diseño para las bibliotecas de clases. Más bien, son recomendaciones optimizadas para desarrolladores que utilizan Visual Basic y el espacio de nombres My. Para conocer los principios generales de diseño para crear bibliotecas de clases, consulte Directrices de diseño de marcos.

Empaquetado e implementación de extensiones

Puede incluir extensiones del espacio de nombres My en una plantilla de proyecto de Visual Studio, o bien puede empaquetar las extensiones e implementarlas como una plantilla de elemento de Visual Studio. Cuando empaquetas tus My extensiones de espacio de nombres como una plantilla de elemento de Visual Studio, puedes aprovechar las capacidades adicionales proporcionadas por Visual Basic. Estas funcionalidades permiten incluir una extensión cuando un proyecto hace referencia a un ensamblado determinado o permitir que los usuarios agreguen explícitamente la My extensión de espacio de nombres mediante la página Mis extensiones del Diseñador de proyectos de Visual Basic.

Para obtener más información sobre cómo implementar extensiones de espacio de nombres My, vea Empaquetado e implementación de extensiones My personalizadas.

Consulte también