Compartir a través de


Arquitectura de configuración de la aplicación

En este tema se describe cómo funciona la arquitectura de configuración de la aplicación y se exploran las características avanzadas de la arquitectura, como la configuración agrupada y las claves de configuración.

La arquitectura de configuración de la aplicación permite definir configuraciones fuertemente tipadas con un ámbito de aplicación o de usuario, y garantiza la persistencia de estas configuraciones entre sesiones de aplicación. La arquitectura proporciona un motor de persistencia predeterminado para guardar la configuración en y cargarlos desde el sistema de archivos local. La arquitectura también define interfaces para proporcionar un motor de persistencia personalizado.

Las interfaces se proporcionan que permiten que los componentes personalizados conserven su propia configuración cuando se hospedan en una aplicación. Mediante el uso de claves de configuración, los componentes pueden mantener la configuración de varias instancias del componente independiente.

Definición de la configuración

La arquitectura de configuración de la aplicación se usa tanto en ASP.NET como en Windows Forms, y contiene una serie de clases base que se comparten entre ambos entornos. Lo más importante es SettingsBase, que proporciona acceso a la configuración a través de una colección y proporciona métodos de bajo nivel para cargar y guardar la configuración. Cada entorno implementa su propia clase derivada de SettingsBase para proporcionar funcionalidad de configuración adicional para ese entorno. En una aplicación basada en Windows Forms, toda la configuración de la aplicación debe definirse en una clase derivada de la ApplicationSettingsBase clase , que agrega la siguiente funcionalidad a la clase base:

  • Operaciones de carga y guardado de nivel superior

  • Compatibilidad con configuraciones con ámbito de usuario

  • Revertir la configuración de un usuario a los valores predeterminados predefinidos

  • Actualización de la configuración desde una versión anterior de la aplicación

  • Validación de la configuración, ya sea antes de cambiarlos o antes de guardarlos

La configuración se puede describir mediante una serie de atributos definidos en el System.Configuration espacio de nombres; estos se describen en Atributos de configuración de la aplicación. Al definir una configuración, debe aplicarla con ApplicationScopedSettingAttribute o UserScopedSettingAttribute, que describe si la configuración se aplica a toda la aplicación o solo al usuario actual.

En el ejemplo de código siguiente se define una clase de configuración personalizada con una única configuración, BackgroundColor.

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;
        }
    }
}
Imports System.Configuration

Public Class MyUserSettings
    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

Persistencia de configuración

La ApplicationSettingsBase clase no conserva ni carga la configuración; este trabajo pertenece al proveedor de configuración, una clase que deriva de SettingsProvider. Si una clase derivada de ApplicationSettingsBase no especifica un proveedor de configuración a través de SettingsProviderAttribute, entonces se usa el proveedor predeterminado, LocalFileSettingsProvider.

El sistema de configuración que se publicó originalmente con .NET Framework admite proporcionar datos de configuración de aplicaciones estáticas a través del archivo machine.config del equipo local o dentro de un app. archivo deexe.config que implemente con la aplicación. La LocalFileSettingsProvider clase expande esta compatibilidad nativa de las maneras siguientes:

  • La configuración con ámbito de aplicación se puede almacenar en los archivos machine.config o app.exe.config. Machine.config siempre es de solo lectura, mientras que app.exe.config está restringido por consideraciones de seguridad a ser de solo lectura para la mayoría de las aplicaciones.

  • La configuración con ámbito de usuario se puede almacenar en app.exe.config archivos, en cuyo caso se tratan como valores predeterminados estáticos.

  • La configuración de ámbito de usuario no predeterminada se almacena en un nuevo archivo, user.config. Puede especificar un valor predeterminado para una configuración de ámbito de usuario con DefaultSettingValueAttribute. Dado que la configuración con ámbito de usuario suele cambiar durante la ejecución de la aplicación, user.config siempre es lectura/escritura. Para obtener más información, consulte Where are user-scoped settings stored (Dónde se almacenan las opciones de configuración con ámbito de usuario).

Los tres archivos de configuración almacenan los valores en formato XML. El elemento XML de nivel superior para la configuración con ámbito de aplicación es <appSettings>, mientras que <userSettings> se usa para la configuración con ámbito de usuario. Un app archivo.exe.config que contiene la configuración con ámbito de aplicación y los valores predeterminados para la configuración con ámbito de usuario tendría este aspecto:

<?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 obtener una definición de los elementos dentro de la sección de configuración de la aplicación de un archivo de configuración, consulte Esquema de configuración de la aplicación.

Vinculaciones de configuración

La configuración de la aplicación usa la arquitectura de enlace de datos de Windows Forms para proporcionar comunicación bidireccional de las actualizaciones de configuración entre el objeto de configuración y los componentes. Si usa Visual Studio para crear la configuración de la aplicación y asignarlas a propiedades de componente, estos enlaces se generan automáticamente.

Solo puede enlazar una configuración de aplicación a un componente que admita la IBindableComponent interfaz. Además, el componente debe implementar un evento de cambio para una propiedad enlazada específica o notificar a la configuración de la aplicación que la propiedad ha cambiado a través de la INotifyPropertyChanged interfaz . Si el componente no implementa IBindableComponent y se enlaza a través de Visual Studio, las propiedades enlazadas se establecerán la primera vez, pero no se actualizarán. Si el componente implementa IBindableComponent pero no admite notificaciones de cambio de propiedad, el enlace no se actualizará en el archivo de configuración cuando se cambie la propiedad.

Algunos componentes de Windows Forms, como ToolStripItem, no admiten enlaces de configuración.

Serialización de ajustes

Cuando LocalFileSettingsProvider debe guardar la configuración en el disco, realiza las siguientes acciones:

  1. Usa la reflexión para examinar todas las propiedades definidas en ApplicationSettingsBase la clase derivada, buscando las que se aplican con ApplicationScopedSettingAttribute o UserScopedSettingAttribute.

  2. Serializa la propiedad en el disco. Primero intenta llamar ConvertToString o ConvertFromString en el TypeConverter asociado del tipo. Si esto no se realiza correctamente, usa la serialización XML en su lugar.

  3. Determina qué configuraciones van en qué archivos, según el atributo de cada configuración.

Si implementa su propia clase de configuración, puede usar SettingsSerializeAsAttribute para marcar una configuración para la serialización binaria o personalizada mediante la SettingsSerializeAs enumeración. Para obtener más información sobre cómo crear su propia clase de configuración en el código, vea How to: Create Application Settings.

Ubicaciones de archivos de configuración

La ubicación del.exe.config y los archivos.config de app variarán en función de cómo se instala la aplicación. En el caso de una aplicación basada en Windows Forms copiada en el equipo local, app.exe.config residirá en el mismo directorio que el directorio base del archivo ejecutable principal de la aplicación y el usuario.config residirá en la ubicación especificada por la Application.LocalUserAppDataPath propiedad . Para una aplicación instalada mediante ClickOnce, ambos archivos residirán en el directorio de datos ClickOnce debajo de %InstallRoot%\Documents and Settings\username\Local Settings.

La ubicación de almacenamiento de estos archivos es ligeramente diferente si un usuario ha habilitado perfiles móviles, lo que permite a un usuario definir diferentes configuraciones de Windows y aplicación cuando usan otros equipos dentro de un dominio. En ese caso, las aplicaciones ClickOnce y las aplicaciones que no son ClickOnce tendrán sus app archivos de.exe.config y de usuario.config almacenados en %InstallRoot%\Documents and Settings\username\Application Data.

Para obtener más información sobre cómo funciona la característica Configuración de la aplicación con la nueva tecnología de implementación, consulte ClickOnce y Configuración de la aplicación. Para obtener más información sobre el directorio de datos ClickOnce, consulte Acceso a datos locales y remotos en aplicaciones ClickOnce.

Configuración y seguridad de la aplicación

La configuración de la aplicación está diseñada para funcionar en confianza parcial, un entorno restringido que es el valor predeterminado para las aplicaciones de Windows Forms hospedadas a través de Internet o una intranet. No se necesitan permisos especiales más allá de la confianza parcial para usar la configuración de la aplicación con el proveedor de configuración predeterminado.

