lunes, 2 de junio de 2014

Receta No. 3-8 en C#: Intercambio de Datos entre Dominios de Aplicación

Tabla de Contenido

0. Introducción
1. Problema
2. Solución
3. Discusión de la solución Conclusiones
3.1 Método SetData
3.2 Método GetData
4. Práctica: Código Fuente C#
5. Glosario
6. Literatura & Enlaces

0. Introducción

En las recetas anteriores (más recientes) hemos aprendido varios de los conceptos clave del uso (creación, carga, descarga) de dominios de aplicación,  además, de la comprensión de la carga de assemblies y la instanciación de tipos a partir de los miembros funcionales de la clase AppDomain; pero tenemos una carencia de conocimiento y práctica: no conocemos un proceso para pasar datos personalizados entre los dominios de aplicación, y mucho menos, el medio para pasar u obtener la configuración de los dominios de aplicación. En esta receta nos enseñará cómo hacerlo.

1. Problema

Inmediatamente resuelta la carencia del manejo eficiente de carga de assemblies e instanciación de tipos (cfr. Receta No. 3-7 en C#: Crear una Instancia en un Dominio de Aplicación Diferente), ahora nos ha llegado un nuevo requerimiento: proponer e implementar un mecanismo de intercambio de datos entre dominios de aplicación.

2. Solución

Nuestro arquitecto de solución recibió el requisito y preparó una discusión con los programadores sobre el diseño de la propuesta para la resolución del requerimiento solicitado. Resultado: la clase AppDomain cuenta con los miembros:
  • SetData, y 
  • GetData
Con estos miembros podemos establecer datos de configuración de los dominios de aplicación e información personalizada (datos propios de la aplicación), y obtenerla a través de una llave (o palabra clave), respectivamente.

Discutamos esta solución con más detenimiento.

3. Discusión de la Solución

En recetas las recetas anteriores (las últimas 7) ya hemos visto cómo obtener valores calculados de los miembros de los tipos que cargamos a través de assemblies en dominios de aplicación. Esto está bien. Empero, es necesario contar con un mecanismo que permita acceder a datos comunes o globales de los dominios de aplicación; y de esto modo que estén disponibles desde cualquier sección de la solución para consulta o modificación.

En línea con lo anterior, los dominios de aplicación cuentan con una estructura de datos inherente que consiste en un par clave/valor. Esta estructura puede mantener información útil acerca del estado, la configuración (consultar sección 3.4.2 en Receta No. 3-1 en C#: Creación de un Dominio de Aplicación (Application Domain)), y desde luego, datos personalizados o inherentes al contexto de la solución.

Ahora veamos los artefactos de la clase AppDomain [5] que permiten alcanzar esta funcionalidad.

3.1 Método SetData

El método SetData (lista sobrecargada [3]) facilita la especificación de valores a propiedades integradas y personalizadas sobre un dominio de aplicación. Su firma (versión sobrecargada [6]):

public void SetData(string name, Object data)

Descripción puntual:
  • name: Nombre (o clave) de la propiedad predefinida o personalizada del dominio de aplicación.
  • data: El valor a establecer a la propiedad.
Usemos un ejemplo en código fuente C# para comprender su uso y utilidad cuando trabajamos con dominios de aplicación.

Archivo de código fuente UsoSetData.cs [enlace alternativo]:

En la línea 11 creamos un nuevo dominio de aplicación -NuevoAppDomain-; más adelante a este dominio de aplicación creamos un nombre (o llave) -TemaColores- y le asignamos el valor Negro (línea 15). Ya en la línea 19 mostramos el valor de la propiedad anterior sobre la salida estándar.

Compilación:


  1. csc /target:exe UsoSetData.cs

> Prueba de ejecución.

3.2 Método GetData

El método GetData [2] facilita la obtención del valor de un nombre predeterminado (ver Figura 1 [2]) o cualquier creado por el programador (como el que creamos en el ejemplo de demostración del método SetData: UsoSetData.cs).
Propiedades predeterminadas de un dominio de aplicación
Figura 1. Propiedades predeterminadas de un dominio de aplicación [2].

Conozcamos la firma de este método:

public Object GetData(string name)

Descripción puntual:
  • name: Nombre de la propiedad predefinida (ver Figura 1) o una creada por el programador.
Echémosle un vistazo a este ejemplo:

Archivo de código fuente UsoGetData.cs [enlace alternativo]:

En la línea 8 creamos un arreglo de objetos string con las propiedades integradas de dominios de aplicación [2]. Utilizamos el dominio de aplicación anfitrión/actual (línea 19). Luego en el ciclo foreach descubrimos los valores de las propiedades de las propiedades integradas.

Compilación:


  1. csc /target:exe UsoGetData.cs

> Prueba de ejecución.

Resultado (en local):
Visualización propiedades predeterminadas de un dominio de aplicación
Figura 2. Visualización propiedades predeterminadas de un dominio de aplicación.

4. Práctica: Código Fuente C#

En esta sección meramente práctica vamos a pasar un arreglo como lista (ArrayList [7]) con los datos de nombres de programas a un nuevo dominio de aplicación.

Archivo de código fuente IntercambioDatosAppDomains.cs [enlace alternativo]:
Observemos que el resultado del contenido de la instancia ArrayList -listaProgramas- difiere del contenido de la instancia nuevoAppDomain.GetData("Programas") en el dominio de aplicación -nuevoAppDomain-:

Contenido de `listaProgramas`:
 OrtizOL - Fundamentos de Electrónica Digital
 OrtizOL - Easy YouTube Video Downloader
 OrtizOL - El Triángulo
 OrtizOL - Simulador Bancario

Contenido de `nuevoAppDomain.GetData("Programas")`:
 OrtizOL - Fundamentos de Electrónica Digital
 OrtizOL - Easy YouTube Video Downloader
 OrtizOL - El Triángulo
 OrtizOL - Simulador Bancario
 OrtizOL - El Empleado

Esto se debe que `listaProgramas` es pasado como MBV (marshal-by-value) por lo tanto los cambios en el dominio nuevoAppDomain no altera en ninguna medida la instancia original (i.e., listaProgramas).

Compilación:


  1. csc /target:exe IntercambioDatosAppDomains.cs

> Prueba de ejecución.

Resultado:
Ejemplo práctico en ejecución
Figura 3. Ejemplo práctico en ejecución.

5. Conclusiones

En esta receta hemos aprendido algo nuevo: el intercambio de datos a través de los métodos SetData y GetData de la clase AppDomain. Este conocimiento resulta útil para nuestras aplicaciones que requieran trascender a otro(s) dominio de aplicación, y podamos acceder datos de forma global en la solución que estemos creando.

Glosario

  • Aplicación
  • AppDomain
  • Dominio de Aplicación
  • Intercambio de datos
  • GetData
  • SetData

Literatura & Enlaces

[1]: Visual C# 2010 Recipes by Allen Jones and Adam Freeman. Copyright 2010 Allen Jones and Adam Freeman, 978-1-4302-2525-6.
[2]: AppDomain.GetData Method (System) - http://msdn.microsoft.com/en-us/library/system.appdomain.getdata(v=vs.110).aspx
[3]: AppDomain.SetData Method (System) - http://msdn.microsoft.com/en-us/library/system.appdomain.setdata(v=vs.110).aspx
[4]: Receta No. 3-7 en C#: Crear una Instancia en un Dominio de Aplicación Diferente | OrtizOL - Experiencias Construcción Software (xCSw) - http://ortizol.blogspot.com/2014/06/receta-no-3-7-en-csharp-crear-una-instancia-en-un-dominio-de-aplicacion-diferente.html
[5]: AppDomain Class (System) - http://msdn.microsoft.com/en-us/library/System.AppDomain(v=vs.110).aspx
[6]: AppDomain.SetData Method (String, Object) (System) - http://msdn.microsoft.com/en-us/library/37z40s1c(v=vs.110).aspx
[7]: ArrayList Class (System.Collections) - http://msdn.microsoft.com/en-us/library/system.collections.arraylist(v=vs.110).aspx


M

No hay comentarios:

Publicar un comentario

Envíe sus comentarios, dudas, sugerencias, críticas. Gracias.