Condividi tramite


Estensione dello spazio dei nomi My in Visual Basic

Lo spazio dei nomi My in Visual Basic espone proprietà e metodi che consentono di sfruttare facilmente la potenza di .NET Framework. Lo spazio dei nomi My semplifica i problemi di programmazione comuni, riducendo spesso un'attività difficile a una singola riga di codice. Inoltre, lo spazio dei nomi My è completamente estendibile in modo da poter personalizzare il comportamento di My e aggiungere nuovi servizi alla gerarchia per adattarsi a specifiche esigenze dell'applicazione. Questo argomento illustra sia come personalizzare i membri esistenti dello spazio dei nomi My che come aggiungere classi personalizzate allo spazio dei nomi My.

Personalizzazione dei membri esistenti dello spazio dei nomi My

Lo spazio dei nomi My in Visual Basic espone informazioni frequenti sull'applicazione, sul computer e altro ancora. Per un elenco completo degli oggetti nello spazio dei nomi My, vedere Riferimenti di My. Potrebbe essere necessario personalizzare i membri esistenti dello spazio dei nomi My in modo che corrispondano meglio alle esigenze dell'applicazione. Qualsiasi proprietà di un oggetto nello spazio dei nomi My che non è di sola lettura può essere impostata su un valore personalizzato.

Si supponga, ad esempio, di usare spesso l'oggetto My.User per accedere al contesto di sicurezza corrente per l'utente che esegue l'applicazione. Tuttavia, l'azienda usa un oggetto utente personalizzato per esporre informazioni e funzionalità aggiuntive per gli utenti all'interno dell'azienda. In questo scenario è possibile sostituire il valore predefinito della proprietà My.User.CurrentPrincipal con un'istanza del proprio oggetto entità di sicurezza personalizzato, come illustrato nell'esempio seguente:

My.User.CurrentPrincipal = CustomPrincipal

L'impostazione della proprietà CurrentPrincipal nell'oggetto My.User modifica l'identità con cui viene eseguita l'applicazione. L'oggetto My.User, a sua volta, restituisce informazioni sull'utente appena specificato.

Aggiunta di membri agli oggetti My

I tipi restituiti da My.Application e My.Computer vengono definiti come classi Partial. Pertanto, è possibile estendere gli oggetti My.Application e My.Computer creando una classe Partial denominata MyApplication o MyComputer. La classe non può essere una classe Private. Se si specifica la classe come parte dello spazio dei nomi My, è possibile aggiungere proprietà e metodi che verranno inclusi negli oggetti My.Application o My.Computer.

Nell'esempio seguente viene aggiunta una proprietà denominata DnsServerIPAddresses all'oggetto 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

Aggiunta di oggetti personalizzati allo spazio dei nomi My

Sebbene lo spazio dei nomi My fornisca soluzioni per molte attività di programmazione comuni, è possibile trovare attività per cui lo spazio dei nomi My non è utile. Ad esempio, l'applicazione potrebbe accedere a servizi directory personalizzati per i dati dell'utente oppure potrebbe usare assembly non installati per impostazione predefinita con Visual Basic. È possibile estendere lo spazio dei nomi My in modo da includere soluzioni personalizzate ad attività comuni specifiche dell'ambiente. Lo spazio dei nomi My può essere esteso facilmente per aggiungere nuovi membri e soddisfare le crescenti esigenze dell'applicazione. Inoltre, è possibile distribuire le estensioni dello spazio dei nomi My ad altri sviluppatori come modello di Visual Basic.

Aggiunta di membri allo spazio dei nomi My

Poiché My è uno spazio dei nomi come qualsiasi altro spazio dei nomi, è possibile aggiungervi proprietà di primo livello aggiungendo semplicemente un modulo e specificando un valore per Namespace di My. Annotare il modulo con l'attributo HideModuleName come illustrato nell'esempio seguente. L'attributo HideModuleName garantisce che IntelliSense non visualizzi il nome del modulo quando visualizza i membri dello spazio dei nomi My.

Namespace My
  <HideModuleName()> 
  Module MyCustomModule

  End Module
End Namespace

Per aggiungere membri allo spazio dei nomi My, aggiungere proprietà in base alle esigenze del modulo. Per ogni proprietà aggiunta allo spazio dei nomi My, aggiungere un campo privato di tipo ThreadSafeObjectProvider(Of T), dove il tipo è il tipo restituito dalla proprietà personalizzata. Questo campo viene utilizzato per creare istanze di oggetto thread-safe che la proprietà restituisce chiamando il metodo GetInstance. Di conseguenza, ogni thread che accede alla proprietà estesa riceve la propria istanza del tipo restituito. Nell'esempio seguente viene aggiunta una proprietà denominata SampleExtension di tipo SampleExtension allo spazio dei nomi 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

Aggiunta di eventi a oggetti personalizzati My

È possibile usare l'oggetto My.Application per esporre eventi per gli oggetti personalizzati My estendendo la classe parziale MyApplication nello spazio dei nomi My. Per i progetti basati su Windows, è possibile fare doppio clic sul nodo Progetto personale per il progetto in Esplora soluzioni. In Creazione progetti di Visual Basic fare clic sulla scheda Applicazione e quindi sul pulsante Visualizza eventi applicazione. Verrà creato un nuovo file denominato ApplicationEvents.vb. Contiene il codice seguente per estendere la classe MyApplication:

Namespace My
  Partial Friend Class MyApplication
  End Class
End Namespace

