Arquivo

Posts Tagged ‘sharpconfig’

Windows Forms e configuração local com SharpConfig

Em aplicações, é comum criar configurações locais, que ficarão salvas na própria máquina cliente.

Alternativa:

O .NET conta com o arquivo de configurações nativo. Esse arquivo que pode ser acessado no solution explorer, clicar com o botão direito no projeto, depois properties, e settings.

Na tela de edição de configurações, você pode digitar livremente, e definir um nome para a configuração, um tipo, escopo, e um valor default.

É necessário pré-cadastrar todas as configurações que estarão disponíveis na sua aplicação.

Para acessar e salvar as configurações nativas usamos o seguinte código:

Properties.Settings.Default["NomeImpressora"] = "Salvar para PDF";
Properties.Settings.Default.Save(); // Persiste as configurações

Problema da alternativa:

Essa configuração nativa é interessante até o momento em que você precisa atualizar sua aplicação. Se você ativar um procedimento de atualização automática na sua aplicação, e por engano sobrescrever o aplicativo de config, que é gerado automaticamente pelo build do .net, perderá as configurações salvas. E o pior a meu ver: esse modelo de arquivo de configuração, te exige criar previamente as configurações; não dá pra criar on-the-fly.

Solução:

SharpConfigLogo.png

Encontrei na biblioteca SharpConfig a solução para minhas necessidades. Ele salva suas configurações no formato de arquivo INI do windows.

[General]
# a comment
SomeString = Hello World!
SomeInteger = 10 # an inline comment
SomeFloat = 20.05
SomeBoolean = true
SomeArray = { 1, 2, 3 }
Day = Monday

[Person]
Name = Peter
Age = 50

Aplicação prática:

a) Criei uma classe estática para ser a camada de abstração que permitirá acesso a minhas configurações locais.

public static class LocalConfig
    {
        public static Configuration Configuration;

        public static void Initialize()
        {
            try
            {
                if (!File.Exists("localConfig.ini"))
                {
                    // If file not exists, initialize an empty one.
                    var memoryConfig = new Configuration();
                    memoryConfig.SaveToFile("localConfig.ini");
                }

                LocalConfig.Configuration = Configuration.LoadFromFile("localConfig.ini");
            }
            catch (Exception e)
            {
                MessageBox.Show("Falha ao inicializar configuração. Msg: " + e);
                throw;
            }
        }

        public static string DefaultPrinterName
        {
            get { return Configuration["General"]["DefaultPrinterName"].StringValue; }
            set { Configuration["General"]["DefaultPrinterName"].StringValue = value; }
        }
    }

Perceba que tenho o método Initialize(), esse método é invocado na inicialização da minha aplicação, no Program.cs. Como parte do processo de inicialização, garanto que existe na pasta da aplicação o arquivo “localConfig.ini”, caso não exista eu inicializo uma configuração vazia.

A propriedade estática DefaultPrinterName, é responsável por salvar a configuração na section General, e propriedade DefaultPrinterName. Veja que interceptei o getter e o setter para permitir carregamento e salvamento automático e imediato.

b) Criei uma tela que permite edição das configurações:

Ao clicar em Salvar, é executado o código abaixo:

private void barbtnSave_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        { 
            // load fields
            LocalConfig.DefaultPrinterName = lkpedtPrinterName.Text;

            this.DialogResult = DialogResult.OK;
            this.Close();
        }

Conclusão:

Há configurações, que devem ser armazenadas no banco de dados. Mas há configurações locais, que devem ser refeitas, quando o sistema é re-instalado. Entendo que a opção da Impressora Padrão é uma dessas configurações, e para esses casos a biblioteca SharpConfig atende as necessidades.

É compatível com as versões mais recentes do .net framework, e atualização relativamente recente.

Viagem e Voo

Dicas para viagens, férias e voos nacionais e internacionais

Ivan Guimarães Meirelles

Analista Desenvolvedor

Void Podcast

Vazio e sem retorno de valor

Elemar DEV

Negócios, tecnologia e desenvolvimento

2,000 Things You Should Know About WPF

Everything a WPF Developer Needs to Know, in Bite-Sized Chunks

Gabriel RB.net

Blog técnico, com dicas, códigos, novidades e problemas do dia-a-dia programando.

Alexandre Valente's Blog

Experiências em tecnologia e assuntos diversos

%d blogueiros gostam disto: