Arquitetura das Configurações do Aplicativo

Descreve como o recurso de Configurações do Aplicativo funciona e explora recursos avançados da arquitetura, como configurações agrupadas e chaves de configurações.

A arquitetura do aplicativo configurações oferece suporte à definição de configurações rígidas com escopo do aplicativos ou do usuário e gravação das configurações entre as sessões do aplicativo.A arquitetura oferece um mecanismo de persistência padrão para salvar as configurações e carregá-las do sistema de arquivos local.A arquitetura também define interfaces para fornecer um mecanismo personalizado de persistência.

Interfaces são fornecidas para permitir que componentes personalizados mantenham suas próprias configurações quando eles são hospedados em um aplicativo.Usando chaves de configurações, componentes podem manter as configurações para várias instâncias do componente separadas.

Definindo configurações

A arquitetura de configurações do aplicativo é usada em ambos ASP.NET e Formulários do Windows e ela contém um número de classes base que são compartilhados entre os dois ambientes.O mais importante é SettingsBase, que fornece acesso às configurações através de um conjunto e fornece métodos de baixo nível para carregar e salvar as configurações.Cada ambiente implementa sua própria classe derivada de SettingsBase para fornecer funcionalidades de configurações adicionais para esse ambiente.Em um aplicativo baseado em Formulários do Windows, todas as configurações do aplicativo devem ser definidas em uma classe derivada da classe ApplicationSettingsBase, que adiciona seguinte funcionalidade à classe base:

  • Operações de carregamento e salvamento de nível mais alto.

  • Suporte para configurações no escopo do usuário

  • Reversão das configurações do usuário em padrões predefinidos

  • Atualização das configurações de uma versão anterior do aplicativo

  • Validação das configurações, antes que sejam alteradas ou salvos

As configurações podem ser descritas usando um número de atributos definidos no namespace System.Configuration; estes são descritos em Atributos de Configurações do Aplicativo.Quando você define uma configuração, você deverá aplicá-la com qualquer um de ApplicationScopedSettingAttribute ou UserScopedSettingAttribute, que descrevem se a configuração se aplica ao aplicativo inteiro ou apenas para o usuário atual.

O código exemplo a seguir define uma classe de configurações personalizadas com uma única configuração, BackgroundColor.

Imports System.Configuration

Public Class MyAppSettings
    Inherits ApplicationSettingsBase
    <UserScopedSetting()> _
    <DefaultSettingValue("white")> _
    Public Property BackgroundColor() As Color
        Get
            BackgroundColor = Me("BackgroundColor")
        End Get

        Set(ByVal value As Color)
            Me("BackgroundColor") = value
        End Set
    End Property
End Class
using System;
using System.Configuration;
using System.Drawing;

public class MyUserSettings : ApplicationSettingsBase
{
    [UserScopedSetting()]
    [DefaultSettingValue("white")]
    public Color BackgroundColor
    {
        get
        {
            return ((Color)this["BackgroundColor"]);
        }
        set
        {
            this["BackgroundColor"] = (Color)value;
        }
    }
}

Persistência das configurações

A classe ApplicationSettingsBase não persiste ou carrega configurações por si mesma; este trabalho cai para o provedor de configurações, uma classe que é derivada de SettingsProvider.Se um classe derivada de ApplicationSettingsBase não especificar um provedor configurações por meio de SettingsProviderAttribute, então o provedor padrão, LocalFileSettingsProvider, será usado.

O sistema de configuração que foi originalmente lançado com o .NET Framework oferece suporte ao fornecimento de dados de configuração estática do aplicativo através de ambos o o arquivo Machine.config do computador local ou em um arquivo app.exe.config que você distribui com seu aplicativo.A classe LocalFileSettingsProvider expande esse suporte nativo nos seguintes aspectos:

  • Configurações de escopo do aplicativo podem ser armazenadas em arquivos Machine.config ou app.exe.config.Machine.config é sempre leitura somente, enquanto app. exe.config é restrito por considerações de segurança para somente leitura na maioria dos aplicativos.

  • Configurações de escopo do usuário podem ser armazenadas em arquivos app.exe.config, nesse caso, eles são tratados como padrões estáticos.

  • Configurações da escopo do usuário não padrão são armazenadas em um arquivo novo, usuário.config, onde user é o nome de usuário da pessoa executando o aplicativo no momento.Você pode especificar um padrão para uma configuração de escopo do usuário com DefaultSettingValueAttribute.Como frequentemente configurações no escopo do usuário mudam durante a execução do aplicativo, user.config é sempre de leitura/gravação.

