Skip Navigation Links



Translate this page now :



»Programação
»Programação.NET
»Banco de Dados
»Webdesign
»Office
» Certificações Microsoft 4
»Treinamentos4
»Programação 4
»Webdesign«
»Office & User Tips«
»Grupos de UsuĆ”rios
»CĆ©lulas AcadĆŖmicas«

O melhor teclado da microsoft
Você já está cadastrado e participa do grupo de usuários de sua cidade ? Se não, comente o porque.
 
 
FaƧa um pequeno teste com 10 questƵes de VB
.:.
Teste seus conhecimentos em Visual Basic, SQL Server e ASP 3.0 com nossas provas on-line
.:.
Aprimore seus conhecimentos em programaĆ§Ć£o com nosso treinamento on-line de lĆ³gica de programaĆ§Ć£o
.:.
Veja nosso calendƔrio de treinamentos
Gostou da PƔgina?
Então

para um amigo!

Pesquisa personalizada
Pesquisar Dicas:

 







Criando configurações personalizadas para arquivos .config

Baixe o código fonte

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 :

<Funcionarios>
<Salario Minimo="300" MinimoIR="5000" />
<Impostos>
<addTx name="INSS" value="0.08" />
</Impostos>
</Funcionarios>

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 :

IsDefaultCollection : Indica que a propriedade deve ser tratada como a defaultCollection do elemento em que está contida (instruções Add, Remove, são adicionadas nesta propriedade)
IsKey : Indica se esta propriedade será ou não a "chave primária" deste elemento. Útil em especial quando estiver lidando com coleções.
IsRequired : Indica se o atributo é obrigatório ou não.
DefaultValue : Indica o valor default do atributo, caso não seja informado - o que só tem sentido no caso de não ser obrigatório

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 :

StringValidator : Validação de strings
RegExStringvalidator : Validação de string com uso de expressões regulares
LongValidator : Validação de valores long
IntegerValidator : Validação de inteiros

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 :

<configSections>
<section name ="Funcionarios" type="libConfig.FuncionariosSection, libConfig"/>
</configSections>

Mais abaixo na tag configuration, adicione o seguinte elemento :

<Funcionarios>
<Salario Minimo="300" MinimoIR="5000" />
<Impostos>
<addTx name="INSS" value="0.08" />
</Impostos>
</Funcionarios>

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>
<Salario Minimo="300" MinimoIR="5000" />
<Impostos>
<addTx name="INSS" value="0.08" />
<addTx name="IR" value="0.12" />
</Impostos>
</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" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:include schemaLocation="DotNetConfig.xsd"/>
<xs:include schemaLocation="Funcionarios.xsd"/>
</xs:schema>

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.

 

 

 

 





Envie seus comentįrios sobre este artigo

Nome :

E-mail :

Comentários :


Avise-me quando houverem novos comentįrios nesta pįgina

Veja abaixo os comentários já enviados :

Nome : Dennes Torres E-Mail : dennes@bufaloinfo.com.br

No código fonte, ficou faltando um pequeno trecho na classe decimalValidator :

Public Overrides Function CanValidate(ByVal type As System.Type) As Boolean
If type Is GetType(System.Decimal) Then
Return True
End If
Return MyBase.CanValidate(type)
End Function

Esse trecho determina que a classe decimalValidator pode validar o tipo decimal.

[]'s

Nome : takeo kokubo E-Mail : kokubotakeo@ajato.com.br
Quero dizer que este artigo é bem legal e didático. Através do forum msdn-br
e dicas do Dennes, consigo entender melhor esse negocio de configuração.
O artigo não cita o nome do artigo, porem, seria interessante para nós programadores iniciantes ou que estejamos a meio caminho, se tiver outros artigos, sobre o assunto, com base neste artigo, como se fosse uma continuação. Dar mais exemplos, por ex: a utilização das várias coleções que existem no framework.
Dar exemplo de section mais complexas, tais como grupo de sections e sub-grupos.
fechando com chave de ouro com artigo sobre criptografia do arquivo de configuração, são ideias para futuros artigos que nos ajudarão a ganhar tempo e na nossa jornada. Valeu
takeo

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
Conheça mais sobre o nosso site :

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::



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