È possibile aggiungere i gestori dell'evento per gli oggetti personalizzati My aggiungendo i gestori dell'evento personalizzati alla classe MyApplication. Gli eventi personalizzati consentono di aggiungere codice che verrà eseguito quando un gestore dell'evento viene aggiunto, rimosso o viene generato un evento. Si noti che il codice AddHandler per un evento personalizzato viene eseguito solo se il codice viene aggiunto da un utente per gestire l'evento. Si consideri, ad esempio, che l'oggetto SampleExtension della sezione precedente ha un evento Load per cui si vuole aggiungere un gestore dell'evento personalizzato. Nell'esempio di codice seguente viene illustrato un gestore dell'evento personalizzato denominato SampleExtensionLoad che verrà richiamato quando si verifica l'evento My.SampleExtension.Load. Quando viene aggiunto il codice per gestire il nuovo evento My.SampleExtensionLoad, viene eseguita la parte AddHandler di questo codice evento personalizzato. Il metodo MyApplication_SampleExtensionLoad è incluso nell'esempio di codice per mostrare un esempio di gestore dell'evento che gestisce l'evento My.SampleExtensionLoad. Si noti che l'evento SampleExtensionLoad sarà disponibile quando si seleziona l'opzione Eventi applicazione personali nell'elenco a discesa a sinistra sopra l'editor di codice quando si modifica il file 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

Linee guida di progettazione

Quando si sviluppano estensioni nello spazio dei nomi My, usare le linee guida seguenti per ridurre al minimo i costi di manutenzione dei componenti dell'estensione:

  • Includere solo la logica di estensione. La logica inclusa nell'estensione dello spazio dei nomi My deve includere solo il codice necessario per esporre le funzionalità necessarie nello spazio dei nomi My. Poiché l'estensione risiederà nei progetti dell'utente come codice sorgente, l'aggiornamento del componente dell'estensione comporta un costo elevato di manutenzione e deve essere evitato, se possibile.
  • Ridurre al minimo i presupposti del progetto. Quando si creano le estensioni dello spazio dei nomi My, non assumere un set di riferimenti, importazioni a livello di progetto o impostazioni specifiche del compilatore (ad esempio, Option Strict disattivato). Ridurre invece al minimo le dipendenze e qualificare completamente tutti i tipi di riferimenti usando la parola chiave Global. Assicurarsi inoltre che l'estensione esegua la compilazione con Option Strict attivata per ridurre al minimo gli errori nell'estensione.
  • Isolare il codice dell'estensione. L'inserimento del codice in un singolo file rende l'estensione facilmente distribuibile come modello di elemento di Visual Studio. Per altre informazioni, vedere "Creazione di pacchetti e distribuzione delle estensioni" più avanti in questo argomento. L'inserimento di tutto il codice dell'estensione dello spazio dei nomi My in un singolo file o in una cartella separata in un progetto consentirà inoltre agli utenti di individuare l'estensione dello spazio dei nomi My.

Progettazione di librerie di classi per My

Come accade per la maggior parte dei modelli a oggetti, alcuni schemi progettuali funzionano bene nello spazio dei nomi My e altri no. Quando si progetta un'estensione per lo spazio dei nomi My, considerare i principi seguenti:

  • Metodi senza stato. I metodi nello spazio dei nomi My devono fornire una soluzione completa a un'attività specifica. Assicurarsi che i valori dei parametri passati al metodo forniscano tutto l'input necessario per completare l'attività specifica. Evitare di creare metodi che si basano sullo stato precedente, ad esempio connessioni aperte alle risorse.
  • Istanze globali. L'unico stato mantenuto nello spazio dei nomi My è globale per il progetto. Ad esempio, My.Application.Info incapsula lo stato condiviso in tutta l'applicazione.
  • Tipi di parametro semplici. Semplificare le operazioni evitando tipi di parametri complessi. Creare invece metodi che non accettano input di parametri o che accettano tipi di input semplici, ad esempio stringhe, tipi primitivi e così via.
  • Metodi factory. Per alcuni tipi creare un'istanza è necessariamente difficile. Specificare metodi factory come estensioni per lo spazio dei nomi My consente di individuare e utilizzare più facilmente i tipi che rientrano in questa categoria. Un esempio di metodo factory che funziona bene è My.Computer.FileSystem.OpenTextFileReader. In .NET Framework sono disponibili diversi tipi di flusso. Specificando in modo specifico i file di testo, OpenTextFileReader consente all'utente di capire quale flusso usare.

Queste linee guida non impediscono principi di progettazione generali per le librerie di classi. Si tratta piuttosto di raccomandazioni ottimizzate per gli sviluppatori che usano Visual Basic e lo spazio dei nomi My. Per i principi di progettazione generali per la creazione di librerie di classi, vedere Linee guida per la progettazione del framework.

Creazione di pacchetti e distribuzione delle estensioni

È possibile includere le estensioni dello spazio dei nomi My in un modello di progetto di Visual Studio oppure creare un pacchetto delle estensioni e distribuirle come modello di elemento di Visual Studio. Quando si creano pacchetti di estensioni dello spazio dei nomi My come modello di elemento di Visual Studio, è possibile sfruttare le funzionalità aggiuntive fornite da Visual Basic. Queste funzionalità consentono di includere un'estensione quando un progetto fa riferimento a un particolare assembly o consentono agli utenti di aggiungere in modo esplicito l'estensione dello spazio dei nomi My usando la pagina Estensioni My di Creazione progetti di Visual Basic.

Per informazioni dettagliate su come distribuire le estensioni dello spazio dei nomi My, vedere Creazione di pacchetti e distribuzione delle estensioni My personalizzate.

Vedi anche