Compartir a través de


Introducción a las propiedades dinámicas (Visual Studio)

Actualización: noviembre 2007

Nota:

La interfaz de usuario para las propiedades dinámicas se ha quitado a partir de Visual Studio 2005. Sin embargo, todavía se admiten las propiedades dinámicas. Si importa un proyecto de una versión anterior de Visual Studio, la configuración de las propiedades dinámicas se conservarán en código y funcionarán en tiempo de ejecución. Recomendamos que utilice en su lugar el Diseñador de proyectos para especificar la configuración de la aplicación. Para obtener más información, vea Página Configuración, Diseñador de proyectos y Administrar la configuración de la aplicación.

Las propiedades dinámicas permiten configurar la aplicación para que algunos o todos sus valores de propiedades se almacenen en un archivo de configuración externa, en lugar de en el código compilado de la aplicación. Los medios que se proporciona a los administradores para actualizar los valores de propiedades que necesitan cambiar a lo largo del tiempo pueden reducir el costo total de mantenimiento de una aplicación después de su implementación. Por ejemplo, supongamos que creamos una aplicación que utiliza una base de datos de prueba durante el proceso de desarrollo y necesitamos cambiarla a una base de datos de producción al implementarla. Si almacenamos los valores de las propiedades en la aplicación, tendremos que cambiar manualmente toda la configuración de la base de datos antes de implementarla y, después, recompilar el código fuente. Si, por el contrario, almacenamos estos valores externamente, podremos realizar un solo cambio en el archivo externo y la aplicación tomará los nuevos valores la próxima vez que se ejecute.

Nota de seguridad:

Los valores de propiedad almacenados en un archivo de configuración no son seguros. Los datos confidenciales como contraseñas o información sobre tarjetas de crédito no deberían almacenarse como propiedades dinámicas.

Se pueden utilizar propiedades dinámicas en cualquier aplicación que se compile como un archivo .exe. Los proyectos que compilan un archivo DLL no pueden utilizar propiedades dinámicas directamente; sin embargo, el archivo .exe que hace referencia al archivo .dll puede definir dinámicamente las propiedades de DLL. Si bien las propiedades de cualquier componente, formulario o control de estas aplicaciones pueden controlarse de manera dinámica, algunas propiedades son mejores candidatas a propiedad dinámica que otras. A menudo, almacenamos y recuperamos propiedades que se conectan a recursos externos que pueden cambiar, incluidas bases de datos, registros de eventos o contadores de rendimiento. Muchas de esas propiedades se identifican como candidatos predeterminados a propiedades dinámicas.

Nota:

El código de ejemplo de este tema se basa en la existencia de un objeto SqlConnection y un archivo de configuración; dará lugar a errores de compilación si no dispone de ellos.

Propiedades dinámicas y archivos de configuración

Al establecer una propiedad como configurable, se escribe su valor en un archivo de configuración y se inserta código en la clase para indicar que debe recuperarse el valor de la propiedad de este recurso externo. El archivo de configuración varía según el tipo de aplicación; las aplicaciones basadas en Web utilizan el archivo Web.config, mientras que las basadas en Windows usan un archivo similar con la extensión .config. Todos los formularios y componentes de una aplicación utilizan un solo archivo de configuración. No se puede cambiar a otro archivo de configuración ni usar varios archivos en una sola aplicación.

Dentro del archivo de configuración, las propiedades se conservan utilizando XML. Por ejemplo, supongamos que el usuario indica que la propiedad ConnectionString para una conexión de datos debe almacenarse en el archivo de configuración. Veríamos este código en el Editor de código, que indicaría que el valor se almacena externamente:

Me.SqlConnection1.ConnectionString = _
  System.Configuration.ConfigurationManager. _
  AppSettings.Get("SqlConnection1.ConnectionString")
     this.sqlConnection1.ConnectionString = 
          System.Configuration.ConfigurationManager.
          AppSettings.Get("SqlConnection1.ConnectionString");
Nota de seguridad:

Para obtener más información acerca de cómo crear conexiones de datos seguras, vea Proteger la información de conexión (ADO.NET).

En el archivo de configuración, el valor de esta propiedad se almacenaría mediante XML, usando la clave indicada en el código del formulario:

<configuration>

<appSettings>

<add key="sqlConnection1.ConnectionString" value="data source=myserver;initial catalog=Apps;Integrated Security=SSPI;packet size=4096" />

</appSettings>

</configuration>

A cada valor del archivo de configuración se le asigna una clave que se emplea para almacenar y recuperar el valor. El fragmento inicial de la clave indica el componente que dio origen al valor. Por ejemplo, estas dos claves indican una propiedad ConnectionString en dos conexiones de datos diferentes para una sola aplicación:

<configuration>

<appSettings>

<add key="sqlConnection1.ConnectionString" value="data source=myserver;initial catalog=Apps;Integrated Security=SSPI;packet size=4096" />

<add key="sqlConnection2.ConnectionString" value="data source=myserver;initial catalog=Apps;Integrated Security=SSPI;packet size=4096" />

</appSettings>

</configuration>

Se puede modificar el archivo de configuración directamente con objeto de actualizar de forma dinámica los valores de propiedad de la aplicación. La próxima vez que se inicie la aplicación, se actualizarán los valores.