Cuando la configuración de la aplicación se usa en una aplicación ClickOnce, el user archivo.config se almacena en el directorio de datos ClickOnce. El tamaño del archivo.config de user la aplicación no puede superar la cuota de directorio de datos establecida por ClickOnce. Para obtener más información, consulte Configuración de la aplicación y ClickOnce.

Proveedores de configuración personalizada

En la arquitectura configuración de la aplicación, hay un acoplamiento flexible entre la clase contenedora de configuración de aplicaciones, derivada de ApplicationSettingsBasey el proveedor o proveedores de configuración asociados, derivados de SettingsProvider. Esta asociación solo se define mediante el SettingsProviderAttribute aplicado a la clase contenedora o sus propiedades individuales. Si no se especifica explícitamente un proveedor de configuración, se usa el proveedor predeterminado, LocalFileSettingsProvider, . Como resultado, esta arquitectura admite la creación y el uso de proveedores de configuración personalizados.

Por ejemplo, supongamos que desea desarrollar y usar SqlSettingsProvider, un proveedor que almacenará todos los datos de configuración en una base de datos de Microsoft SQL Server. La clase derivada SettingsProvider recibirá esta información en su método Initialize como un parámetro de tipo System.Collections.Specialized.NameValueCollection. A continuación, implementaría el GetPropertyValues método para recuperar las configuraciones del almacén de datos y SetPropertyValues guardarlas. El proveedor puede usar el SettingsPropertyCollection proporcionado para GetPropertyValues determinar el nombre, el tipo y el ámbito de la propiedad, así como cualquier otro atributo de configuración definido para esa propiedad.

El proveedor tendrá que implementar una propiedad y un método cuyas implementaciones pueden no ser obvias. La ApplicationName propiedad es una propiedad abstracta de SettingsProvider; debe programarla para devolver lo siguiente:

public override string ApplicationName
{
    get
    {
        return (System.Reflection.Assembly.GetExecutingAssembly().GetName().Name);
    }
    set
    {
        // Do nothing.
    }
}
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

La clase derivada también debe implementar un Initialize método que no toma ningún argumento y no devuelve ningún valor. Este método no está definido por SettingsProvider.

Por último, implemente IApplicationSettingsProvider en el proveedor para proporcionar compatibilidad con la actualización de la configuración, revertir la configuración a sus valores predeterminados y actualizar la configuración de una versión de aplicación a otra.

Una vez implementado y compilado el proveedor, debe indicar a la clase de configuración que use este proveedor en lugar del valor predeterminado. Esto se logra a través de SettingsProviderAttribute. Si se aplica a una clase de configuración completa, el proveedor se usa para cada configuración que define la clase; Si se aplica a una configuración individual, la arquitectura de configuración de la aplicación usa ese proveedor solo para esos valores y usa LocalFileSettingsProvider para el resto. En el ejemplo de código siguiente se muestra cómo indicar a la clase de configuración que use el proveedor personalizado.

using System;
using System.Collections.Generic;
using System.Text;
using System.Configuration;

namespace ApplicationSettingsArchitectureCS
{
    [SettingsProvider("SqlSettingsProvider")]
    class CustomSettings : ApplicationSettingsBase
    {
        // Implementation goes here.
    }
}
Imports System.Configuration

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

    ' Implementation goes here.
End Class

Se puede llamar a un proveedor desde varios subprocesos simultáneamente, pero siempre escribirá en la misma ubicación de almacenamiento; por consiguiente, la arquitectura de Configuración de Aplicaciones solo creará una instancia única de la clase del proveedor.

Importante

Debe asegurarse de que el proveedor es seguro para subprocesos y solo permite escribir un subproceso a la vez en los archivos de configuración.

El proveedor no necesita admitir todos los atributos de configuración definidos en el System.Configuration espacio de nombres, aunque debe admitir como mínimo ApplicationScopedSettingAttribute y UserScopedSettingAttribute, y también debe admitir DefaultSettingValueAttribute. Para aquellos atributos que no admite, el proveedor solo debe dar un error de manera silenciosa; no debe lanzar una excepción. Sin embargo, si la clase de configuración usa una combinación no válida de atributos, como aplicar ApplicationScopedSettingAttribute y UserScopedSettingAttribute a la misma configuración, el proveedor debe iniciar una excepción y detener la operación.

Consulte también