Tabla de Contenido
0. Introducción1. 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:
> Prueba de ejecución.
Conozcamos la firma de este método:
public Object GetData(string name)
Descripción puntual:
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:
> Prueba de ejecución.
Resultado (en local):
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:
- 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).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.
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:
- csc /target:exe UsoGetData.cs
> Prueba de ejecución.
Resultado (en local):
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.
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`:
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:
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:
- csc /target:exe IntercambioDatosAppDomains.cs
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.