Extensión del espacio de nombres My en Visual Basic

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

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

El espacio de nombres My de Visual Basic expone información de uso frecuente sobre la aplicación, el equipo, etc. Para obtener una lista completa de los objetos del espacio de nombres My, vea Referencia de My. Es posible que tenga que personalizar los miembros existentes del espacio de nombres My de modo que se ajusten mejor a las necesidades de la aplicación. Cualquier propiedad de un objeto en el espacio de nombres My que no sea de solo lectura se puede establecer en un valor personalizado.

Por ejemplo, imagine que habitualmente usa el objeto My.User para acceder al contexto de seguridad actual para el usuario que ejecuta la aplicación. Pero en la empresa se utiliza un objeto de usuario personalizado para exponer información y funciones adicionales para los usuarios. En este escenario, puede reemplazar el valor predeterminado de la propiedad My.User.CurrentPrincipal por una instancia de un objeto de entidad de seguridad personalizado propio, como se muestra en el ejemplo siguiente:

My.User.CurrentPrincipal = CustomPrincipal

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

Adición de miembros a objetos My

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

En el ejemplo siguiente se agrega una propiedad denominada DnsServerIPAddresses al objeto 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

Adición de objetos personalizados al espacio de nombres My

Aunque el espacio de nombres My proporciona soluciones para muchas tareas de programación comunes, puede encontrar algunas que no se aborden en el espacio de nombres My. Por ejemplo, es posible que la aplicación acceda a servicios de directorio personalizados para los datos de usuario, o bien que use ensamblados que no se instalen de forma predeterminada con Visual Basic. Puede extender el espacio de nombres My a fin de incluir soluciones personalizadas para tareas comunes específicas del entorno. El espacio de nombres My se puede ampliar fácilmente para agregar nuevos miembros a fin de satisfacer las necesidades crecientes de las aplicaciones. 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

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

Namespace My
  <HideModuleName()> 
  Module MyCustomModule

  End Module
End Namespace

Para agregar miembros al espacio de nombres My, agregue las propiedades al módulo según sea necesario. Para cada propiedad agregada al espacio de nombres My, 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 de tipo SampleExtension al espacio de nombres 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

Adición de eventos a objetos My personalizados

Puede usar el objeto My.Application para exponer eventos para los objetos My personalizados si extiende 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 después en el botón Ver eventos de aplicaciones. Se creará un archivo con el nombre ApplicationEvents.vb. Contiene el código siguiente para extender la clase MyApplication:

Namespace My
  Partial Friend Class MyApplication
  End Class
End Namespace

Puede agregar controladores de eventos para los objetos My personalizados si agrega controladores de eventos personalizados a la clase MyApplication. Los eventos personalizados permiten agregar código que se ejecutará cuando se agregue o se quite un controlador de eventos, o cuando se genere el evento. Tenga en cuenta que el código de AddHandler para un evento personalizado solo se ejecuta si un usuario agrega el código para controlar el evento. Por ejemplo, imagine que el objeto SampleExtension de la sección anterior tiene un evento Load para el que quiere 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 evento My.SampleExtension.Load. Cuando se agrega código para controlar el nuevo evento My.SampleExtensionLoad, se ejecuta el elemento AddHandler de este código de evento personalizado. El método MyApplication_SampleExtensionLoad se incluye en el ejemplo de código para mostrar un ejemplo de un controlador de eventos que controla el evento My.SampleExtensionLoad. Tenga en cuenta que el evento SampleExtensionLoad estará disponible al seleccionar la opción Mis eventos de aplicación en la lista desplegable de la izquierda situada encima del editor de código al modificar 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 para el espacio de nombres My, use las instrucciones para ayudar a minimizar los costos de mantenimiento de los componentes de la extensión:

  • Incluya solo la lógica de la extensión. La lógica incluida en la extensión del espacio de nombres My debe incluir solo el código necesario para exponer la funcionalidad necesaria en el espacio de nombres My. Como la extensión residirá en los proyectos de usuario como código fuente, la actualización del componente de extensión incurrirá en un alto costo de mantenimiento y se debe evitar si es posible.
  • Minimizar las suposiciones sobre el 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 use nombres completos para todas las referencias de tipos mediante la palabra clave Global. Además, asegúrese de que la extensión se compila con Option Strict activado para minimizar los errores.
  • Aísle el código de la extensión. Si coloca el código en un único archivo, la extensión se podrá 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. Si coloca todo el código de la extensión del espacio de nombres My en un solo archivo o en una carpeta independiente de un proyecto también ayudará a los usuarios a encontrar la extensión del espacio de nombres 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 espacio de nombres My y otros no. Al diseñar una extensión para el espacio de nombres My, tenga en cuenta los principios siguientes:

  • Métodos sin estado. Los métodos del espacio de nombres My 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 en cuestión. Evite crear métodos que se basen en un estado anterior, como conexiones abiertas a 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. Evite tipos de parámetro complejos para que todo sea más sencillo. En su lugar, cree métodos que no tomen parámetros como entrada o que tomen tipos de entrada simples como cadenas, tipos primitivos, etc.
  • Factory Method. La creación de instancias de algunos tipos es inevitablemente compleja. 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 Factory Method que funciona bien es My.Computer.FileSystem.OpenTextFileReader. Hay varios tipos de secuencias disponibles en .NET Framework. Al especificar los archivos de texto de forma concreta, OpenTextFileReader ayuda al usuario a comprender qué secuencia usar.

Estas instrucciones no excluyen los principios de diseño generales de las bibliotecas de clases. Por el contrario, son recomendaciones optimizadas para los desarrolladores que usan Visual Basic y el espacio de nombres My. Para obtener los principios de diseño generales de creación de bibliotecas de clases, vea Instrucciones de diseño de .NET Framework.

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. Al empaquetar las extensiones del espacio de nombres My como una plantilla de elemento de Visual Studio, puede aprovechar las funciones adicionales que proporciona Visual Basic. Estas funciones permiten incluir una extensión cuando un proyecto hace referencia a un ensamblado concreto, o bien que los usuarios agreguen de forma explícita la extensión del espacio de nombres My mediante la página Extensiones My 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.

Vea también