![]() |
||||||||
|
||||||||
|
com exemplos em VB |
Componente para deixar forms em Vb semelhantes às telas do winnamp |
Componente para colocar sua aplicação VB no Systray |
Componente para transformar sua aplicação VB em serviço |
Ferramentas úteis para quem usa Olap Server |
![]() |
|
||||||||
![]()
Pesquisa personalizada
Criando configurações personalizadas para arquivos .config Os arquivos de configuração do .NET fornecem um excelente meio para mantermos as configurações de nossa aplicação. No .NET 1.1, utilizávamos as dynamic properties para guardar configurações diretamente no AppSettings, em especial as connectionStrings. No .NET 2.0 as connectionStrings ganharam área própria para elas nos arquivos .config, enquanto que o AppSettings continua existindo para outras configurações personalizadas. Eventualmente, porém, desejaremos garantir que uma determinada configuração, que estará sempre presente em nossas aplicações, seja gravada de forma consistente, ou seja, sempre da mesma forma, no web.config. Para isso podemos criar configurações personalizadas para a nossa aplicação, passando a inserir novas tags no web.config. No framework .NET temos duas base class para a criação de configurações personalizadas : ConfigurationSection e ConfigurationElement. ConfigurationElement é a base de todo elemento de configuração nos arquivos .CONFIG. Já a configurationSection herda características de configurationElement e define uma seção e configuração no web.config. Sempre que desejarmos guardar algo no web.config, devemos definir uma configurationSection. Nos casos simples, essa section irá conter apenas atributos, mas nos casos mais complexos esta section poderá conter outros elementos de configuração (configurationElement) e até mesmo outras sections. Todas as chaves de configuração personalizadas ficarão localizadas dentro da tag <configuration> . O primeiro elemento dentro da tag configuration precisa ser configSections, no qual declaramos a existência de chaves de configuração personalizadas e indicamos qual assembly contém a classe de tratamento dessa chave. Vamos criar uma chave de configuração de exemplo para demonstrarmos os recursos disponíveis. Vamos supor ser a configuração para guardar alguns parâmetros de negócio de uma aplicação de folha de pagamento. Veja como ficará a configuração :
Temos então o valor de salário mínimo, o valor mínimo do salário para aplicação de IR e uma coleção de impostos. Começamos criando um projeto do tipo class library, chamado libConfig. Vamos criar uma classe chamada FuncionariosSection. Public Class FuncionariosSection Inherits ConfigurationSection
End Class A classe funcionario tem duas propriedades, o Salario e os impostos. Antes de definirmos as propriedades, vamos criar o elemento salário, adicionando uma nova classe, SalarioElement Public Class SalarioElement Inherits ConfigurationElement
End Class Precisamos definir no SalarioElement as propriedades Minimo e MinimoIR. Não definimos variáveis, só as propriedades. Como herda de ConfigurationElement, SalarioElement tem uma coleção de atributos que utilizaremos no set e get, veja como fica : Public Class SalarioElement Inherits ConfigurationElement
Public Property Minimo() As Decimal Get Return (Me("Minimo")) End Get Set(ByVal value As Decimal) Me("Minimo") = value End Set End Property
Public Property MinimoIR() As Decimal Get Return (Me("MinimoIR")) End Get Set(ByVal value As Decimal) Me("MinimoIR") = value End Set End Property
End Class Para que estas propriedades sejam compreendidas como atributos deste elemento precisamos adicionar o atributo ConfigurationProperty. Veja como fica : Public Class SalarioElement Inherits ConfigurationElement
<ConfigurationProperty("Minimo", IsRequired:=True)> _ Public Property Minimo() As Decimal Get Return (Me("Minimo")) End Get Set(ByVal value As Decimal) Me("Minimo") = value End Set End Property
<ConfigurationProperty("MinimoIR", IsRequired:=True)> _ Public Property MinimoIR() As Decimal Get Return (Me("MinimoIR")) End Get Set(ByVal value As Decimal) Me("MinimoIR") = value End Set End Property End Class Ambos foram marcados com o IsRequired, ou seja, são atributos obrigatórios neste elemento. Veja os outros parâmetros de ConfigurationProperty :
Podemos validar dados destas propriedades utilizando atributos criados especialmente para validar propriedades de configuração. Os seguintes atributos de validação existem no framework .NET :
caso nenhum desses validadores sirva, podemos criar um novo validador a partir da classe ConfigurationValidatorBase. Podemos, por exemplo, criar um validador para validar valores decimals. Para criar um validator devemos criar uma classe derivada de ConfigurationValidatorBase e implementar o método Validate. Veja como fica essa implementação : Imports System.Configuration Public Class DecimalValidator Inherits ConfigurationValidatorBase
Public Overrides Sub Validate(ByVal value As Object) Dim d As Decimal Try d = value Catch ex As Exception Throw New ApplicationException("A informação não é decimal") End Try End Sub End Class Para que possamos fazer uso deste validador, precisamos criar também um atributo para ele, que permitirá a sua aplicação em nossas propriedades. O atributo é criado a partir da classe ConfigurationValidatorAttribute. Herdamos desta classe e fazemos o Override da propriedade ValidatorInstance, na qual devolvemos uma instância do nosso DecimalValidator. Veja como fica : mports System.Configuration Public Class DecimalValidatorAttribute Inherits ConfigurationValidatorAttribute
Public Overrides ReadOnly Property ValidatorInstance() As System.Configuration.ConfigurationValidatorBase Get Return New DecimalValidator End Get End Property End Class Caso o nosso DecimalValidator necessitasse de parâmetros, poderiamos definir propriedades na classe DecimalValidatorAttribute para receber esses parâmetros. Transmitiriamos os parâmetros no código do Get, para a nova instância gerada. Veja como fica a aplicação deste atributo : <ConfigurationProperty("Minimo", IsRequired:=True), DecimalValidatorAttribute()> _ Public Property Minimo() As Decimal Get Return (Me("Minimo")) End Get Set(ByVal value As Decimal) Me("Minimo") = value End Set End Property
<ConfigurationProperty("MinimoIR", IsRequired:=True), DecimalValidatorAttribute()> _ Public Property MinimoIR() As Decimal Get Return (Me("MinimoIR")) End Get Set(ByVal value As Decimal) Me("MinimoIR") = value End Set End Property Agora que já temos nossa classe SalarioElement corretamente definida, vamos criar na classe FuncionarioConfiguration o elemento Salario. É bem simples, veja como fica : <ConfigurationProperty("Salario", IsRequired:=True)> _ Public Property Salario() As SalarioElement Get Return (Me("Salario")) End Get Set(ByVal value As SalarioElement) Me("Salario") = value End Set End Property Com o elemento Salario configurado, fica faltando nosso elemento Impostos. Este elemento é uma coleção de itens. Existem várias classes de coleção de elementos já definidas pelo framework e que podemos estar utilizando, afinal, cada conjunto de configurações dos arquivos .CONFIG possui uma classe para gerencia-lo e muitos são do tipo collection. Para coleções simples temos a classe NameValueConfigurationCollection . Essa classe irá conter elementos do tipo NameValueConfigurationElement, basicamente com um nome e valor. Se desejarmos elementos mais personalizados, com diversos atributos, então teremos que criar uma coleção personalizada. Mas no nosso caso vamos utilizar esta coleção padrão. Primeiramente criamos a propriedade utilizando este tipo, veja : Public Property Impostos() As NameValueConfigurationCollection Get Return (Me("Impostos")) End Get Set(ByVal value As NameValueConfigurationCollection) Me("Impostos") = value End Set End Property Além de configurar esta propriedade com o atributo ConfigurationProperty, iremos também configura-la com o atributo ConfigurationCollection, indicando que trata-se de uma coleção. Veja como fica : <ConfigurationProperty("Impostos", _ IsDefaultCollection:=False), _ ConfigurationCollection(GetType(NameValueConfigurationCollection), _ AddItemName:="addTx", _ ClearItemsName:="clearTxs", _ RemoveItemName:="RemoveTx")> _ Public Property Impostos() As NameValueConfigurationCollection Get Return (Me("Impostos")) End Get Set(ByVal value As NameValueConfigurationCollection) Me("Impostos") = value End Set End Property No atributo ConfigurationCollection, além de indicar o tipo de coleção que estamos utilizando indicamos também o nome das tags que serão utilizadas no .config para manipular a coleção. Para exemplificar, utilizei nomes diferentes do padrão, para vocês observarem o resultado. Pronto, agora temos nossa classe, FuncionarioConfig, pronta, podemos então utiliza-la em outro projeto. Vamos criar um projeto windows e testar o uso desta classe. Adicione um novo projeto windows na solução Faça uma referência ao projeto libConfig Clicando com o botão direito no projeto, utilize o Add->New item e adicione um Application Configuration File (App.Config) Abra o app.config e, como primeiro item dentro de configuration, adicione o seguinte :
Mais abaixo na tag configuration, adicione o seguinte elemento :
No formulário, adicione um botão. No click do botão, programe o seguinte : Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim sec As libConfig.FuncionariosSection sec = ConfigurationManager.GetSection("Funcionarios")
MsgBox(sec.Salario.Minimo) End Sub Observe como nossa seção Funcionarios será localizada dentro do App.config, retornará como uma instância de FuncionariosSection e nos permitirá acessar os dados através de suas propriedades. Agora que temos nossa configuração personalizada, o próximo passo é conseguirmos que o visual studio forneça intelisence para esta configuração. Vamos fazer este procedimento passo a passo : 1) Crie um arquivo .XML simples dentro do projeto e coloque sua chave (Funcionarios) nele. Como um dos elementos é uma coleção, você precisará adicionar mais um imposto, garantindo que a coleção terá no mínimo 2 elementos. <Funcionarios>
2) Utilizando o menu XML, peça para ser gerado um schema. O schema é um documento XML que contém o formato, a síntaxe de um documento XML. A geração automática não é necessariamente perfeita, então você precisará analisar o resultado e verificar se está correto, interpretando a sintaxe do schema.
3) Grave o schema em program files\microsoft visual studio 8\xml\schemas com o nome de funcionarios.XSD 4) Crie no notepad um arquivo xml com o conteúdo abaixo. DotNetConfig.xsd contém todo o schema de configuração do visual studio enquanto que Funcionarios.xsd é sua configuração personalizada. Como pode observar, estamos unindo os 2. Salve na mesma pasta como config.xsd <?xml version="1.0" encoding="utf-8" ?> 5) Altere o arquivo catalog.xml (não é xsd, é xml!) que encontra-se na mesma pasta . Neste arquivo existe um vinculo da extenssão .config com o arquivo DotNetConfig.xsd. Mude o vinculo para seu novo arquivo config.xsd O trecho alterado fica da seguinte forma : <Association extension="config" schema="%VsInstallDir%/xml/schemas/config.xsd"/>
Pronto, feche e abra o visual studio novamente e o intelissense para sua nova seção já estará funcionando.
|
||||||||
Veja abaixo os comentários já enviados :
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: Quer
saber mais?
Faça um curso na Búfalo Informática, Treinamento e Consultoria e Prepare-se para o Mercado! Veja o que a Búfalo tem para você. |
� Búfalo Informática,
Treinamento e Consultoria -
Rua Álvaro Alvim, 37 Sala 920 - Cinelândia - Rio de Janeiro / RJ
Tel.: (21)2262-1368 (21) 9240-5134 (21) 9240-7281 e-Mail: contato@bufaloinfo.com.br