Estendendo o My
namespace no Visual Basic
O My
namespace no Visual Basic expõe propriedades e métodos que permitem que você aproveite facilmente o poder do .NET Framework. O My
namespace simplifica problemas comuns de programação, muitas vezes reduzindo uma tarefa difícil a uma única linha de código. Além disso, o My
namespace é totalmente extensível para que você possa personalizar o comportamento e adicionar novos serviços à sua hierarquia para se adaptar às necessidades específicas do My
aplicativo. Este tópico discute como personalizar membros existentes do My
namespace e como adicionar suas próprias classes personalizadas ao My
namespace.
Personalizando membros de namespace existentes My
O My
namespace no Visual Basic expõe informações usadas com freqüência sobre seu aplicativo, seu computador e muito mais. Para obter uma lista completa dos objetos no My
namespace, consulte Minha referência. Talvez seja necessário personalizar os My
membros existentes do namespace para que eles correspondam melhor às necessidades do seu aplicativo. Qualquer propriedade de um objeto no My
namespace que não seja somente leitura pode ser definida como um valor personalizado.
Por exemplo, suponha que você use frequentemente o My.User
objeto para acessar o contexto de segurança atual para o usuário que executa seu aplicativo. No entanto, sua empresa usa um objeto de usuário personalizado para expor informações e recursos adicionais para os usuários dentro da empresa. Nesse cenário, você pode substituir o My.User.CurrentPrincipal
valor padrão da propriedade por uma instância de seu próprio objeto principal personalizado, conforme mostrado no exemplo a seguir:
My.User.CurrentPrincipal = CustomPrincipal
Definir a CurrentPrincipal
My.User
propriedade no objeto altera a identidade sob a qual o aplicativo é executado. O My.User
objeto, por sua vez, retorna informações sobre o usuário recém-especificado.
Adicionando membros a My
objetos
Os tipos retornados de My.Application
e My.Computer
são definidos como Partial
classes. Portanto, você pode estender os My.Application
objetos e My.Computer
criando uma Partial
classe chamada MyApplication
ou MyComputer
. A classe não pode ser uma Private
classe. Se você especificar a classe como parte do My
namespace, poderá adicionar propriedades e métodos que serão incluídos com os My.Application
objetos or My.Computer
.
O exemplo a seguir adiciona uma propriedade nomeada DnsServerIPAddresses
ao 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
Adicionando objetos personalizados ao My
namespace
Embora o My
namespace forneça soluções para muitas tarefas de programação comuns, você pode encontrar tarefas que o My
namespace não aborda. Por exemplo, seu aplicativo pode acessar serviços de diretório personalizados para dados do usuário ou seu aplicativo pode usar assemblies que não são instalados por padrão com o Visual Basic. Você pode estender o My
namespace para incluir soluções personalizadas para tarefas comuns específicas do seu ambiente. O My
namespace pode ser facilmente estendido para adicionar novos membros para atender às crescentes necessidades do aplicativo. Além disso, você pode implantar suas My
extensões de namespace para outros desenvolvedores como um modelo do Visual Basic.
Adicionando membros ao My
namespace
Como My
é um namespace como qualquer outro namespace, você pode adicionar propriedades de nível superior a ele apenas adicionando um módulo e especificando um Namespace
de My
. Anote o módulo com o HideModuleName
atributo como mostrado no exemplo a seguir. O HideModuleName
atributo garante que o IntelliSense não exibirá o nome do módulo quando exibir os My
membros do namespace.
Namespace My
<HideModuleName()>
Module MyCustomModule
End Module
End Namespace
Para adicionar membros ao My
namespace, adicione propriedades conforme necessário ao módulo. Para cada propriedade adicionada ao My
namespace, adicione um campo privado do tipo ThreadSafeObjectProvider(Of T)
, onde o tipo é o tipo retornado pela sua propriedade personalizada. Este campo é usado para criar instâncias de objeto thread-safe a serem retornadas pela propriedade chamando o GetInstance
método. Como resultado, cada thread que está acessando a propriedade estendida recebe sua própria instância do tipo retornado. O exemplo a seguir adiciona uma propriedade chamada SampleExtension
que é do tipo SampleExtension
ao My
namespace:
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
Adicionando eventos a objetos personalizados My
Você pode usar o My.Application
objeto para expor eventos para seus objetos personalizados My
estendendo a MyApplication
classe parcial no My
namespace. Para projetos baseados no Windows, você pode clicar duas vezes no nó Meu Projeto no Gerenciador de Soluções. No Visual Basic Project Designer, clique na guia Aplicativo e, em seguida, clique no botão Exibir Eventos do Aplicativo. Um novo arquivo chamado ApplicationEvents.vb será criado. Ele contém o seguinte código para estender a MyApplication
classe:
Namespace My
Partial Friend Class MyApplication
End Class
End Namespace
Você pode adicionar manipuladores de eventos para seus objetos personalizados My
adicionando manipuladores de eventos personalizados à MyApplication
classe. Os eventos personalizados permitem que você adicione código que será executado quando um manipulador de eventos for adicionado, removido ou o evento for gerado. Observe que o código de um evento personalizado é executado somente se o AddHandler
código for adicionado por um usuário para manipular o evento. Por exemplo, considere que o SampleExtension
objeto da seção anterior tem um Load
evento para o qual você deseja adicionar um manipulador de eventos personalizado. O exemplo de código a seguir mostra um manipulador de eventos personalizado chamado SampleExtensionLoad
que será invocado quando o My.SampleExtension.Load
evento ocorrer. Quando o código é adicionado para manipular o novo My.SampleExtensionLoad
evento, a AddHandler
parte desse código de evento personalizado é executada. O MyApplication_SampleExtensionLoad
método é incluído no exemplo de código para mostrar um exemplo de um manipulador de eventos que manipula o My.SampleExtensionLoad
evento. Observe que o SampleExtensionLoad
evento estará disponível quando você selecionar a opção Meus eventos de aplicativo na lista suspensa à esquerda acima do Editor de Códigos quando estiver editando o arquivo 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
Orientações de design
Ao desenvolver extensões para o My
namespace, use as seguintes diretrizes para ajudar a minimizar os custos de manutenção de seus componentes de extensão:
- Inclua apenas a lógica de extensão. A lógica incluída na extensão de
My
namespace deve incluir apenas o código necessário para expor a funcionalidade necessária noMy
namespace. Como sua extensão residirá em projetos de usuário como código-fonte, atualizar o componente de extensão incorre em um alto custo de manutenção e deve ser evitado, se possível. - Minimize as suposições do projeto. Ao criar suas extensões do namespace, não assuma um conjunto de referências, importações no nível do projeto ou configurações específicas do
My
compilador (por exemplo,Option Strict
off). Em vez disso, minimize as dependências e qualifique totalmente todas as referências de tipo usando aGlobal
palavra-chave. Além disso, certifique-se de que a extensão compila comOption Strict
on para minimizar erros na extensão. - Isole o código da extensão. Colocar o código em um único arquivo torna sua extensão facilmente implantável como um modelo de item do Visual Studio. Para obter mais informações, consulte "Empacotando e implantando extensões" posteriormente neste tópico. Colocar todo o código de extensão de
My
namespace em um único arquivo ou uma pasta separada em um projeto também ajudará os usuários a localizar a extensão deMy
namespace.
Projetando bibliotecas de classes para My
Como é o caso com a maioria dos modelos de objeto, alguns padrões de design funcionam bem no My
namespace e outros não. Ao projetar uma extensão para o My
namespace, considere os seguintes princípios:
- Métodos sem estado. Os métodos no
My
namespace devem fornecer uma solução completa para uma tarefa específica. Certifique-se de que os valores de parâmetro que são passados para o método forneçam toda a entrada necessária para concluir a tarefa específica. Evite criar métodos que dependem do estado anterior, como conexões abertas com recursos. - Instâncias globais. O único estado que é mantido no
My
namespace é global para o projeto. Por exemplo,My.Application.Info
encapsula o estado que é compartilhado em todo o aplicativo. - Tipos de parâmetros simples. Mantenha as coisas simples, evitando tipos de parâmetros complexos. Em vez disso, crie métodos que não usem nenhuma entrada de parâmetro ou que usem tipos de entrada simples, como cadeias de caracteres, tipos primitivos e assim por diante.
- Métodos de fábrica. Alguns tipos são necessariamente difíceis de instanciar. Fornecer métodos de fábrica como extensões para o
My
namespace permite que você descubra e consuma mais facilmente tipos que se enquadram nessa categoria. Um exemplo de um método de fábrica que funciona bem éMy.Computer.FileSystem.OpenTextFileReader
o . Há vários tipos de fluxo disponíveis no .NET Framework. Ao especificar arquivos de texto especificamente, oOpenTextFileReader
ajuda o usuário a entender qual fluxo usar.
Estas diretrizes não excluem princípios gerais de design para bibliotecas de classes. Em vez disso, são recomendações otimizadas para desenvolvedores que estão usando o Visual Basic e o My
namespace. Para obter princípios gerais de design para a criação de bibliotecas de classes, consulte Framework Design Guidelines.
Empacotamento e implantação de extensões
Você pode incluir My
extensões de namespace em um modelo de projeto do Visual Studio ou pode empacotar suas extensões e implantá-las como um modelo de item do Visual Studio. Quando você empacota suas My
extensões de namespace como um modelo de item do Visual Studio, você pode aproveitar os recursos adicionais fornecidos pelo Visual Basic. Esses recursos permitem que você inclua uma extensão quando um projeto faz referência a um assembly específico ou permite que os usuários adicionem explicitamente sua My
extensão de namespace usando a página Minhas extensões do Designer de Projeto do Visual Basic.
Para obter detalhes sobre como implantar My
extensões de namespace, consulte Empacotando e implantando minhas extensões personalizadas.