<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://msmvps.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Angel "Java" Lopez : AjGenesis, C&amp;#243;digo Abierto</title><link>http://msmvps.com/blogs/lopez/archive/tags/AjGenesis/C_26002300_243_3B00_digo+Abierto/default.aspx</link><description>Tags: AjGenesis, C&amp;#243;digo Abierto</description><dc:language>en</dc:language><generator>CommunityServer 2008.5 SP2 (Build: 40407.4157)</generator><item><title>Modelos para Generación de Código en AjGenesis</title><link>http://msmvps.com/blogs/lopez/archive/2010/03/12/modelos-para-generaci-243-n-de-c-243-digo-en-ajgenesis.aspx</link><pubDate>Fri, 12 Mar 2010 10:01:36 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1761537</guid><dc:creator>lopez</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/lopez/rsscomments.aspx?PostID=1761537</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2010/03/12/modelos-para-generaci-243-n-de-c-243-digo-en-ajgenesis.aspx#comments</comments><description>&lt;p&gt;Quisiera hoy enumerar y pasar una corta revista a las opciones que tenemos para escribir, describir un modelo en&amp;#160; &lt;a href="http://www.codeplex.com/ajgenesis" target="_blank"&gt;AjGenesis&lt;/a&gt;, mi proyecto open source de generación de códgio.&lt;/p&gt;  &lt;p&gt;Una de las ideas básicas de AjGenesis es tener un modelo de libre definición, como punto de partida. No es un modelo fijo. ¿Qué significa esto? Que podemos crear y usar nuestro propio modelo. Veamos un ejemplo concreto. Si quisiéramos modelar una clásica aplicación &amp;quot;Hello, World”, podemos comenzar escribiendo un modelo simple como el siguiente:&lt;/p&gt;  &lt;pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,courier,monospace;font-size:12px;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Project&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Company&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;ajlopez.com&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
   &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Message&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Hello, World&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Message&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Project&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/pre&gt;

&lt;p&gt;Y si queremos tener múltiples mensajes, lo extendemos en cualquier momento a:&lt;/p&gt;

&lt;pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,courier,monospace;font-size:12px;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Project&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Messages&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Message&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Hello, World One&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Message&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Message&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Hello, World Two&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Message&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Message&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Hello, World Three&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Message&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Messages&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Project&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;

