Generando con AjGenesis desde los assemblies
AjGenesis es una herramienta de generación de código a partir de templates y un modelo libre.
Bien vayamos a esta frase, se dice rápido… pero analicemosla: "…a partir de templates…", esto no tiene nada de nuevo, MyGeneration lo hace, y millones de generadores de código que andan sueltos por ahí también. Pero el punto más que interesante está: "a partir de un modelo libre", y esto que quiere decir ? Significa que no hay restricciones sobre como debe ser el modelo. Si bien debe ser escrito en Xml, esta es una forma de representar el modelo para que lo analice AjGenesis, esto no puede ser considerado una restricción.
Ahora bien, el modelo de AjGenesis puede ser generado inclusive desde la base de Datos, existen unos ejemplos de ello disponible junto con la distribución de AjGenesis.
Hace un tiempo salió la inquietud de que AjG podría generar el modelo a partir de los hbm de NHibernate, la gente que usa NHibernate estaría contenta incluyendome. Pero estuve pensando que los xml se deberían sobrecargar con muchos datos que por ahora los defaults de NHibernate los consideran dejando el mapping más limpio y fácil de leer. Por ejemplo, mis mappings files no tienen el tipo de dato (salvo excepciones), NHibernate hace el trabajo, sin esta información, el modelo que se genere ó el código que se genere junto a los templates es casi inutil sin los tipos de datos.
Otra opción para generar el modelo, es a partir de las clases disponibles en los ensamblados de la aplicación que estemos usando. Hace un tiempo escribí esta herramienta que ahora decidí cambiarla un poco. Ahora escribí ésta herramienta que la pueden descargar aquí.
Como funciona AjGenesis.FromAssembly? Facil, es una librería que itera sobre un ensamblado especificado y devuelve una lista de Objetos que representan la estructura de las clases:
<# AjGenesisFromAssemblyPath = "..\..\bin\AjGenesis.FromAssembly.dll" function GetEntities(path) AssemblyManager.LoadFrom(AjGenesisFromAssemblyPath) obj = new AjGenesis.FromAssembly.Collector() list = obj.GetEntities(path,null) return list end function
AssemblyManager es la clase encargada de cargar el assembly, una vez hecho esto podemos trabajar con él.
Para obtener la listar las clases en el assembly usamos la clase Collector, y la función GetEntities, especificando la ruta del ensamblado.
El template para generar la configuración de IoC en el xml, podría ser similar a este:
<#
nsServices = "MyApp.Service"
assemblyName = "MyApp.Service"
moneySign = "$"
oBraces = "{"
cBraces = "}"
include "${TemplateDir}\Functions.tpl"
#>
<#
for each Entity in Entities
#>
<${Entity.Name}Dao>${moneySign}${oBraces}${Entity.Name}.Dao${cBraces}
${Entity.Name}Dao>
<#
end for
#>
Algo interesante al generar código que a su vez tiene instrucciones de un lenguaje "tipo" template, es decir con comandos de esta forma ${variable}, es que debemos usar caracteres en el código generado y en el codigo para que lo interprete el generador de código. AjGenesis en los templates y Windsor en la configuración, usan los caracteres $, {, }. De modo que para no que AjGenesis no se confunda en el parseo, creé variables que contienen estos símbolos.
Existen muchas cosas que se me ocurrieron para mejorarlo, pero la base ya está, ahora hay que empezar a retocarla. Se me planteó la inquietud crear atributos (annotations) para las clases de modo que se pueda enriquecer o restringir el modelo generado. Pero supongo que sería la primera herramienta de generación de código intrusiva que se pueda configurar por medio de annotaciones y quizas se convertiría en overhead para la aplicación.
7 Responses to Generando con AjGenesis desde los assemblies
Leave a Reply Cancel reply
-
Categories
- .NET
- ActiveRecord
- agil
- Alt.Net
- AOP
- Asp.net MVC
- blog
- C#
- codegeneration
- cosas interesantes
- db4o
- db4o-analyzer
- DLR
- enterprise-library
- expresiones regulares
- General
- Hibernate
- IoC
- it
- Java
- LINQ
- Linux
- Lucene
- Mocking
- Mono
- monosms
- MVC
- NAnt
- NHibernate
- NHibernate.Burrow
- NHibernate.Contrib
- NHibernate.Validator
- noticias
- O/R Mapping
- Open Source
- patrones
- personal
- podcast
- programación
- Redes Neuronales
- Refactoring
- regex
- Scrum
- Security
- Shards
- Sin Categoría
- Spring
- SqlServer
- Testing
- tips
- Tool
- tutorial
- Ubuntu
- uNHAddIns
- video
- Virtualización
- Visual Basic.Net
- Visual Studio
- VMWare
- Web
-
Articles
- June 2011
- May 2011
- November 2009
- October 2009
- April 2009
- March 2009
- February 2009
- October 2008
- September 2008
- August 2008
- July 2008
- June 2008
- May 2008
- April 2008
- March 2008
- February 2008
- January 2008
- December 2007
- November 2007
- October 2007
- September 2007
- August 2007
- June 2007
- May 2007
- April 2007
- March 2007
- February 2007
- January 2007
- December 2006
- November 2006
- October 2006
- September 2006
- August 2006
- March 2006
- February 2006
- December 2005
- November 2005
- October 2005
-
Meta





Hola Dario!
Gracias por publicar este articulo, y colocar tu codigo ahora en Google. Lo habia visto en tu anterior blog. Bien, en cuanto pueda blogueo sobre el tema.
Nos leemos!
Angel “Java” Lopez
Hola Angel,
Pero este es distinto del anterior, por que en el anterior yo generaba el modelo por “fuerza bruta” en c# y era un programa que no necesitaba de AjGenesis.
Ahora tiene más onda.
Con AjGenesis.FromAssembly obtengo solamente la estructura de los objetos y los templates están en AjGenesis
Lo más lindo es que levanto el assembly con AjGenesis… un grande tu bebé !
Saludos
Ah! Barbaro!
Sos el primer usuario del AssemblyManager!!
Bien, te cuento que tambien ahora podes usar metodos estaticos como System.IO.File.Move(….). Asi que tendria que probar System.Reflection.Assembly.LoadFrom(…).
Ese uso de metodos estaticos es uno de los agregados de la version 0.5. No hay import. Hay que poner el nombre completo, al igual que con los new.
La idea del AssemblyManager es cargar DLLs de una forma controlada, haciendo probing a la AjGenesis si es necesario (relativo al path del template y esas cosas, pero no esta implementado).
Bien lo de atributos! Hmm… se me ocurre EJB3 como ejemplo.
Nos leemos!
Angel “Java” Lopez
[...] postear sobre el uso que le dió el bueno de Darío Quintana a esta "feature", ver Generando con AjGenesis desde los assemblies). Me imagino que podemos usar, por ejemplo, la librería Meta de MyGenerationSoftware para [...]
[...] Generando con AjGenesis desde los assemblies [...]
[...] with this feature to generate code from compiled code (post in Spanish Generando con AjGenesis desde los assemblies). You can download his utility [...]
[...] Generando con AjGenesis desde los assemblies [...]