En cierto sentido, los archivos de configuración son similares a los archivos de recursos: ambos se utilizan para almacenar valores fuera de la aplicación compilada y ambos utilizan XML para almacenar su información. Sin embargo, los archivos de recursos sirven a un propósito muy diferente del de los archivos de configuración. Los archivos de recursos se utilizan para almacenar cadenas y otros recursos localizables para su posterior traducción, mientras que los archivos de configuración (en el caso de las propiedades dinámicas) se emplean para actualizar los valores de propiedades. Los valores de un archivo de recursos se traducen, pero habitualmente no se modifican, mientras que los valores de propiedades dinámicas de un archivo de configuración se pueden modifican siempre que sea necesario. Asimismo, se pueden asociar varios archivos de recursos a un proyecto, pero sólo puede haber un archivo de configuración para cada aplicación. Para obtener más información acerca de los archivos de recursos, vea Organización jerárquica de recursos para la localización.

Establecer varias propiedades en una misma clave

Varias propiedades pueden hacer referencia al mismo par clave-valor en un archivo de configuración. Por ejemplo, si hay tres componentes en una clase que tienen acceso a la misma base de datos, se puede almacenar la propiedad ConnectionString de cada uno de ellos en un mismo par clave-valor. Ello implica que, si cambia la base de datos, se puede actualizar un solo valor del archivo de configuración y aplicar el cambio a los tres componentes. Esto se llevaría a cabo estableciendo cada una de las propiedades en la misma clave, tal y como se muestra a continuación:

Me.SqlConnection1.ConnectionString = _
  System.Configuration.ConfigurationManager. _
  AppSettings.Get("SqlConnection1.ConnectionString")

Me.SqlConnection2.ConnectionString = _
  System.Configuration.ConfigurationManager. _
  AppSettings.Get("SqlConnection1.ConnectionString")

Me.SqlConnection3.ConnectionString = _
  System.Configuration.ConfigurationManager. _
  AppSettings.Get("SqlConnection1.ConnectionString")
     this.sqlConnection1.ConnectionString = 
          System.Configuration.ConfigurationManager.
          AppSettings.Get("SqlConnection1.ConnectionString");

        this.sqlConnection2.ConnectionString = 
          System.Configuration.ConfigurationManager.
          AppSettings.Get("SqlConnection1.ConnectionString"); 

        this.sqlConnection3.ConnectionString = 
          System.Configuration.ConfigurationManager.
          AppSettings.Get("SqlConnection1.ConnectionString"); 

Observe que, si bien varían los componentes en uso, todos ellos hacen referencia a la clave de sqlConnection1.ConnectionString.

Al elegir la misma clave para varias propiedades, sólo se realiza una entrada en el archivo de configuración. El valor inicial almacenado es el de la primera propiedad a la que se asignó dicha clave.

Tipos de datos y propiedades dinámicas

XML lo almacena todo como una cadena. Si el valor de propiedad que se almacena no es una cadena, se podrá observar en el Editor de código información adicional que indica el tipo de datos del valor de propiedad. Por ejemplo, supongamos que almacenamos dinámicamente el valor de las propiedades Interval y Enabled de un componente Timer. En el archivo de configuración, esta propiedad se almacenaría de la siguiente forma:

<appSettings>

<add key=timer1.Interval" value="100" />

<add key=timer1.Enabled" value="True" />

</appSettings>

En el Editor de código, vería este código para indicar que el valor recuperado debe cambiarse a Double (Tipo de datos, Visual Basic):

Me.Timer1.Enabled = (New System.Configuration. _
AppSettingsReader()).GetValue("timer1.Enabled", GetType(Boolean))

Me.Timer1.Interval = (New System.Configuration. _
AppSettingsReader()).GetValue("Timer1.Interval", GetType(Double))
     this.timer1.Enabled = (bool)(new System.Configuration.
          AppSettingsReader().GetValue("timer1.Enabled", typeof(bool)));

        this.timer1.Interval = (System.Double)(new System.Configuration.
          AppSettingsReader().GetValue("timer1.Interval", typeof(System.Double)));
Nota:

Existen dos temporizadores, uno para formularios Windows Forms y otro para aplicaciones basadas en el servidor, con ligeras diferencias en los modelos de programación. Este ejemplo utiliza el temporizador basado en el servidor. Para obtener más información acerca de los dos temporizadores disponibles, vea Introducción a los temporizadores basados en servidor.

Cuestiones sobre rendimiento y seguridad en las propiedades dinámicas

Deberá tener en cuenta dos cosas cuando utilice propiedades dinámicas. En primer lugar, el almacenamiento y recuperación de propiedades dinámicas puede afectar en cierta medida al rendimiento de la aplicación. Recuperar valores de propiedades desde la aplicación compilada es ligeramente más rápido que hacerlo desde un archivo de configuración. La primera vez que la aplicación tiene acceso a un valor del archivo de configuración, se produce un ligero impacto en el rendimiento mientras la aplicación lee el archivo. Sin embargo, este impacto es muy pequeño y no debería ser apreciable. Cualquier recuperación posterior de esa o de otras propiedades afecta mucho menos al rendimiento, al igual que sucede con la lectura de un valor de una tabla hash.

En segundo lugar, si almacena valores de propiedades, como identificadores de usuario y contraseñas, en un archivo externo, resulta conveniente controlar quién tiene acceso al archivo y a los valores que contiene. Una forma de lograrlo es proteger el archivo con una lista de control de acceso de Windows (ACL). Las listas de control de acceso especifican qué operaciones pueden realizar los diferentes usuarios en determinados archivos y carpetas. Asimismo, si se trabaja con una aplicación basada en Web, se puede aprovechar la opción de seguridad integrada que proporcionan Windows, Internet Information Services (IIS) y SQL Server. En este modelo, las credenciales de autenticación de un usuario para la red local se utilizan también para el acceso a los recursos de la base de datos y no se utiliza ninguna contraseña o nombre de usuario explícito en la cadena de conexión.

Para obtener más información acerca de la seguridad, consulte la documentación de Windows o vea los temas siguientes:

Vea también

Otros recursos

Configurar aplicaciones mediante propiedades dinámicas