&lt;p&gt;Más información sobre este ejemplo sencillo en &lt;a href="http://ajlopez.wordpress.com/2007/01/29/code-generation-with-ajgenesis-a-hello-world-application/" target="_blank"&gt;A Hello World Application in AjGenesis&lt;/a&gt;. (&lt;a href="http://msmvps.com/blogs/lopez/archive/2006/11/19/generando-c-digo-hello-world-con-ajgenesis.aspx" target="_blank"&gt;Generando Código: Hello World con AjGenesis&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Pero XML no sólo una de las versiones SERIALIZADAS de un modelo (el modelo es abstracto, AjGenesis lo maneja en memoria, y lo recupera desde donde lo digamos, en las primeras versiones, sólo de XML). En la versión del trunk podemos escribir y usar el modelo serializado como texto:&lt;/p&gt;

&lt;pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,courier,monospace;font-size:12px;"&gt;Project
    Messages
        Message = &amp;quot;&lt;span style="color:#8b0000;"&gt;Hello, World One&lt;/span&gt;&amp;quot;
        Message = &amp;quot;&lt;span style="color:#8b0000;"&gt;Hello, World Two&lt;/span&gt;&amp;quot;
        Message = &amp;quot;&lt;span style="color:#8b0000;"&gt;Hello, World Three&lt;/span&gt;&amp;quot;
    &lt;span style="color:#0000ff;"&gt;End&lt;/span&gt; Messages
&lt;span style="color:#0000ff;"&gt;End&lt;/span&gt; Project
&lt;/pre&gt;&lt;/pre&gt;

&lt;p&gt;Más información sobre modelos textuales en&lt;/p&gt;

&lt;p&gt;&lt;a href="http://ajlopez.wordpress.com/2008/09/28/textual-model-for-code-generation-in-ajgenesis/" target="_blank"&gt;Textual Model for Code Generation in AjGenesis&lt;/a&gt;

  &lt;br /&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2008/09/29/modelo-textual-para-generaci-243-n-de-c-243-digo-con-ajgenesis.aspx" target="_blank"&gt;Modelo textual para generación de código con AjGenesis&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Si queremos describir una Entidad en una especie de modelo de dominio, podemos escribir algo como este XML de libre formato:&lt;/p&gt;

&lt;pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,courier,monospace;font-size:12px;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;?&lt;/span&gt;xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;ISO-8859-1&amp;quot; standalone=&amp;quot;yes&amp;quot;&lt;span style="color:#0000ff;"&gt;?&amp;gt;&lt;/span&gt;
&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Entity&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Employee&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Description&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Employee&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Description&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;SetName&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Employees&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;SetName&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Descriptor&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Employee&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Descriptor&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;SetDescriptor&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Employees&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;SetDescriptor&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;SqlTable&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;employees&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;SqlTable&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Properties&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Property&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Id&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Description&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Id&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Description&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Type&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Id&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Type&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;SqlType&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;int&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;SqlType&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Property&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Property&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;EmployeeCode&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Description&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Code&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Description&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Type&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Text&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Type&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;SqlType&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;varchar(20)&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;SqlType&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Property&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Property&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;LastName&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Description&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Last Name&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Description&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Type&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Text&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Type&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;SqlType&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;varchar(100)&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;SqlType&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Property&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Property&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;FirstName&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Description&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;First Name&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Description&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Type&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Text&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Type&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;SqlType&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;varchar(100)&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;SqlType&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Property&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Property&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;IdDepartment&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Description&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Department&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Description&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Type&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;IdRef&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Type&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;SqlType&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;int&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;SqlType&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Reference&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Department&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Reference&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Property&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Properties&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Entity&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/pre&gt;

&lt;p&gt;Más detalles del uso de un modelo como éste en &lt;a href="http://ajlopez.wordpress.com/2007/11/12/application-generation-using-ajgenesis/" target="_blank"&gt;Application Generation using AjGenesis&lt;/a&gt;. (&lt;a href="http://msmvps.com/blogs/lopez/archive/2007/06/25/generando-aplicaciones-con-ajgenesis.aspx" target="_blank"&gt;Generando aplicaciones con AjGenesis&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Pero si leer XML nos hace doler los ojos, podemos volver a escribir el mismo modelo en forma textual. El ejemplo de arriba, abreviado:&lt;/p&gt;

&lt;pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,courier,monospace;font-size:12px;"&gt;Entity Employee
    Description = &amp;quot;&lt;span style="color:#8b0000;"&gt;Employee&lt;/span&gt;&amp;quot;
    SetName = &amp;quot;&lt;span style="color:#8b0000;"&gt;Employees&lt;/span&gt;&amp;quot;
    ...
    Properties
        &lt;span style="color:#0000ff;"&gt;Property&lt;/span&gt; Id
            ...
        &lt;span style="color:#0000ff;"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;Property&lt;/span&gt;
            ...
        &lt;span style="color:#0000ff;"&gt;Property&lt;/span&gt; Name
        &lt;span style="color:#0000ff;"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;Property&lt;/span&gt;
    &lt;span style="color:#0000ff;"&gt;End&lt;/span&gt; Properties
&lt;span style="color:#0000ff;"&gt;End&lt;/span&gt; Entity&lt;/pre&gt;&lt;/pre&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;No lo implementé, pero quiero agregar hojas de cálculo como modelos:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.ajlopez.com/images/articles2/ajgenesismodel1.png" alt="" /&gt; &lt;/p&gt;

&lt;p&gt;Escribí sobre eso en: &lt;a href="http://ajlopez.wordpress.com/2008/10/02/another-model-for-ajgenesis/" target="_blank"&gt;Another Model for AjGenesis&lt;/a&gt; (&lt;a href="http://msmvps.com/blogs/lopez/archive/2008/10/03/otro-modelo-para-ajgenesis.aspx" target="_blank"&gt;Otro modelo para AjGenesis&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Pero a veces, queremos usar algo ya existente como fuente de nuestro modelo. Y con AjGenesis, podemos! Una de las más “populares” fuentes de seudo-modelos es la base de datos misma. En mi opinión, la base de datos no es el modelo ideal, pero, dependiendo del proyecto y de nuestras necesidades, puede ser una solución pragmática (recordemos, AjGenesis y generación de código son soluciones pragmáticas a algunos problemas en el desarrollo de software), así que no dudemos en adoptar fuentes convenientes, sólo hay que estar advertidos de sus limitaciones.&lt;/p&gt;

&lt;p&gt;Escribi algún ejemplo en: &lt;a href="http://ajlopez.wordpress.com/2009/11/28/generating-a-model-from-the-database-using-ajgenesis/" target="_blank"&gt;Generating a Model From the Database Using AjGenesis&lt;/a&gt; (&lt;a href="http://msmvps.com/blogs/lopez/archive/2009/12/02/generating_2D00_a_2D00_model_2D00_from_2D00_the_2D00_database_2D00_using_2D00_ajgenesis.aspx" target="_blank"&gt;Generando un modelo desde la base de datos usando AjGenesis&lt;/a&gt;) y en &lt;a href="http://ajlopez.wordpress.com/2008/04/21/ajgenesis-generating-the-model-from-the-database/" target="_blank"&gt;AjGenesis: Generating the Model from the Database&lt;/a&gt; (&lt;a href="http://msmvps.com/blogs/lopez/archive/2007/11/25/ajgenesis-modelo-desde-la-base-de-datos.aspx" target="_blank"&gt;AjGenesis: Modelo desde la base de datos&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;AjGenesis nació y fue diseñado para sobrevivir al “fashion development”: no está orientado a una tecnología en particular, a una plataforma, framework, lenguaje determinado. Puede generar cualquier cosa que se un artefacto de texto (y yo diría que más): Java, C#, VB.NET, PHP, archivos de configuración, XML, scripts de base de datos, aún COBOL. Podemos escribir tareas, plantillas y lo que queramos generar, en cualquier momento. Podemos empezar en pequeño, e ir creciendo, agregando más abstraciones y transformaciones. Pero tareas y templates son temas que merecen otro post. Dicho esto, podemos usar como modelo un proyecto complilado. Como ejemplo, escribí sobre el trabajo de Dario Quintana usando .NET y Reflection en at:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://ajlopez.wordpress.com/2008/04/23/ajgenesis-generating-the-model-from-assemblies/" target="_blank"&gt;AjGenesis: Generating the model from assemblies&lt;/a&gt;

  &lt;br /&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2007/11/27/ajgenesis-modelo-generado-desde-los-assemblies.aspx" target="_blank"&gt;AjGenesis: Modelo generado desde los assemblies&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;En el mundo Java, se acostumbra a generar código desde anotaciones en el propio código (mencionaría como ejemplo al venerable XDocLet). O desde archivos de configuración, la gente de Hibernate tiene hbm2java. NHibernate, la más popular librería open source de Object Relational Mapping en el mundo .NET, no tiene esas herramientas. Como en Java, AjGenesis puede usar los tags meta que se agregab a los archivos de mapeo .hbm, para usarlos en la generación de código. Vean:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://ajlopez.wordpress.com/2009/11/22/generating-code-with-ajgenesis-using-nhibernate-hbm-files/" target="_blank"&gt;Generating Code with AjGenesis using NHibernate Hbm Mapping Files&lt;/a&gt;

  &lt;br /&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2009/11/23/generating_2D00_code_2D00_with_2D00_ajgenesis_2D00_using_2D00_nhibernate_2D00_hbm_2D00_files.aspx" target="_blank"&gt;Generando código con AjGenesis usando archivos de mapeo de NHibernate&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;(Tengo un ejemplo más completo en el trunk actual, que genera una solución completa en ASP.NET y NHibernate).&lt;/p&gt;

&lt;p&gt;Pueden bajarse el proyecto desde el trunk de código en:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.codeplex.com/ajgenesis"&gt;http://www.codeplex.com/ajgenesis&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Próximos tópicos: tareas, plantillas, abstracciones vs “technicalities”, modelos en memoria, transformaciones modelo a modelo, completando el modelo, tomando decisiones, sistemas expertos e inteligencia artificial aplicada a la generación de código y AjGenesis.&lt;/p&gt;

&lt;p&gt;Nos leemos!&lt;/p&gt;

&lt;p&gt;Angel &amp;quot;Java&amp;quot; Lopez 
  &lt;br /&gt;&lt;a href="http://www.ajlopez.com"&gt;http://www.ajlopez.com&lt;/a&gt; 

  &lt;br /&gt;&lt;a href="http://twitter.com/ajlopez"&gt;http://twitter.com/ajlopez&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1761537" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/Generaci_26002300_243_3B00_n+de+C_26002300_243_3B00_digo/default.aspx">Generaci&amp;#243;n de C&amp;#243;digo</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Desarrollo+de+Software/default.aspx">Desarrollo de Software</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/C_26002300_243_3B00_digo+Abierto/default.aspx">C&amp;#243;digo Abierto</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/AjGenesis/default.aspx">AjGenesis</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Proyectos+de+C_F300_digo+Abierto/default.aspx">Proyectos de Código Abierto</category></item><item><title>"Ver la luz" con generación de código y AjGenesis</title><link>http://msmvps.com/blogs/lopez/archive/2008/06/10/quot-ver-la-luz-quot-con-generaci-243-n-de-c-243-digo-y-ajgenesis.aspx</link><pubDate>Tue, 10 Jun 2008 14:02:59 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1633619</guid><dc:creator>lopez</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/lopez/rsscomments.aspx?PostID=1633619</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2008/06/10/quot-ver-la-luz-quot-con-generaci-243-n-de-c-243-digo-y-ajgenesis.aspx#comments</comments><description>&lt;p&gt;Ayer dí una charla gratuita sobre generación de código, usando &lt;a href="http://www.ajlopez.com/ajgenesis" target="_blank"&gt;AjGenesis&lt;/a&gt;. Espero haber transmitido la idea de que es más que generación de código, y que va más allá de la tecnología actual.&lt;/p&gt; &lt;p&gt;Quisiera enumerar algunos posts relacionados con el tema, y comentarlos, así como enumerar enlaces y recursos.&lt;/p&gt; &lt;h3&gt;Posts sobre generación de código&lt;/h3&gt; &lt;p&gt;&lt;a title="Sobre la generaci&amp;oacute;n de c&amp;oacute;digo" href="http://msmvps.com/blogs/lopez/archive/2007/08/02/sobre-la-generaci-243-n-de-c-243-digo.aspx"&gt;Sobre la generación de código&lt;/a&gt;&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;Este es el primer post a leer. Vemos ahí que el cambio de tecnología es una constante en la historia de desarrollo de software, y que no se ve en el horizonte una unificación de nada, ni de lenguajes ni de plataformas. Cada año que pasa, sabemos más de hacer sistemas, pero curiosamente, cada sistema nuevo necesita más codigo que el anterior, en general. Aún usando tecnologías que nos alivian el trabajo, por ejemplo, algún ORM (Object Relational Mapper), si la tecnología triunfa, el propio mercado nos lleva a hacer sistemas más complejos y grandes, y lo que ahorramos en código a escribir, luego lo perdemos en la mayor complejidad de lo sistemas que tenemos a nuestro alcance construir.&lt;/p&gt; &lt;p&gt;También se enumeran otras alternativas a la generación de código, y sus problemas. Las herramientas CASE son muy rígidas, o generales o abarcativas, así como UML y otras iniciativas. Lo que necesitamos son modelos específicos de nuestro dominio, y poder generar lo que querramos, de la forma que nos convenga. De ahí la necesidad de contar con un generador de código que no esté orientado a una tecnología a generar en particular, que sea de código abierto, y que genere lo que nosotros le indicamos, no lo que los autores de la herramienta quieren o pensaron inicialmente.&lt;/p&gt; &lt;p&gt;El usar frameworks propietarios, quedarse en una sola tecnología, tratar de generar todo en runtime apelando a metadata, o generar código desde XML aplicando transformaciones XSLT, son alternativas que creo que son inferiores o más complejas, como se explica en ese post.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;a title="Generando C&amp;oacute;digo- Hello World con AjGenesis" href="http://msmvps.com/blogs/lopez/archive/2006/11/19/generando-c-digo-hello-world-con-ajgenesis.aspx"&gt;Generando Código- Hello World con AjGenesis&lt;/a&gt;&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;Esta es la &amp;quot;prueba ácida&amp;quot; de todo generador de código. Si una herramienta de ese tipo no nos ayuda a crear programas &amp;quot;Hola mundo&amp;quot;, con variantes, en distintas tecnologías, entonces no es lo bastante flexible. AjGenesis hace hincapié en la flexibilidad, la adaptibilidad a lo que Uds quieran producir, sin atarlos a una forma o metadata en particular.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;a title="Generando aplicaciones con AjGenesis" href="http://msmvps.com/blogs/lopez/archive/2007/06/25/generando-aplicaciones-con-ajgenesis.aspx"&gt;Generando aplicaciones con AjGenesis&lt;/a&gt;&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;Un post algo viejo, pero que muestra cómo se pueden generar aplicaciones no triviales con esta herramienta.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;a title="AjGenesis- Modelo generado desde los assemblies" href="http://msmvps.com/blogs/lopez/archive/2007/11/27/ajgenesis-modelo-generado-desde-los-assemblies.aspx"&gt;AjGenesis- Modelo generado desde los assemblies&lt;/a&gt;&lt;br /&gt;&lt;a title="AjGenesis- Modelo desde la Base de Datos" href="http://msmvps.com/blogs/lopez/archive/2007/11/25/ajgenesis-modelo-desde-la-base-de-datos.aspx"&gt;AjGenesis- Modelo desde la Base de Datos&lt;/a&gt;&lt;br /&gt;&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;Posts sobre cómo el modelo puede partir de otras fuentes, cualquiera que Uds. vean que sea conveniente. Luego, la propia herramienta puede mejorar, completar el modelo, hacer inferencias, o Uds. mismos completarlos, por ejemplo, si el modelo de base de datos no es lo bastante rico para darnos algo de semántica sobre el sistema que tenemos entre manos.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;a title="Generando c&amp;oacute;digo para NHibernate (Parte 3)" href="http://msmvps.com/blogs/lopez/archive/2007/10/29/generando-c-243-digo-para-nhibernate-parte-3.aspx"&gt;Generando código para NHibernate (Parte 3)&lt;/a&gt;&lt;br /&gt;&lt;a title="Generando c&amp;oacute;digo para NHibernate (Parte 2)" href="http://msmvps.com/blogs/lopez/archive/2007/09/25/generando-c-243-digo-para-nhibernate-parte-2.aspx"&gt;Generando código para NHibernate (Parte 2)&lt;/a&gt;&lt;br /&gt;&lt;a title="Generando c&amp;oacute;digo para NHibernate (Parte 1)" href="http://msmvps.com/blogs/lopez/archive/2007/08/05/generando-c-243-digo-para-nhibernate-parte-1.aspx"&gt;Generando código para NHibernate (Parte 1)&lt;/a&gt;&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;Para ver que pueden usar AjGenesis para facilitar el desarrollo usando alguna librería reconocida por la comunidad, pueden leer esta serie de enlaces, donde gracias a una idea de Omar&amp;nbsp;del valle Rodríguez, se desarrollaron templates para usar NHibernate, y generar hasta una capa de presentación web para probar lo generado.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;a title="Hacia el AjGenesis Recipes" href="http://msmvps.com/blogs/lopez/archive/2007/11/20/hacia-el-ajgenesis-recipes.aspx"&gt;Hacia el AjGenesis Recipes&lt;/a&gt;&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;Es un trabajo en progreso, para incorporar interacción con el usuario durante el proceso de generación de código.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;a title="Usando AjGenesis y NAnt" href="http://msmvps.com/blogs/lopez/archive/2007/11/01/usando-ajgenesis-y-nant.aspx"&gt;Usando AjGenesis y NAnt&lt;/a&gt;&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;Explicación y enlaces para usar AjGenesis desde NAnt. Si alguien necesita una interfaz gráfica NAnt-GUI, pueden bajarla desde &lt;a title="NAnt-GUI" href="http://groups.google.com/group/codegeneration/t/2aef426f02370d1"&gt;NAnt-GUI&lt;/a&gt;&amp;nbsp;(preparado por Carlos Marcelo Santos, del &lt;a href="http://groups.google.com/group/codegeneration" target="_blank"&gt;grupo de generación de código&lt;/a&gt;)&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;a title="Genesis Studio- una IDE para AjGenesis" href="http://msmvps.com/blogs/lopez/archive/2007/12/24/genesis-studio-una-ide-para-ajgenesis.aspx"&gt;Genesis Studio- una IDE para AjGenesis&lt;/a&gt;&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;No todo lo tienen que hacer desde la línea de comando, o desde el NAnt/NAnt-GUI. El bueno de Jonathan Cisneros desarrolló esta herramienta WinForm, con sintaxis de color y muchas mejoras en la experiencia de usuario, que pueden bajar desde:&lt;/p&gt; &lt;p&gt;&lt;a title="http://www.codeplex.com/ajgenesisstudio" href="http://www.codeplex.com/ajgenesisstudio"&gt;http://www.codeplex.com/ajgenesisstudio&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;a title="Preservando c&amp;oacute;digo en AjGenesis" href="http://msmvps.com/blogs/lopez/archive/2007/11/11/preservando-c-243-digo-en-ajgenesis.aspx"&gt;Preservando código en AjGenesis&lt;/a&gt;&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;Si necesitan generar código, pero luego modificarlo, pueden usar algunas capacidades de AjGenesis para delimitar qué parte regenerar y cuales conservan.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;a title="Code Generation as a Service" href="http://msmvps.com/blogs/lopez/archive/2008/04/03/code-generation-as-a-service.aspx"&gt;Code Generation as a Service&lt;/a&gt;&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;La última adición al AjGenesis: ahora pueden generar código usando una interfaz web. Esto permite que&amp;nbsp;ya sea en Internet, o desde la intranet de su empresa, puedan generar código controlado, que cumpla con los estándares que se hayan adoptado.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Más posts sobre AjGenesis en&lt;/p&gt; &lt;p&gt;&lt;a title="AjGenesis" href="http://msmvps.com/blogs/lopez/archive/tags/AjGenesis/default.aspx"&gt;AjGenesis&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Si necesitan pasarle información a alguien que no maneja el español, pueden probar con mis artículos en &amp;quot;Anglish&amp;quot; (Angel&amp;#39;s English):&lt;/p&gt; &lt;p&gt;&lt;a title="http://ajlopez.wordpress.com/category/ajgenesis" href="http://ajlopez.wordpress.com/category/ajgenesis"&gt;http://ajlopez.wordpress.com/category/ajgenesis&lt;/a&gt;&lt;/p&gt; &lt;h3&gt;Enlaces&lt;/h3&gt; &lt;p&gt;EL sitio sobre generación de código es&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.codegeneration.net"&gt;http://www.codegeneration.net&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Ahí encontraran comentarios, herramientas, preguntas frecuentes sobre generación de código en general. Tienen una base de datos de herramientas publicadas. Hay enlaces sobre generación de código para distintas tecnologías, como Java, .NET, PHP y también temas de MDA (Model-Driven Architecture).&lt;/p&gt; &lt;p&gt;Otros enlaces que tratamos en las charlas son:&lt;/p&gt; &lt;p&gt;&lt;a title="CodeSmith Tools - The best .NET template based source code" href="http://www.codesmithtools.com/"&gt;CodeSmith Tools&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a title="MyGeneration Software" href="http://www.mygenerationsoftware.com/"&gt;MyGeneration Software&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a title="AndroMDA.org - Home" href="http://www.andromda.org/"&gt;AndroMDA.org - Home&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Mantengo todo tipo de enlaces relativos a generación de código en&lt;/p&gt; &lt;p&gt;&lt;a href="http://del.icio.us/ajlopez/codegeneration"&gt;http://del.icio.us/ajlopez/codegeneration&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;h3&gt;Lista de correo sobre generación de código&lt;/h3&gt; &lt;p&gt;Existe un Google Group que se puede consultar por email, en español, dedicado a la generación de código. Ahí, además de otros temas, se trata de generación de código con AjGenesis, la generación de templates. En los archivos del grupo se publican ejemplos armados por los miembros.&lt;/p&gt; &lt;p&gt;Pueden ver los mensajes y suscribirse, en:&lt;/p&gt; &lt;p&gt;&lt;a title="http://groups.google.com/group/codegeneration" href="http://groups.google.com/group/codegeneration"&gt;http://groups.google.com/group/codegeneration&lt;/a&gt;&lt;/p&gt; &lt;h3&gt;Conclusión&lt;/h3&gt; &lt;p&gt;Espero que quede claro que lo importante es usar generación de código como solución pragmática, pero basado en la abstracción de un modelo. Hacer el ejercicio de abstracción de generar un modelo adecuado para lo que necesitemos, es un &amp;quot;must&amp;quot; que me parece el primer paso para separarnos de los problemas de cambios en las tecnologías, herramientas y plataformas.&lt;/p&gt; &lt;p&gt;Luego, el modelo debe ser de libre definición. Y el texto o código generado, también: debe ser el tipo de texto o código que hubiéramos generado nosotros mismos. Finalmente, la herramienta de generación de código tiene que estar disponible en código totalmente abierto, para que se pueda extender, entender o usar de la forma que querramos.&lt;/p&gt; &lt;p&gt;Tengo que escribir más sobre la importancia del modelo, y que pueden hacer el suyo propio: no hay modelo fijo, pueden partir desde la base de datos, desde los archivos XML de los ejemplos, o desde donde quieran. También tengo que escribir sobre la posibilidad de hacer modelos que se deriven de otros modelos. Y escribir haciendo énfasis en que lo que construimos, en realidad, es un sistema experto. De ahí, que desde el principio, incorporé un lenguaje de programación que puede tomar decisiones, completar y modificar el modelo.&lt;/p&gt; &lt;p&gt;Como ven, con AjGenesis, ¡sky is the limit! :-)&lt;/p&gt; &lt;p&gt;Nos leemos!&lt;/p&gt; &lt;p&gt;Angel &amp;quot;Java&amp;quot; Lopez&lt;br /&gt;&lt;a href="http://www.ajlopez.com/"&gt;http://www.ajlopez.com/&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1633619" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/PHP/default.aspx">PHP</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Arquitectura/default.aspx">Arquitectura</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Generaci_26002300_243_3B00_n+de+C_26002300_243_3B00_digo/default.aspx">Generaci&amp;#243;n de C&amp;#243;digo</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Desarrollo+de+Software/default.aspx">Desarrollo de Software</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/NHibernate/default.aspx">NHibernate</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/C_26002300_243_3B00_digo+Abierto/default.aspx">C&amp;#243;digo Abierto</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/C+Sharp/default.aspx">C Sharp</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/VB.NET/default.aspx">VB.NET</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/AjGenesis/default.aspx">AjGenesis</category></item><item><title>AjGenesis: Modelo desde la Base de Datos</title><link>http://msmvps.com/blogs/lopez/archive/2007/11/25/ajgenesis-modelo-desde-la-base-de-datos.aspx</link><pubDate>Sun, 25 Nov 2007 15:15:29 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1355469</guid><dc:creator>lopez</dc:creator><slash:comments>5</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/lopez/rsscomments.aspx?PostID=1355469</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2007/11/25/ajgenesis-modelo-desde-la-base-de-datos.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://www.ajlopez.com/ajgenesis"&gt;AjGenesis&lt;/a&gt; se caracteriza por partir de uno o varios modelos, libres de definición, para generar artefactos de texto, usando tareas y plantillas programables. Cuando inicié el proyecto, recuerdo haber leído el libro de &lt;a href="http://gendotnet.com/" target="_blank"&gt;Kathleen Dollard&lt;/a&gt; &lt;a href="http://www.amazon.com/exec/obidos/ASIN/1590591372/qid%3D1103643269/sr%3D11-1/ref%3Dsr_11_1/104-5797382-2343919" target="_blank"&gt;Code Generation in Microsoft .NET&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Una de las recomendaciones de la buena de Dollard, es tomar metadata de algún lugar, por ejemplo la base. Como no creo que toda la metadata esté en alguna parte, me incliné desde el principio por un modelo libre (también me aparté rápidamente del camino de Dollard, basado en generar código basado en transformaciones de XSLT, que es el &amp;quot;camino del diablo&amp;quot;, no lo intenten en sus casas, sin avisar a sus padres...;-). Hay varios puntos que me interesaron de la postura de Dollard, será cuestión de escribir más adelante un post comentando el libro.&lt;/p&gt; &lt;p&gt;Pero no hay que descartar el tomar metadata, información que nos pueda servir, de otras fuentes, la más común es la base de datos que tengamos entre manos. Recordemos que la generación de código es una solución pragmática, no debemos dejar de usar lo que nos resulte conveniente para el proyecto en el que estemos trabajando.&lt;/p&gt; &lt;p&gt;Así que ya hace unos meses, puse un pequeño ejemplo dentro de los que vienen en el AjGenesis. Pueden verlo en la&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.codeplex.com/ajgenesis/Release/ProjectReleases.aspx?ReleaseId=7262" target="_blank"&gt;AjGenesis Versión 0.5&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Está en la carpeta examples\LoadDB.&lt;/p&gt; &lt;p&gt;Trabaja como ejemplo de consulta de esquema contra una base Northwind que tengamos en nuestro MS SQL Server. Desde ese directorio, en una línea de comando, ejecutamos&lt;/p&gt; &lt;p&gt;&lt;font face="Consolas"&gt;make&lt;/font&gt;&lt;/p&gt; &lt;p&gt;Este comando ejecuta una tarea de AjGenesis:&lt;/p&gt; &lt;p&gt;&lt;font face="Consolas"&gt;..\..\bin\AjGenesis.Console Tasks\DbProcess.ajg&lt;br /&gt;pause&lt;/font&gt; &lt;p&gt;Se conecta a la base:&lt;/p&gt; &lt;p&gt; &lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:e6cd5e30-c2b9-4ea3-a7c8-a3457b3262e0" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:White;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;white-space:pre-wrap;word-wrap:break-word;"&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;PrintLine&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Connection&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;

AssemblyManager.LoadWithPartialName(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;System.Data&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;)

con &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; System.Data.SqlClient.SqlConnection()

&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;PrintLine&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;ConnectionString&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;

con.ConnectionString &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;server=(local);uid=sa;database=Northwind&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;

&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;PrintLine&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Command&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;

cmd &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; System.Data.SqlClient.SqlCommand()

cmd.Connection &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; con
cmd.CommandText &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;select * from Information_Schema.Tables&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;

con.Open()
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Uso la información que está en Information_Schema.Tables. Observen el uso del nuevo AssemblyManager, que permite cargar assemblies (tendría que revisar si es necesario cargar el System.Data, y si puedo dejar de usar LoadWithPartialName que ahora en .NET 2.0 está &amp;quot;deprecated&amp;quot;)&lt;/p&gt;
&lt;p&gt;Luego, consigue los nombres de las tablas:&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:09916ab7-2bfd-4732-b2bc-56841cc1870c" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:White;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;white-space:pre-wrap;word-wrap:break-word;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;dr &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; cmd.ExecuteReader()

TableNames &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; System.Collections.ArrayList()

&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;while&lt;/span&gt;&lt;span style="color:#000000;"&gt; dr.Read()
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;PrintLine&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Table &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#000000;"&gt; dr.Item(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Table_Name&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;) &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;: &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#000000;"&gt; dr.Item(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Table_Type&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
    TableName &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; dr.Item(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Table_Name&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; dr.Item(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Table_Type&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;)&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;BASE TABLE&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;then&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        TableNames.Add(TableName)
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;end&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;end&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;while&lt;/span&gt;&lt;span style="color:#000000;"&gt;

dr.Close()

&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Una vez conseguida esa información, obtiene las columnas de las tablas, armando un modelo en memoria, en una collección Tables:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:c70b67c4-eb21-4a2f-9346-13b1ad45818d" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:White;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;white-space:pre-wrap;word-wrap:break-word;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;Tables &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; System.Collections.ArrayList()

&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;For&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;each&lt;/span&gt;&lt;span style="color:#000000;"&gt; TableName &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;in&lt;/span&gt;&lt;span style="color:#000000;"&gt; TableNames
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;PrintLine&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Loading Table &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#000000;"&gt; TableName
    Table &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; AjGenesis.Models.DynamicModel.DynamicObject()
    Table.Name &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; TableName
    Table.Columns &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; System.Collections.ArrayList()

    cmd.CommandText &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;SELECT * from Information_Schema.Columns where Table_name=&amp;#39;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#000000;"&gt; TableName &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    dr &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; cmd.ExecuteReader()

    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;while&lt;/span&gt;&lt;span style="color:#000000;"&gt; dr.Read()
        ColumnName &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; dr.Item(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Column_Name&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;PrintLine&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Processing Column &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#000000;"&gt; ColumnName &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;: &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#000000;"&gt; dr.Item(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Data_Type&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
        Column &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; AjGenesis.Models.DynamicModel.DynamicObject()
        Column.Name &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; ColumnName
        Column.DataType &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; dr.Item(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Data_Type&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; dr.Item(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Character_Maximum_Length&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;) &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;then&lt;/span&gt;&lt;span style="color:#000000;"&gt;
            Column.Length &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; dr.Item(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Character_Maximum_Length&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
            Column.IsNumeric &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;false&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;else&lt;/span&gt;&lt;span style="color:#000000;"&gt;
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; dr.Item(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Numeric_Precision&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;) &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;then&lt;/span&gt;&lt;span style="color:#000000;"&gt;
                Column.Length &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; dr.Item(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Numeric_Precision&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
                Column.Scale &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; dr.Item(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Numeric_Scale&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
                Column.IsNumeric &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;true&lt;/span&gt;&lt;span style="color:#000000;"&gt;
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;end&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;end&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        Column.SqlName &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; Column.Name
        Column.Name &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; Column.Name.Replace(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
        Table.Columns.Add(Column)
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;end&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;while&lt;/span&gt;&lt;span style="color:#000000;"&gt;

    dr.Close()

    Table.SqlName &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; Table.Name
    Table.Name &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; Table.Name.Replace(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;)

    Tables.Add(Table)
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;end&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;for&lt;/span&gt;&lt;span style="color:#000000;"&gt;

&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Finalmente, hace el viejo truco de recorrer ese modelo, y aplicarle un template, para generar otro modelo (recuerde esta capacidad del proyecto: un modelo puede ser un XML, serializado en archivo de texto, entonces, un proceso de generación puede generar otro modelo para usar o retocar más adelante):&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:f4097faa-fdf4-4f55-8642-cfb58405ba63" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:White;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;white-space:pre-wrap;word-wrap:break-word;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;FileManager.CreateDirectory(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Model&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;)

&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;for&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;each&lt;/span&gt;&lt;span style="color:#000000;"&gt; Table &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;in&lt;/span&gt;&lt;span style="color:#000000;"&gt; Tables
    TransformerManager.Transform(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Templates\Table.tpl&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Model\${Table.Name}.xml&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, Environment)
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;end&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;for&lt;/span&gt;&lt;span style="color:#000000;"&gt;

&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Un ejemplo de modelo generado:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:c68b624a-3d9b-4db4-ab6a-f62c8834bb6a" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:White;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;white-space:pre-wrap;word-wrap:break-word;"&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color:#FF00FF;"&gt;xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;ISO-8859-1&amp;quot; standalone=&amp;quot;yes&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;?&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Table&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Region&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;SqlName&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Region&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;SqlName&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;

    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Columns&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Column&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;RegionID&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;SqlName&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;RegionID&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;SqlName&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;DataType&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;int&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;DataType&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Length&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Length&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Scale&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Scale&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Column&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Column&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;RegionDescription&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;SqlName&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;RegionDescription&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;SqlName&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;DataType&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;nchar&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;DataType&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Length&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;50&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Length&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Scale&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Scale&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Column&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Columns&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Table&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ahora, con el AssemblyManager, se podría tomar una .dll cualquiera y cargarla, para usarla en nuestra generación (tengo que postear sobre el uso que le dió el bueno de&amp;nbsp;&lt;a href="http://blog.darioquintana.com.ar/" target="_blank"&gt;Darío Quintana&lt;/a&gt; a esta &amp;quot;feature&amp;quot;, ver &lt;a href="http://blog.darioquintana.com.ar/2007/11/20/generando-con-ajgenesis-desde-los-assemblies/" target="_blank"&gt;Generando con AjGenesis desde los assemblies&lt;/a&gt;). Me imagino que podemos usar, por ejemplo, la librería Meta de &lt;a href="http://www.mygenerationsoftware.com/" target="_blank"&gt;MyGenerationSoftware&lt;/a&gt; para conseguir metadata de cualquier base de datos. Vean también que está disponible el código fuente de ese utilitario.&lt;/p&gt;
&lt;p&gt;Nos leemos!&lt;/p&gt;
&lt;p&gt;Angel &amp;quot;Java&amp;quot; Lopez&lt;br /&gt;&lt;a href="http://www.ajlopez.com/"&gt;http://www.ajlopez.com/&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1355469" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/Generaci_26002300_243_3B00_n+de+C_26002300_243_3B00_digo/default.aspx">Generaci&amp;#243;n de C&amp;#243;digo</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Desarrollo+de+Software/default.aspx">Desarrollo de Software</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/C_26002300_243_3B00_digo+Abierto/default.aspx">C&amp;#243;digo Abierto</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/AjGenesis/default.aspx">AjGenesis</category></item></channel></rss>