Estendendo o namespace My
no Visual Basic
O namespace My
no Visual Basic expõe propriedades e métodos que permitem a você aproveitar facilmente o poder do .NET Framework. O namespace My
simplifica problemas comuns de programação, geralmente reduzindo uma tarefa difícil para uma única linha de código. Além disso, o namespace My
é totalmente extensível para que você possa personalizar o comportamento de My
e adicionar novos serviços à sua hierarquia para se adaptar às necessidades específicas do aplicativo. Este tópico discute como personalizar os membros existentes do namespace My
e como adicionar suas próprias classes personalizadas ao namespace My
.
Personalizando membros de namespace existentes My
O namespace My
do Visual Basic expõe informações usadas com frequência sobre seu aplicativo, seu computador e muito mais. Para obter uma lista completa dos objetos no namespace My
, confira Minha Referência. Talvez seja necessário personalizar os membros existentes do namespace My
para que eles correspondam melhor às necessidades do aplicativo. Qualquer propriedade de um objeto no namespace My
que não seja somente leitura pode ser definida como um valor personalizado.
Por exemplo, suponha que você use frequentemente o objeto My.User
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 usuários dentro da empresa. Nesse cenário, você pode substituir o valor padrão da propriedade My.User.CurrentPrincipal
por uma instância do seu próprio objeto principal personalizado, conforme mostrado no exemplo a seguir:
My.User.CurrentPrincipal = CustomPrincipal
Definir a propriedade CurrentPrincipal
no objeto My.User
altera a identidade sob a qual o aplicativo é executado. O objeto My.User
, por sua vez, retorna informações sobre o usuário recém-especificado.
Adicionando membros a objetos My
Os tipos retornados de My.Application
e My.Computer
são definidos como classes Partial
. Portanto, você pode estender os objetos My.Application
e My.Computer
, criando uma classe Partial
chamada MyApplication
ou MyComputer
. A classe não pode ser uma classe Private
. Se você especificar a classe como parte do namespace My
, poderá adicionar propriedades e métodos que serão incluídos com os objetos My.Application
ou My.Computer
.
O exemplo a seguir adiciona uma propriedade chamada DnsServerIPAddresses
ao 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
Adicionando objetos personalizados ao namespace My
Embora o namespace My
forneça soluções para muitas tarefas comuns de programação, você pode encontrar tarefas que o namespace My
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 namespace My
para incluir soluções personalizadas para tarefas comuns específicas ao seu ambiente. O namespace My
pode ser facilmente estendido para adicionar novos membros a fim de atender às necessidades crescentes do aplicativo. Além disso, você pode implantar suas extensões de namespace My
para outros desenvolvedores como um modelo do Visual Basic.
Adicionando membros ao namespace My
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
. Anotar o módulo com o atributo HideModuleName
, conforme mostrado no exemplo a seguir. O atributo HideModuleName
garante que o IntelliSense não exibirá o nome do módulo quando exibir os membros do namespace My
.
Namespace My
<HideModuleName()>
Module MyCustomModule
End Module
End Namespace
Para adicionar membros ao namespace My
, adicione propriedades conforme necessário ao módulo. Para cada propriedade adicionada ao namespace My
, adicione um campo de tipo ThreadSafeObjectProvider(Of T)
privado, onde o tipo é o tipo retornado por sua propriedade personalizada. Esse campo é usado para criar instâncias de objeto thread-safe a serem retornadas pela propriedade chamando o método GetInstance
. 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 namespace 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
Adicionando eventos a objetos personalizados My
Você pode usar o objeto My.Application
para expor eventos para seus objetos personalizados My
, estendendo a classe parcial MyApplication
no namespace My
. Para projetos baseados no Windows, você pode clicar duas vezes no nó Meu Projeto para seu projeto no Gerenciador de Soluções. No Designer de Projeto do Visual Basic, clique na guia Aplicativo e 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 classe MyApplication
:
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 à classe MyApplication
. Eventos personalizados permitem adicionar código que será executado quando um manipulador de eventos for adicionado, removido ou o evento for gerado. Observe que o código AddHandler
de um evento personalizado é executado somente se o código for adicionado por um usuário para manipular o evento. Por exemplo, considere que o objeto SampleExtension
da seção anterior tem um evento Load
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 evento My.SampleExtension.Load
ocorrer. Quando o código é adicionado para lidar com o novo evento My.SampleExtensionLoad
, a parte AddHandler
desse código de evento personalizado é executada. O método MyApplication_SampleExtensionLoad
é incluído no exemplo de código para mostrar um exemplo de um manipulador de eventos que manipula o evento My.SampleExtensionLoad
. Observe que o evento SampleExtensionLoad
estará disponível quando você selecionar a opção Meus Eventos de Aplicativo na lista suspensa à esquerda acima do Editor de Código quando você 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
Diretrizes de design
Ao desenvolver extensões para o namespace My
, use as seguintes diretrizes para ajudar a minimizar os custos de manutenção dos componentes de extensão:
- Inclua apenas a lógica de extensão. A lógica incluída na extensão do namespace
My
deve incluir apenas o código necessário para expor a funcionalidade necessária no namespaceMy
. Como sua extensão residirá em projetos de usuário como código-fonte, a atualização do componente de extensão incorre em um alto custo de manutenção e deve ser evitada, se possível. - Minimize as suposições do projeto. Ao criar suas extensões do namespace
My
, não suponha um conjunto de referências, importações no nível do projeto ou configurações específicas do compilador (por exemplo,Option Strict
desativado). Em vez disso, minimize as dependências e qualifique totalmente todas as referências de tipo usando a palavra-chaveGlobal
. Além disso, verifique se a extensão é compilada comOption Strict
para minimizar erros na extensão. - Isole o código de 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, confira "Empacotamento e implantação de extensões" posteriormente neste tópico. Colocar todo o código de extensão do namespace
My
em um único arquivo ou uma pasta separada em um projeto também ajudará os usuários a localizar a extensão do namespaceMy
.
Criando bibliotecas de classes para My
Como é o caso da maioria dos modelos de objeto, alguns padrões de design funcionam bem no namespace My
e outros não. Ao criar uma extensão para o namespace My
, considere os seguintes princípios:
- Métodos sem estado. Os métodos no namespace
My
devem fornecer uma solução completa para uma tarefa específica. Verifique se os valores de parâmetro que são passados para o método fornecem todas as entradas necessárias 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 namespace
My
é global para o projeto. Por exemplo,My.Application.Info
encapsula o estado compartilhado em todo o aplicativo. - Tipos de parâmetro simples. Mantenha as coisas simples evitando tipos de parâmetros complexos. Em vez disso, crie métodos que não levem 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 namespace
My
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
. 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.
Essas diretrizes não impedem 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 namespace My
. Para obter princípios gerais de design para criar bibliotecas de classes, confira Diretrizes de Design da Estrutura.
Empacotar e implantar extensões
Você pode incluir extensões de namespace My
em um modelo de projeto do Visual Studio ou empacotar suas extensões e implantá-las como um modelo de item do Visual Studio. Ao empacotar suas extensões de namespace My
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 fizer referência a um assembly específico ou permitem que os usuários adicionem explicitamente sua extensão de namespace My
usando a página Minhas Extensões do Designer de Projeto do Visual Basic.
Para obter detalhes sobre como implantar extensões de namespace My
, confira Empacotando e implantando minhas extensões personalizadas.