<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Espacio de Dario Quintana &#187; codegeneration</title>
	<atom:link href="http://blog.darioquintana.com.ar/category/codegeneration/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.darioquintana.com.ar</link>
	<description></description>
	<lastBuildDate>Tue, 21 Jun 2011 22:51:18 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2</generator>
		<item>
		<title>Generando con AjGenesis desde los assemblies</title>
		<link>http://blog.darioquintana.com.ar/2007/11/20/generando-con-ajgenesis-desde-los-assemblies/</link>
		<comments>http://blog.darioquintana.com.ar/2007/11/20/generando-con-ajgenesis-desde-los-assemblies/#comments</comments>
		<pubDate>Tue, 20 Nov 2007 05:51:12 +0000</pubDate>
		<dc:creator>Dario Quintana</dc:creator>
				<category><![CDATA[codegeneration]]></category>

		<guid isPermaLink="false">http://blog.darioquintana.com.ar/2007/11/20/generando-con-ajgenesis-desde-los-assemblies/</guid>
		<description><![CDATA[<p><a href="http://www.ajlopez.com/ajgenesis/">AjGenesis </a>es una herramienta de generaci&#xF3;n de c&#xF3;digo a partir de templates y un modelo libre. </p> <p>Bien vayamos a esta frase, se dice r&#xE1;pido&#8230; pero analicemosla: &#34;&#8230;a partir de templates&#8230;&#34;, esto no tiene nada de nuevo, MyGeneration lo hace, y millones de generadores de c&#xF3;digo que andan sueltos por ah&#xED; tambi&#xE9;n. Pero el [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p><a href="http://www.ajlopez.com/ajgenesis/">AjGenesis </a>es una herramienta de generaci&#xF3;n de c&#xF3;digo a partir de templates y un modelo libre. </p>
</blockquote>
<p>Bien vayamos a esta frase, se dice r&#xE1;pido&#8230; pero analicemosla: &quot;&#8230;a partir de templates&#8230;&quot;, esto no tiene nada de nuevo, MyGeneration lo hace, y millones de generadores de c&#xF3;digo que andan sueltos por ah&#xED; tambi&#xE9;n. Pero el punto m&#xE1;s que interesante est&#xE1;: &quot;a partir de un modelo libre&quot;, 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&#xF3;n.</p>
<p>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&#xF3;n de AjGenesis.</p>
<p>Hace un tiempo sali&#xF3; la inquietud de que AjG podr&#xED;a generar el modelo a partir de los hbm de NHibernate, la gente que usa NHibernate estar&#xED;a contenta incluyendome. Pero estuve pensando que los xml se deber&#xED;an sobrecargar con muchos datos que por ahora los defaults de NHibernate los consideran dejando el mapping m&#xE1;s limpio y f&#xE1;cil de leer. Por ejemplo, mis mappings files no tienen el tipo de dato (salvo excepciones), NHibernate hace el trabajo, sin esta informaci&#xF3;n, el modelo que se genere &#xF3; el c&#xF3;digo que se genere junto a los templates es casi inutil sin los tipos de datos. </p>
<p>Otra opci&#xF3;n para generar el modelo, es a partir de las clases disponibles en los ensamblados de la aplicaci&#xF3;n que estemos usando. Hace un tiempo escribí esta <a href="http://blog.darioquintana.com.ar/2006/09/05/reflexion-generacion-de-codigo-modelo-para-ajgenesis/">herramienta</a> que ahora decid&#xED; cambiarla un poco. Ahora escrib&#xED; &#xE9;sta herramienta que la pueden <a href="http://code.google.com/p/darioquintana/downloads/detail?name=AjGenesis.FromAssembly.7z">descargar aqu&#xED;</a>.</p>
<p>Como funciona AjGenesis.FromAssembly? Facil,&#xA0; es una librer&#xED;a que itera sobre un ensamblado especificado y devuelve una lista de Objetos que representan la estructura de las clases:</p>
<p><img id="id" src="http://uooopaa.googlepages.com/AjGenesis.FromAssembly.png" /> </p>
<pre>
<#
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
</pre>
<p>AssemblyManager es la clase encargada de cargar el assembly, una vez hecho esto podemos trabajar con &#xE9;l. </p>
<p>Para obtener la listar las clases en el assembly usamos la clase <em>Collector</em>, y la funci&#xF3;n <em>GetEntities</em>, especificando la ruta del ensamblado.</p>
<p>El template para generar la configuración de IoC en el xml, podría ser similar a este:
<pre>
<#
nsServices = "MyApp.Service"
assemblyName = "MyApp.Service"
moneySign = "$"
oBraces = "{"
cBraces = "}"
include	"${TemplateDir}\Functions.tpl"
#>
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <components>
<#
	for each Entity in Entities
#>
<component id="${Entity.Name}.Service"
	type="${nsServices}.${Entity.Name}Service, ${assemblyName}"
	service ="${nsServices}.I${Entity.Name}Service, ${assemblyName}">
<parameters>
		<${Entity.Name}Dao>${moneySign}${oBraces}${Entity.Name}.Dao${cBraces}
		</${Entity.Name}Dao>
	</parameters>
    </component>
<#
	end for
#>
	</components>
</configuration></pre>
<p>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.</p>
<p><a href="http://code.google.com/p/darioquintana/downloads/detail?name=AjGenesis.FromAssembly.7z"><br />
<h4>Descargar Aquí</h4>
<p></a></p>
<p>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.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.darioquintana.com.ar/2007/11/20/generando-con-ajgenesis-desde-los-assemblies/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Charla de Generaci&#243;n de c&#243;digo en Corrientes</title>
		<link>http://blog.darioquintana.com.ar/2007/11/17/charla-de-generacin-de-cdigo-en-corrientes/</link>
		<comments>http://blog.darioquintana.com.ar/2007/11/17/charla-de-generacin-de-cdigo-en-corrientes/#comments</comments>
		<pubDate>Sat, 17 Nov 2007 15:21:25 +0000</pubDate>
		<dc:creator>Dario Quintana</dc:creator>
				<category><![CDATA[codegeneration]]></category>

		<guid isPermaLink="false">http://blog.darioquintana.com.ar/2007/11/17/charla-de-generacin-de-cdigo-en-corrientes/</guid>
		<description><![CDATA[<p>El miercoles con unos amigos tuvimos la oportunidad de estar en una charla de el querid&#xED;simo <a href="http://msmvps.com/blogs/lopez/archive/2007/11/16/generaci-243-n-de-c-243-digo-y-ajgenesis-en-corrientes.aspx">Angel &#34;Java&#34; Lopez</a> en Corrientes capital. </p> <p>La charla estuvo buena, habl&#xF3; de la realidad del software, un poco sobre la evoluci&#xF3;n de los sistemas y la complejidad que debemos enfrentar hoy d&#xED;a los desarrolladores. Para poder enfrentar [...]]]></description>
			<content:encoded><![CDATA[<p>El miercoles con unos amigos tuvimos la oportunidad de estar en una charla de el querid&#xED;simo <a href="http://msmvps.com/blogs/lopez/archive/2007/11/16/generaci-243-n-de-c-243-digo-y-ajgenesis-en-corrientes.aspx">Angel &quot;Java&quot; Lopez</a> en Corrientes capital. </p>
<p>La charla estuvo buena, habl&#xF3; de la realidad del software, un poco sobre la evoluci&#xF3;n de los sistemas y la complejidad que debemos enfrentar hoy d&#xED;a los desarrolladores. Para poder enfrentar esta complejidad, podemos hacer uso de herramientas de generaci&#xF3;n de c&#xF3;digo y facilitarnos un poco la vida. El materia de la charla lo pueden <a href="http://www.ajlopez.net/ReferenciaVe.php?Id=220">descargar aqu&#xED;</a>. Angel no pod&#xED;a dejar de mostrar a su <a href="http://www.ajlopez.com/ajgenesis/">beb&#xE9;</a> <img src='http://blog.darioquintana.com.ar/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Esta es una de las imagen&#xE9;s de la presentaci&#xF3;n que expuso, y que muestra la realidad de nuestras aplicaciones, existe mucho c&#xF3;digo que se puede generar y otro c&#xF3;digo lo debemos escribir nosotros, y quiz&#xE1;s este c&#xF3;digo pueda ser encapsulado en un framework para nuestro bien y del que lea el c&#xF3;digo.</p>
<p>&#xA0;<img id="id" src="http://uooopaa.googlepages.com/solucionpragmatica.png" /> </p>
<p>Quiz&#xE1;s la generaci&#xF3;n de c&#xF3;digo no sea &quot;la soluci&#xF3;n&quot; pero nos hace la vida m&#xE1;s f&#xE1;cil y se encarga del c&#xF3;digo &quot;aburrido&quot;. Miremos nuestro c&#xF3;digo y seguramente encontraremos c&#xF3;digo que podemos generar. Esto es un primer paso a la factor&#xED;a de Software.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.darioquintana.com.ar/2007/11/17/charla-de-generacin-de-cdigo-en-corrientes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Generando aplicaciones con AjGenesis</title>
		<link>http://blog.darioquintana.com.ar/2007/06/27/generando-aplicaciones-con-ajgenesis/</link>
		<comments>http://blog.darioquintana.com.ar/2007/06/27/generando-aplicaciones-con-ajgenesis/#comments</comments>
		<pubDate>Wed, 27 Jun 2007 03:20:14 +0000</pubDate>
		<dc:creator>Dario Quintana</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[codegeneration]]></category>
		<category><![CDATA[Tool]]></category>
		<category><![CDATA[Visual Basic.Net]]></category>

		<guid isPermaLink="false">http://blog.darioquintana.com.ar/2007/06/27/generando-aplicaciones-con-ajgenesis/</guid>
		<description><![CDATA[<p>Este es el titulo del <a href="http://msmvps.com/blogs/lopez/archive/2007/06/25/generando-aplicaciones-con-ajgenesis.aspx">tutorial</a> que nos deja <a href="http://msmvps.com/blogs/lopez/">Angel</a> en su blog acerca de su querido <a href="http://www.ajlopez.com/ajgenesis/">AjGenesis</a>. </p> <p>Dos puntos que destaca Angel son:</p> <p>- El modelo del que parte es totalmente definible por el usuario <p>- Las tareas y plantillas a aplicar son totalmente programables y controlables</p> <p>Y de estos [...]]]></description>
			<content:encoded><![CDATA[<p>Este es el titulo del <a href="http://msmvps.com/blogs/lopez/archive/2007/06/25/generando-aplicaciones-con-ajgenesis.aspx">tutorial</a> que nos deja <a href="http://msmvps.com/blogs/lopez/">Angel</a> en su blog acerca de su querido <a href="http://www.ajlopez.com/ajgenesis/">AjGenesis</a>. </p>
<p>Dos puntos que destaca Angel son:</p>
<blockquote><p>- El modelo del que parte es totalmente definible por el usuario
<p>- Las tareas y plantillas a aplicar son totalmente programables y controlables</p>
</blockquote>
<p>Y de estos 2 puntos me quedo con el primero que me alcanza y sobra&nbsp;para decir&nbsp;cuan flexible es AjGenesis. Otras herramientas de generación de código&nbsp;muy útiles (vale la redundancia: todas las herramientas de generación de código son útiles) como MyGeneration, permiten la generación de código a partir de un modelo de datos. Esta es una gran diferencia con AjGenesis, esta permite la generación a partir de un modelo libre, no hay restricciones. El modelo lo podemos obtener desde una base de datos, <a href="http://blog.darioquintana.com.ar/2006/09/05/reflexion-generacion-de-codigo-modelo-para-ajgenesis/">a partir de nuestras clases</a>, o podemos ir desarrollandolo de manera artesanal (a mano).</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.darioquintana.com.ar/2007/06/27/generando-aplicaciones-con-ajgenesis/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>using NHibernate.Tool.hbm2ddl</title>
		<link>http://blog.darioquintana.com.ar/2006/11/12/using-nhibernatetoolhbm2ddl/</link>
		<comments>http://blog.darioquintana.com.ar/2006/11/12/using-nhibernatetoolhbm2ddl/#comments</comments>
		<pubDate>Sun, 12 Nov 2006 06:07:38 +0000</pubDate>
		<dc:creator>Dario Quintana</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[codegeneration]]></category>
		<category><![CDATA[NHibernate]]></category>

		<guid isPermaLink="false">http://blog.darioquintana.com.ar/?p=39</guid>
		<description><![CDATA[<p>Una herramienta muy importante de NHibernate, a la vez, deseable por los ORM, es la generación de código.</p> <p>Para generar el DDL de la base de datos, nos podemos valer de la información del esquema, que nos brindan los archivos de mapeo ó mapping files: hbm.xml.</p> <p>Un vez que tenemos bien configurados estos archivos, podemos [...]]]></description>
			<content:encoded><![CDATA[<p>Una herramienta muy importante de NHibernate, a la vez, deseable por los ORM, es la generación de código.</p>
<p>Para generar el DDL de la base de datos, nos podemos valer de la información del esquema, que nos brindan los archivos de mapeo ó mapping files: hbm.xml.</p>
<p>Un vez que tenemos bien configurados estos archivos, podemos generar las tablas con solamente incluir un par de sentencias en .Net y configurar un archivo xml. Tambien se tiene que tener referenciado a NHibernate.</p>
<p>Código en C#:</p>
<pre>using System;
using NHibernate.Cfg;
using  NHibernate.Tool.hbm2ddl;
public class MyClass
{
    public static void Main()
    {
            Configuration config = new Configuration();
            config.Configure();
            SchemaExport exporter = new SchemaExport(config);
            //exporter.SetOutputFile(@"c:testDDL.sql");
            exporter.Drop(true, true);
            exporter.Create(true, true);
    }
}</pre>
<p>Archivo hibernate.cfg.xml (debe ir copiado en el directorio de salida):</p>
<pre>&lt;?xml version="1.0" encoding="utf-8" ?&gt;
&lt;hibernate-configuration  xmlns="urn:nhibernate-configuration-2.0" &gt;
 &lt;session-factory name="NHibernate"&gt;
	&lt;property name="connection.provider"&gt;NHibernate.Connection.DriverConnectionProvider&lt;/property&gt;
	&lt;property name="connection.driver_class"&gt;NHibernate.Driver.FirebirdClientDriver&lt;/property&gt;
	&lt;property name="connection.connection_string"&gt;
	ServerType=1;
	User=sysdba;password=masterkey;Database=C:ruraldata.fdb;
	Pooling=false
	&lt;/property&gt;
	&lt;property name="show_sql"&gt;true&lt;/property&gt;
	&lt;property name="dialect"&gt;NHibernate.Dialect.FirebirdDialect&lt;/property&gt;
	&lt;property name="use_outer_join"&gt;true&lt;/property&gt;
	&lt;property name="query.substitutions"&gt;true 1, false 0, yes 'Y', no 'N'&lt;/property&gt;

	&lt;mapping assembly="RuralSolution.Entities" /&gt;

 &lt;/session-factory&gt;
&lt;/hibernate-configuration&gt;</pre>
<p>En este caso es la exportación del schema de una base de datos Firebird embebida.</p>
<p>Esta herramienta me ha sido de mucha utilidad. Estoy desarrollando una aplicación en SQL Server 2005 y NHibernate, pero, me dí cuenta que la aplicación debía ser portable, de modo que tuve que migrar la base de datos a una portable, y como Firebird está pasando todos los test de NH, la elegí. Ya tenía los hbm, así que no requirió trabajo demás.</p>
<p>Importante para la generación con Firebird: en el directorio de salida entonces tendriamos que tener: fbembed.dll, FirebirdSql.Data.FirebirdClient.dll, y hibernate.cfg.xml.</p>
<p>Si quieren saber como trabajar con MyGeneration y Firebird embedded léanse este <a href="http://lmsilvero.blogspot.com/2006/11/tip-mygeneration-firebird-embedded.html" title="Configurar el uso de MyGeneration + Firebird embedded">post </a>de mi amigo Matias.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.darioquintana.com.ar/2006/11/12/using-nhibernatetoolhbm2ddl/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Reflexion + Generación de código = Modelo para AjGenesis</title>
		<link>http://blog.darioquintana.com.ar/2006/09/05/reflexion-generacion-de-codigo-modelo-para-ajgenesis/</link>
		<comments>http://blog.darioquintana.com.ar/2006/09/05/reflexion-generacion-de-codigo-modelo-para-ajgenesis/#comments</comments>
		<pubDate>Tue, 05 Sep 2006 08:45:00 +0000</pubDate>
		<dc:creator>Dario Quintana</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[codegeneration]]></category>
		<category><![CDATA[db4o]]></category>

		<guid isPermaLink="false">http://blog.darioquintana.com.ar/?p=32</guid>
		<description><![CDATA[<p>Estuve viendo <a href="http://www.ajlopez.com/ajgenesis">AjGenesis</a>, que es un generador de codigo escrito por Angel &#8220;Java&#8221; Lopez, la verdad muy útil. Se puede generar código para cualquier lenguaje que estén escritas las plantillas, y sino están escritas, las podés escribir con mucha facilidad, ya que vienen algunas plantillas de ejemplo como para ir conociendo el lenguaje AjGenesis. [...]]]></description>
			<content:encoded><![CDATA[<p>Estuve viendo <a href="http://www.ajlopez.com/ajgenesis">AjGenesis</a>, que es un generador de codigo escrito por Angel &#8220;Java&#8221; Lopez, la verdad <strong>muy útil</strong>. Se puede generar código para cualquier lenguaje que estén escritas las plantillas, y sino están escritas, las podés escribir con mucha facilidad, ya que vienen algunas plantillas de ejemplo como para ir conociendo el lenguaje AjGenesis. Para poder generar código se requiere, como todo generador de cógido: un modelo. Este modelo está escrito en XML.</p>
<p>Por ahora, AjGenesis, no cuenta con una interfaz amigable para un usuario final, pero funciona y genera de lo lindo. Para comenzar a usarlo se haría así:</p>
<pre>#AjGenesis.Console.exe ModelsModel.xml Tasksgenerate.ajg </pre>
<p>Donde Model.xml contiene los links a los otros archivos xml que contienen las descripciones de las entidades. Generate.ajg es el archivo de tareas que el generador vá a usar, vendría a ser como el archivo main para generar, él se encargará de buscar los templates. Por lo general el generate.ajg, tendrá un loop que iterará entre todas las entidades de negocio y así ir generando los artefactos en el lenguaje en que esten trabajando.</p>
<p>Ahora bien, como hago para obtener de forma automática el modelo?</p>
<p>En un proyecto que empecé con db4o, y el diseño de las business entities lo hacía con el Class Designer del Visual Studio 2005, se me ocurrió que el modelo de clases lo podía obtener del assembly donde están las clases de negocio. Es decir, tengo un proyecto que tiene adentro solo las clases de negocio, como podrían ser: Clientes, Factura, LineaFactura, etc.</p>
<p>Así nació <a href="http://uooopaa.googlepages.com/GenerateFromAssemblyv0.2.zip">GenerateFromAssembly</a>, que es una herramienta muy sencilla, que via Reflexion, itera entre las clases de la dll, y obtiene sus propiedades con sus respectivos tipos de datos.</p>
<p>Actualmente la estoy usando en este proyecto, ya no con db4o, estoy usando NHibernate contra un Sql Server, pero la herramienta funciona igual, y genera el modelo como lo debe hacer.</p>
<p>Cabe destacar que la idea de la herramienta es: A partir del diseño de clases generar un assembly de .Net, y a partir de él, generar el modelo, y con el modelo y los templates de AjGenesis: obtengo mis artefactos, ya sean: Web Services, artefactos de capa de negocio, de capa de acceso a datos, o formularios web/windows.</p>
<p>Existe un issue: los tipos de datos genericos. Por ejemplo, si tengo IList&lt;Cliente&gt;, el CLR los trata como si fueran IList´1[Cliente], es una cuestión de nombres, nada más. De modo que en el código final generado con AjGenesis obtendremos los tipos de datos con este último esquema. Se podría hacer otra herramienta, que al codigo final generado, lo masajee con algunas expresiones regulares y exprese los generic tipes segun el lenguaje .Net que estemos usando.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.darioquintana.com.ar/2006/09/05/reflexion-generacion-de-codigo-modelo-para-ajgenesis/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