Todos os três arquivos de configuração armazenam configurações no formato XML.O elemento XML de nível mais alto para configurações de escopo do aplicativo é <appSettings>, enquando <userSettings> é usado para configurações no escopo do usuário.Um app.exe.config que contém ambas as configurações de escopo do aplicativo e padrões para configurações no escopo do usuário teria esta aparência:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
            <section name="WindowsApplication1.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
        </sectionGroup>
        <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
            <section name="WindowsApplication1.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" />
        </sectionGroup>
    </configSections>
    <applicationSettings>
        <WindowsApplication1.Properties.Settings>
            <setting name="Cursor" serializeAs="String">
                <value>Default</value>
            </setting>
            <setting name="DoubleBuffering" serializeAs="String">
                <value>False</value>
            </setting>
        </WindowsApplication1.Properties.Settings>
    </applicationSettings>
    <userSettings>
        <WindowsApplication1.Properties.Settings>
            <setting name="FormTitle" serializeAs="String">
                <value>Form1</value>
            </setting>
            <setting name="FormSize" serializeAs="String">
                <value>595, 536</value>
            </setting>
        </WindowsApplication1.Properties.Settings>
    </userSettings>
</configuration>

Para obter uma definição dos elementos dentro da seção configurações de aplicativo de uma arquivo de configuração, consulte Esquema de configurações do aplicativo.

Vinculação de Configurações

Configurações do aplicativo utiliza a arquitetura associação de dados Formulários do Windows para fornecer uma comunicação bidirecional de atualizações das configurações entre o objeto de configurações e os componentes.Se você usar o Visual Studio para criar configurações do aplicativo e atribuí-las às propriedades de componentes, essas ligações são geradas automaticamente.

Você pode somente vincular uma configuração de aplicativo a um componente que oferece suporte à interface IBindableComponent.Além disso, o componente deve implementar um evento de alteração de uma propriedade acoplada específica, ou notificar as configurações do aplicativo que a propriedade mudou através da interface INotifyPropertyChanged.Se o componente não implementa IBindableComponent e você estiver vinculando o Visual Studio, as propriedades vinculadas serão definidas na primeira vez, mas não serão atualizadas.Se o componente implementa IBindableComponent mas não tem suporte para notificações de alteração de propriedades, a vinculação não atualizará o arquivo de configurações quando a propriedade for alterada.

Alguns componentes dos Formulários do Windows, como ToolStripItem, não suportam vínculos a configurações.

Serialização de Configurações

Quando LocalFileSettingsProvider deve salvar as configurações em disco, ele executa as seguintes ações:

  1. Usa reflexão para examinar todas as propriedades definidas na sua classe derivada ApplicationSettingsBase, localizando aquelas que são aplicadas com qualquer um de ApplicationScopedSettingAttribute ou UserScopedSettingAttribute.

  2. Serializa a propriedade para o disco.Ela primeiro tenta chamar ConvertToString ou ConvertFromString no TypeConverter associado do tipo.Se isto não tiver êxito, ele usará serialização XML.

  3. Determina quais configurações vão em quais arquivos, com base no atributo da configuração.

Se você implementar sua própria classe de configurações, você pode usar o SettingsSerializeAsAttribute para marcar uma configuração para a serialização binária ou personalizada usando a enumeração SettingsSerializeAs.Para obter mais informações sobre criar sua própria classe de configurações no código, consulte Como: Criar configurações do aplicativo.

Localização dos Arquivos de Configuração

O local dos arquivos app.exe.config e usuário .config serão diferentes com base em como o aplicativo está instalado.Para um aplicativo com base em Formulários do Windows copiado para o computador local, app.exe.config residirá no mesmo diretório que o diretório base do arquivo executável principal do aplicativo e usuário.config residirá no local especificado pela propriedade Application.LocalUserAppDataPath.Para um aplicativo instalado por meio de ClickOnce, ambos esses arquivos residirão no diretório de dadosClickOnce abaixo de %InstallRoot%\Documents and settings\ nome do usuário\Local Settings.

O local de armazenamento desses arquivos é um pouco diferente se um usuário tiver habilitado perfis móveis, que permite que um usuário defina configurações do Windows de aplicativos diferentes quando ele ou ela está usando outros computadores em um domínio.Nesse caso, os aplicativos ClickOnce e aplicativos não ClickOnce terão seus arquivos app.exe.config e usuário.config armazenados em %InstallRoot%\Documents and settings\nome de usuário \Application Data.

Para obter mais informações sobre como funciona o recurso de configurações do aplicativo com a nova tecnologia de implantação, consulte ClickOnce e configurações do aplicativo.Para obter mais informações sobre o Diretório de Dados ClickOnce, consulte Acessando local e remoto dados em aplicativos ClickOnce.

Configurações do Aplicativo e Segurança

As configurações do aplicativos são projetadas para trabalhar na confiança parcial, um ambiente restrito que é o padrão para aplicativos de Formulários do Windows hospedados pela Internet ou intranet.Nenhuma permissão especial além da confiança parcial é necessária para usar configurações do aplicativo com o provedor as configurações padrão.

