Jonathan Leibiusky's Blog

martes, diciembre 20, 2005

NHibernate desmenuzado

Hace poco tuve que pensar en un mapeo de NHibernate que resuelva la siguiente problemática:
Una entidad está asociada a otra entidad X la cual no conozco directamente sino a través de una interfaz Y (una especie de asociación polimórfica relativamente común en diseños orietandos a objetos).
En un primer momento recurrí a lo que ya sabía e intenté resolverlo por ese lado, encontrando varias soluciones, pero todas agregaban complejidad y alteraciones al diseño de forma que se "ensuciaba".
Finalemente leyendo un poco más la documentación de NHibernate llegué al tipo de asociación de <any>.
Sincramente considero que la documentación al respecto es muy pobre y no alcanza para entender ese feature.
Con lo cual luego de una investigación pude descifrar el funcionamiento el cual pasaré a explicar para que quede al conocimiento público.
El mapeo de es similar al pero en lugar de llevar una sola columna para el código de la entidad asociada, tendrá una columna adicional en donde se almacenará un texto (al estilo del Discriminator) para diferenciar una entidad de otra.
Con lo cual paso a mostrar un ejemplo:

<class name="ClaseA" table="ClasesA">
<id name="id" column="Codigo" type="Int32" value="-1">
<generator class="native" />
</id>
<any name="entidadRelacionada" type="String">
<meta-value value="ClaseB" class="ClaseB" />
<meta-value value="ClaseC" class="ClaseC" />
<column name="TipoEntidadTramite" />
<column name="CodigoEntidadTramite" />
</any>
</class>
La explicación línea por línea del nodo sería:

<any name="entidadRelacionada" type="String">

El name indica (como siempre) el field que contendrá la relación en la clase que estamos mapeando.
Luego el meta-type indica de qué tipo será la columna que almacenará el tipo de cada entidad que pueda relacionarse.
Por último el id-type indica de qué tipo será la columna que contendrá el código de la entidad relacionada.

<meta-value value="ClaseB" class="ClaseB">
<meta-value value="ClaseC" class="ClaseC">


Se pondrá un meta-value por cada entidad que pueda relacionarse con la clase y almacenarse en ese field. En el value iría el "discriminator" que le asignamos a la clase (es la forma con la que NHibernate diferencia las clases y sabe cómo instanciarlas, etc). Y luego con class se specifica finalmente a cuál clase nos estamos refiriendo.

<column name="TipoEntidadTramite">
<column name="CodigoEntidadTramite">

Por último se deben difinir de forma ordenada la columna que contendrá el tipo de entidad relacionada (con el valor del meta-value definido anteriormente según corresponda) y luego la columna que contendrá el código de aquella entidad.

Espero que se haya entendido. No es sencillo ya que no es una forma de asociación muy común. Pero les aseguro que es muy útil y sirve para evitar bastantes dolores de cabeza.

Sabían lo que es WYSIWYG???

Hace tiempo que veo ests siglas por internet, y siempre las asocié con editores de HTML on-line (usando JavaScript y DHTML). Pero jamás creí que significarían algo esas siglas... aunque siempre me despertaba cierta intriga.
Finalmente conseguí descubrirlo:

WYSIWYG = What You See Is What You Get

Netron Project

Netron Project

http://netron.sourceforge.net/wp/


Es un conjunto de sub-proyectos de diferentes librerías de controles gráficos open source para .NET que contiene, entre otras cosas, toda una implementación de las complejas operaciones algebraicas con grafos (se pueden hacer cosas realmente increibles, miren los screenshots).
Tiene también una librería de charting (http://netron.sourceforge.net/wp/?page_id=117) y librerías de controles mejorados para winforms.

Y además tiene su propia implementación de un HTTP server, llamado Xeon (http://netron.sourceforge.net/wp/?page_id=123), el cual puede servir para aprender mucho (si uno tiene paciencia para ponerse a leer el código fuente :-) ).

VS 2005: Hosting Process (vshost.exe)

Hosting Process (vshost.exe)

Este es un archivo que crea el Visual Studio 2005 automáticamente (no debe ejecutarse manualmente, lo hace el VS por su cuenta) en el directorio de output del proyecto y permite mejorar la performance de debugguear, hacer partial trust debugging y evaluar expresiones en tiempo de diseño.

Mejora de la performance:
El hosting process crea un application domain y asocia el debugger con la aplicación. Este tipo de tareas suelen consumir muchos recursos y provocan un delay entre el inicio de la aplicación y el inicio del debugging. Usando el hosting process VS crea la aplicación y asocia el debugger al background mejorando la velocidad y la performace y además permite mantener el estado del application domain y del debugger entre diferentes ejecuciones de la misma aplicación.

Partial Trust Debugging:
Una aplicación puede ser deployada (jejee) como Partial Trust o Full Trust dependiendo de si se le restringe el acceso a diferentes servicios del sistema operativo.
Debuguear una aplicación Partial Trust (que se le ha otorgado acceso sólo a los servicios del SO que utiliza) requiere inicializaciones especiales. Estas inicializaciones las realiza el Hosting Process de forma transparente para el VS.

Evaluar expresiones en tiempo de diseño:
Esta característica permite evaluar código desde la ventana de Immediate sin necesidad de ejecutar la aplicación. El Hosting Process se encarga de ejecutar el código durante el desing time.

lunes, diciembre 19, 2005

Headshot!

Recién llego a mi casa luego de una árdua batalla de paintball, bajo el techo destruido de un complejo urbano dedicado a este deporte.
Fue mi primera vez y la verdad es que me gustó mucho. No soy muy fanático de los juegos de PC en donde uno se la pasa disparando y persiguiendo personas. Esto es real... bueno, casi. Y se siente la adrenalina correr por la sangre.
En especial cuando uno escucha los disparos y teme levantar la cabeza para no recibir un headshot y quedar ciego por el resto del juego.
Además la táctica y el trabajo en equipo juegan un importante y crucial.

Seguramente lo repetiré... :0)

martes, diciembre 06, 2005

Hello World!

Ok. Es la primera vez que posteo algo a un blog... desde ahora Mi Blog.
Ya veremos a donde llega esto.
Como ya es tarde y mañana es un día largo, me iré a leer un capítulo más del segundo libro de la trilogía del Elfo Oscuro (El Exilio - Salvatore - Reinos Olvidados) y luego a dormir.