Quando as configurações do aplicativo são usadas em um aplicativo ClickOnce, o arquivo user.config é armazenado no diretório de dados ClickOnce.O tamanho arquivo user.config do aplicativo não pode exceder a cota de diretório de dados definida pelo ClickOnce.Para obter mais informações, consulte ClickOnce e configurações do aplicativo.

Provedores de Configurações Personalizados

Na arquitetura das configurações do aplicativo, há um acoplamento fraco entre a classe envoltório de confirgurações do aplicativo, derivada de ApplicationSettingsBase, e as configurações associadas em provedor ou provedores, derivados de SettingsProvider.Essa associação é definida apenas pelo SettingsProviderAttribute aplicado à classe envoltório ou suas propriedades individuais.Se um provedor de configurações não for especificado explicitamente, o provedor padrão, LocalFileSettingsProvider, é usado.Como resultado, essa arquitetura oferece suporte à criação e uso de provedores de configurações personalizados.

Por exemplo, vamos supor que você queira desenvolver e usar SqlSettingsProvider, um provedor que irá armazenar todas os dados de configurações em um banco de dados Microsoft SQL Server.Sua classe derivada de SettingsProvider deve receber essas informações no seu método Initialize como um parâmetro do tipo System.Collections.Specialized.NameValueCollection.Você então implementaria o método GetPropertyValues para recuperar as configurações do banco de dados e SetPropertyValues para salvá-las.Seu provedor pode usar o SettingsPropertyCollection fornecido a GetPropertyValues para determinar o nome, tipo e escopo da propriedade, bem como quaisquer outros atributos das configurações definidos para essa propriedade.

O provedor precisará implementar uma propriedade e um método cujas implementações podem não ser óbvias.A propriedade ApplicationName é uma propriedade abstrata de SettingsProvider; você deve programá-lo para retornar o seguinte:

Public Overrides Property ApplicationName() As String
    Get
        ApplicationName = System.Reflection.Assembly.GetExecutingAssembly().GetName().Name
    End Get
    Set(ByVal value As String)
        ' Do nothing.
    End Set
End Property
public override string ApplicationName
{
    get
    {
        return (System.Reflection.Assembly.GetExecutingAssembly().GetName().Name);
    }
    set
    {
        // Do nothing.
    }
}

O classe derivada também deve implementar um método Initialize que não leva argumentos e não retorna nenhum valor.Este método não está definido por SettingsProvider.

Finalmente, você implementa IApplicationSettingsProvider no seu provedor para fornecer suporte para atualizar as configurações, revertendo as configurações para seus padrões e atualizar as configurações de uma versão do aplicativo para outra.

Uma vez que você tenha implementado e compilado seu provedor, você precisará instruir sua classe configurações para usar este provedor em vez do padrão.Faça isso por meio do SettingsProviderAttribute.Se aplicada a uma classe configurações inteira, o provedor é usado para todas as configuração que a classe define; se aplicado a configurações individuais, a arquitetura de Configurações do Aplicativo usa esse provedor para estas configurações apenas e usa LocalFileSettingsProvider para o resto.O código exemplo a seguir mostra como instruir a classe de configurações para usar o provedor personalizado.

Imports System.Configuration

<SettingsProvider("SqlSettingsProvider")> _
Public Class CustomSettings
    Inherits ApplicationSettingsBase

    ' Implementation goes here.
End Class
using System;
using System.Collections.Generic;
using System.Text;
using System.Configuration;

namespace ApplicationSettingsArchitectureCS
{
    class CustomSettings : ApplicationSettingsBase
    {
        // Implementation goes here.
    }
}

Um provedor pode ser chamado de vários threads simultaneamente, mas ele sempre gravará no mesmo local de armazenamento; portanto, a arquitetura das Configurações do Aplicativo somente nunca instanciará uma instância única de sua classe provedor.

Observação importante:

Você deve Certifique-se que seu provedor é thread-safe e somente permite que um thread por vez para gravar os arquivos de configuração.

Seu provedor não precisa oferecer suporte a todas os atributos deconfigurações definidos no namespace System.Configuration, embora ele deve suportar em um nível mínimo ApplicationScopedSettingAttribute e UserScopedSettingAttribute e também deve oferecer suporte a DefaultSettingValueAttribute.Para os atributos que ele não oferece suporte, seu provedor deve apenas falhar sem notificação; ele não deve lançar uma exceção.Se a classe de configurações usa uma combinação inválida de atributos, entretanto — como aplicar ApplicationScopedSettingAttribute e UserScopedSettingAttribute à mesma configuração — o seu provedor deve acionar uma exceção e interromper a operação.

Consulte também

Conceitos

Visão Geral Sobre Configurações do Aplicativo

Configurações do Aplicativo para Controles Personalizados

ClickOnce e configurações do aplicativo

Referência

Esquema de configurações do aplicativo

ApplicationSettingsBase

SettingsProvider

LocalFileSettingsProvider