<?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 : Domain-Driven Design</title><link>http://msmvps.com/blogs/lopez/archive/tags/Domain-Driven+Design/default.aspx</link><description>Tags: Domain-Driven Design</description><dc:language>en</dc:language><generator>CommunityServer 2008.5 SP2 (Build: 40407.4157)</generator><item><title>Arquitectura de capas en Domain-Driven Design</title><link>http://msmvps.com/blogs/lopez/archive/2008/09/13/arquitectura-de-capas-en-domain-driven-design.aspx</link><pubDate>Sat, 13 Sep 2008 10:29:29 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1647691</guid><dc:creator>lopez</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/lopez/rsscomments.aspx?PostID=1647691</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2008/09/13/arquitectura-de-capas-en-domain-driven-design.aspx#comments</comments><description>&lt;p&gt;Esta vez, exploremos los conceptos de arquitectura en capas, tal como lo propuso Eric Evans en su libro clásico &lt;a href="http://domaindrivendesign.org/books/#DDD" target="_blank"&gt;Domain-Driven Design, Tackling Complexity in the Heart of Software&lt;/a&gt;. En el capítulo cuatro del libro, Evans presenta este diagrama:&lt;/p&gt; &lt;p align="center"&gt;&lt;img style="margin:0px 20px 20px 0px;" src="http://www.ajlopez.com/images/articles/dddlayered.png" alt="" /&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Evans Escribe:&lt;/p&gt; &lt;p&gt;&lt;em&gt;En una aplicación de carga y envío de mercadería, para simplemente listar y seleccionar el destino de la carga de una lista de ciudades, debe haber código que (1) dibuje un control en la pantalla, (2) consulte una base de datos para obtener las posibles ciudades, (3) interprete el ingreso de usuario y lo valide, (4) asocie la ciudad seleccionada con la carga, y (5) confirme el cambio en la base de datos. Todo este código es parte del mismo programa, pero sólo una pequeña parte está relacionado con el negocio de envío de cargas.&lt;/em&gt;&lt;/p&gt; &lt;p&gt;El propone que el modelo de dominio resida en una capa, la Capa de Dominio. De esta forma, el modelo de dominio es protejido de los detalles técnicos, como la implementación de la persistencia, y los detalles de presentación. Me gusta decir que el dominio es un organismo, qe recibe estímulos, acciones desde el exterior,y reacciona a esos comandos. El dominio debería ejecutarse sin conocimiento detallado del resto de la aplicación. Serialización entre capas físicas, detalles de presentación, y acceso a base de datos, deben estar claramente separados de la implementación del dominio.&lt;/p&gt; &lt;p&gt;Las capas puede ser descriptas como:&lt;/p&gt; &lt;p&gt;&lt;strong&gt;UI (User Interface)&lt;/strong&gt;: la más fácil de entender, esta capa es la responsable de mostra información al usuario, y aceptar nuevos datos. Puede ser implementada para web, escritorio gráfico, o cualquier otra tecnología de presentación, presente o futura. Por ejemplo, podría ser una aplicación de voz, que interactúa con el usuario usando un teléfono. La prueba ácida para nuestro diseño es que un cambio radical en la interfaz de usuario&amp;nbsp;debería tener mínimo (o por lo menos, controlado) impacto en el resto del sistema.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Application Layer&lt;/strong&gt;: está a cargo de coordinar las acciones a ser realizadas en el dominio. No tiene reglas de negocio o conocimiento del dominio. No hay estado del negocio en esta capa. Delega todas las acciones del negocio al propio dominio. Podría coordinar varias acciones (posiblemente, en varios dominios). Preara la infraestructura para que esté lista a trabajar con el dominio en una acción específica (por ejemplo, preparando la transacción que vaya a usar).&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Domain Layer&lt;/strong&gt;: En esta capa reside el corazón del software, según Evans. Las reglas y lógica de negocio residen en esta capa. Estado de entidades de negocio y su conducta es definida y usada aquí. Comunicación con otros sistemas, detalles de persistencia, son delegados en la capa de infraestructura. Evans discute los patrones que él usa en esta capa, como Entities, Value Objects, Services, Repositories y Factories. Exploraremos esos patrones y sus implementaciones en futuros posts.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Infrastructure Layer&lt;/strong&gt;: Dios y el diablo estan en los detalles, dice el dicho, y también en la capa de infraestructura. La principal responsabilidad de esta capa es la persistencia del estado de negocio, muy frecuentemente, usando una base de datos relacional.&lt;/p&gt; &lt;p&gt;Mi idea es tomar un ejemplo (posiblemente un dominio como uno del libro de Jimmy Nilsson), y desarrollarlo usando estas ideas, mostrando código concreto en Java y en .NET. En algún punto, discutiré sobre generación de código desde un modelo abstracto, pero no será el foco de esta serie de posts.&lt;/p&gt; &lt;p&gt;Fuentes consultadas: &lt;/p&gt; &lt;p&gt;&lt;a href="http://domaindrivendesign.org/books/#DDD" target="_blank"&gt;Domain-Driven Design, Tackling Complexity in the Heart of Software&lt;/a&gt;, de Eric Evans.&lt;br /&gt;&lt;a href="http://domaindrivendesign.org/books/#DDD_apply" target="_blank"&gt;Applying Domain-Driven Design and Patterns: With Examples in C# and .NET&lt;/a&gt;, de Jimmy Nilsson&lt;br /&gt;&lt;a href="http://www.wiley.com/WileyCDA/WileyTitle/productCd-0470147563.html" target="_blank"&gt;.NET Domain-Driven Design with C#&lt;/a&gt;, Problem, Design, Solution, de Tim McCarthy. (Hay &lt;a href="http://blogs.interknowlogy.com/timmccarthy/category/152.aspx" target="_blank"&gt;una sección&lt;/a&gt; en el blog de Tim dedicado a este libro).&lt;/p&gt; &lt;p&gt;Pueden bajar libremente&lt;/p&gt; &lt;p&gt;&lt;a href="http://domaindrivendesign.org/books/#DDD_quickly" target="_blank"&gt;Domain-Driven Design Quickly&lt;/a&gt;&lt;/p&gt; &lt;p&gt;desde &lt;a href="http://www.infoq.com/minibooks/domain-driven-design-quickly" target="_blank"&gt;InfoQ&lt;/a&gt;.&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=1647691" 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/Java/default.aspx">Java</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Domain-Driven+Design/default.aspx">Domain-Driven Design</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/DDD/default.aspx">DDD</category></item><item><title>El camino hacia el Modelo de Dominio y Domain-Driven Design</title><link>http://msmvps.com/blogs/lopez/archive/2008/09/03/el-camino-hacia-el-modelo-de-dominio-y-domain-driven-design.aspx</link><pubDate>Wed, 03 Sep 2008 10:34:48 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1646602</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=1646602</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2008/09/03/el-camino-hacia-el-modelo-de-dominio-y-domain-driven-design.aspx#comments</comments><description>&lt;p&gt;&lt;img style="margin:0px 20px 20px 0px;" src="http://www.todocontenidos.com/images/articles/evans.png" align="left" alt="" /&gt; Por años, la comunidad de desarrolo de software ha luchado contra la complejidad y el cambio. El desarrollo de software es uno de las actividades humanas con más niveles de detalle: debemos captar la imagen completa del sistema, y a la vez, tomar en cuenta cada pequeño detalle. Un desarrollador o un equipo de desarrolladores tienen que manejajar un montón de concptos, estilos de arquitectura, patrones de diseño e implementación, lenguajes, tecnologías, mejores prácticas y aún más: tiene que ejercitar los &amp;quot;soft skills&amp;quot; de comunicación con otros interesados en el proyecto.&lt;/p&gt; &lt;p&gt;Todo esto puede ser una tarea intimidante.&lt;/p&gt; &lt;p&gt;Muchos paradigmas emergieron en las últimas décadas, notablemente el orientado a objeto. Pero toma caminos divergentes: uno fue el purismo académico, con Smalltalkers y otros, que hicieron una gran tarea difundiendo objetos, pero que siguieron trabajando en aplicaciones, digamos, de nicho, no cruzando el abismo para llegar a la corriente principal de desarrollo (supongo que la fragmentación de Smalltalk en diverss dialectos fue una de las razones para el estado actual de la comunidad ST). No me malentiendan: Smalltalk tiene un comunidad fuerte y viva, pero no es uno de las tecnologías con muchas aplicaciones empresariales para mostrar. &lt;/p&gt; &lt;p&gt;C++ fue el primer lenguaje popular que dió &amp;quot;objetos para las masas&amp;quot;, pero con la aparición de tecnologías complicadas (¿recuerdan la API desnuda de Windows? ¿O cualquier API de GUI?) y la explosión del mercado de PC, la corriente principal de desarrollo fue tomada por lenguajes derivados de xBase, y Delphi y Visual Basic, este último no tiene soporte de objetos hasta la versión 3, y nunca soporte de herencia. (Visual Basic fue un &amp;quot;matador&amp;quot; de ideas hermosas, como el lenguaje Actor: una extensión orientada a objetos del lenguaje Forth, con soporte nativo de GUI, implementado en Windows). (Sí, también tomemos nota de COBOL: este lenguaje fue y aún es&amp;nbsp;el lenguaje principal en muchos ambientes).&lt;/p&gt; &lt;p&gt;Java hizo su aparición a mediados de los 90, dando aire fresco a la programación (yo nunca programé con VB 6.0: después de encontrar el paraíso Java, quién quería lidiar con Apartment Thread Models y todo el lío COM). Teníamos una librería de clases, verdaderos objetos, pero más: nosotros fuimos bendecidos por un &amp;quot;garbage collector&amp;quot;, recolector de basura. Los nuevo &amp;quot;patrones de diseño&amp;quot; podían ser adoptados de forma masiva. Los objetos comienzan a estar en todas partes. Aparecen frameworks.&lt;/p&gt; &lt;p&gt;Pero algo estaba faltando: aunque los frameworks tomaron ventaja del uso de objetos, las implementaciones de negociones de muchas aplicaciones no reflejaban las nuevas capacidades. El elusivo Modelo de Dominio era un &amp;quot;santo grial&amp;quot; que no era fácil de encontrar. El trabajo de Sun con J2EE fué un fracaso parcial para armar modelos de dominio en Java. Cuando .NET nace, Microsoft no repite el error, y en sus primeros ejemplos y escritos de&amp;nbsp; Pattern and Practices, no usan ninguna de los ideas de Modelo de Dominio (supongo que todavía son reluctantes a adoptar un Modelo de Dominio, LINQ to SQL es aún una bestia orientada a datos, la esperanza que tenemos es el Entity Framework).&lt;/p&gt; &lt;p&gt;La comunidad de Java&amp;nbsp;tiene un gran conjunto de&amp;nbsp;herramientas y librerías de código abierto, desde Ant a Maven a Tomcat y más. La simplicidad de&amp;nbsp;la programación POJO (Plain Old Java Objects), junto con soluciones no intrusivas de persistencia (notablemente Hibernate), tomó un nuevo camino para alcanzar una más clara implementación de un modelo de dominio.&lt;/p&gt; &lt;p&gt;.NET entró tarde en el juego: mucha de las herramientas y ejemplos en el mundo .NET eran centradas u orientadas a datos, con datasets, y características de enlace a datos en todas las presentaciones (WinForms y ASP.NET). La comunidad&amp;nbsp;.NET aprendió de la experiencia de la comunidad de Java, y en los últimos años, tenemos las ideas de Modelo de Dominio implementado en ambos mundos.&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.domaindrivendesign.org/" target="_blank"&gt;Eric Evans&lt;/a&gt; escribió un libro seminal sobre sus ideas de&amp;nbsp;Domain-Driven Development, donde el Modelo de Dominio no es un artefacto más, sino el corazón del software a desarrollar. El va más allá de Modelo de Dominio, describiendo nuevos patrones y maneras de implementarlo. El libro explica el proceso para crear y descubrir un modelo, usando un lenguaje ubicuo (compartido con los usuarios), y cómo mejorar el modelo a lo largo del proceso de desarrollo.&lt;/p&gt; &lt;p&gt;Implementaciones de modelo de dominio, y DDD, son grandes tópicos a tratar. Quiero comenzar a escribir sobre esos temas, discutiendo varios puntos, y dando ejemplos concretos en Java y .NET. No es una tarea fácil, así que no esperen un post diario: el trabajo tomará tiempo.&lt;/p&gt; &lt;p&gt;Por ahora, pueden visitar mi colección de enlaces sobre DDD en:&lt;/p&gt; &lt;p&gt;&lt;a href="http://del.icio.us/ajlopez/ddd"&gt;http://del.icio.us/ajlopez/ddd&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Algunos de mis anteriores posts sobre DDD:&lt;/p&gt; &lt;p&gt;&lt;a title="Mini Book Domain Driven Design Quickly" href="http://ajlopez.wordpress.com/2006/12/12/mini-book-domain-driven-design-quickly/"&gt;Mini Book Domain Driven Design Quickly&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a title="Domain-Driven Design Resources" href="http://ajlopez.wordpress.com/2006/12/11/domain-driven-design-resources/"&gt;Domain-Driven Design Resources&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a title="Enlaces y Recursos Domain-Driven Design" href="http://msmvps.com/blogs/lopez/archive/2006/12/09/enlaces-y-recursos-domain-driven-design.aspx"&gt;Enlaces y Recursos Domain-Driven Design&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a title="Domain-Driven Design" href="http://msmvps.com/blogs/lopez/archive/tags/Domain-Driven+Design/default.aspx"&gt;Domain-Driven Design&lt;/a&gt;&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=1646602" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/Domain-Driven+Design/default.aspx">Domain-Driven Design</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Desarrollo+de+Software/default.aspx">Desarrollo de Software</category></item><item><title>Generando código para NHibernate (Parte 3)</title><link>http://msmvps.com/blogs/lopez/archive/2007/10/29/generando-c-243-digo-para-nhibernate-parte-3.aspx</link><pubDate>Mon, 29 Oct 2007 09:17:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1273179</guid><dc:creator>lopez</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/lopez/rsscomments.aspx?PostID=1273179</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2007/10/29/generando-c-243-digo-para-nhibernate-parte-3.aspx#comments</comments><description>&lt;p&gt;Siguiendo con la serie&lt;/p&gt;
&lt;p&gt;&lt;a title="Generando có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;br /&gt;&lt;a title="Generando có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;/p&gt;
&lt;p&gt;del ejemplo de Omar del valle Rodriguez, tengo una nueva versión del ejemplo, que genera aplicaciones con &lt;a href="http://www.ajlopez.com/ajgenesis"&gt;AjGenesis&lt;/a&gt;. Gracias desde acá, a las sugerencias de Omar, y de Fabio Maulo. He incorporado algunas características, como:&lt;/p&gt;
&lt;p&gt;- Uso de NHibernate 1.2&lt;/p&gt;
&lt;p&gt;- Manejo de mapeo de subclases en .hbm por separado&lt;/p&gt;
&lt;p&gt;- Propiedades virtuales en las entidades&lt;/p&gt;
&lt;p&gt;- Dos nuevas aplicaciones generadas&lt;/p&gt;
&lt;p&gt;Pueden bajar el ejemplo AjOmar Versión&amp;nbsp;1.1 (es el archivo&amp;nbsp;&lt;strong&gt;AjOmar-v1.1.zip&lt;/strong&gt;) desde la &lt;a href="http://www.codeplex.com/ajgenesis/Release/ProjectReleases.aspx?ReleaseId=7261" target="_blank"&gt;página de ejemplos de AjGenesis&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;El modelo&lt;/h3&gt;
&lt;p&gt;Como siempre, la idea de AjGenesis es basarse en un modelo libre, donde uno especifica lo que le interesa modelar. En el caso de este ejemplo, se modelan entidades, y a partir de esa información se generan aplicaciones completas. El modelo prácticamente no cambió desde la anterior versión (ver &lt;a href="http://msmvps.com/blogs/lopez/archive/2007/09/25/generando-c-243-digo-para-nhibernate-parte-2.aspx"&gt;Parte 2&lt;/a&gt;), en el archivo &lt;strong&gt;Projects/AjOmar/Project.xml&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:59fb84c3-4ef7-4027-9ace-346977021a44" 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;WORD-WRAP:break-word;"&gt;&lt;div&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:#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;AjOmar&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;Description&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;Example AjOmar for (N)Hibernate&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;&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;Prefix&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;AjOm&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;Prefix&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;Domain&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;com.ajomar&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;Domain&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;CompanyName&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;ajomar&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;CompanyName&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;Model&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;Entities&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;Entity &lt;/span&gt;&lt;span style="COLOR:#ff0000;"&gt;Source&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;=&amp;quot;Entities/Client.xml&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;Entity &lt;/span&gt;&lt;span style="COLOR:#ff0000;"&gt;Source&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;=&amp;quot;Entities/Company.xml&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;Entity &lt;/span&gt;&lt;span style="COLOR:#ff0000;"&gt;Source&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;=&amp;quot;Entities/User.xml&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;Entities&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;Model&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;Project&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Como había pedido Omar, &lt;strong&gt;Company&lt;/strong&gt; y &lt;strong&gt;User&lt;/strong&gt; heredan de &lt;strong&gt;Client&lt;/strong&gt;. En la base de datos se usan tres tablas, y el NHibernate hace la magia del mapeo en este dominio con entidades relacionadas por herencia.&lt;/p&gt;
&lt;p&gt;Como antes, también se especifican los elementos de tecnología, como la base de datos a usar, el usuario y contraseña a usar en los strings de conección, y otros detalles. Esto permite cambiar la tecnología, sin cambiar el modelo de arriba. Un ejemplo en el archivo &lt;strong&gt;Projects/AjOmar/Technologies/VbNet2Nh.xml&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:f6340adb-111d-42cc-93c6-c007a80600ac" 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;WORD-WRAP:break-word;"&gt;&lt;div&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;Technology&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;Programming&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;Dialect&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;VbNet2Nh&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;Dialect&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;Programming&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;Database&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;Dialect&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;MsSql&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;Dialect&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;AjOmar&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;Username&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;sa&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;Username&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;Prefix&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;ajom_&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;Prefix&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;Host&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;(local)&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;Host&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;Database&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;NHibernate&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;Dialect&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;NHibernate.Dialect.MsSql2000Dialect&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;Dialect&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;NHibernate&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;Technology&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;Deberá adaptar este archivo si necesita ajustar esos datos.&lt;/p&gt;
&lt;p&gt;Siguiendo algunas recomendaciones de Fabio Maulo, ahora hay un .hbm por entidad. Ejemplo generado en &lt;strong&gt;Build/AjOmar/VbNet2Nh/Src/AjOmar.Data/Company.hbm.xml&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:15dfc089-ece1-4b66-a5bf-9017d3ab2a93" 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;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;utf-8&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;hibernate-mapping &lt;/span&gt;&lt;span style="COLOR:#ff0000;"&gt;xmlns&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;=&amp;quot;urn:nhibernate-mapping-2.2&amp;quot;&lt;/span&gt;&lt;span style="COLOR:#ff0000;"&gt;
    assembly&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;=&amp;quot;AjOmar.Entities&amp;quot;&lt;/span&gt;&lt;span style="COLOR:#ff0000;"&gt;
    namespace&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;=&amp;quot;AjOmar.Entities&amp;quot;&lt;/span&gt;&lt;span style="COLOR:#ff0000;"&gt;
    &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;joined-subclass &lt;/span&gt;&lt;span style="COLOR:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;=&amp;quot;Company&amp;quot;&lt;/span&gt;&lt;span style="COLOR:#ff0000;"&gt; table&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;=&amp;quot;ajom_companies&amp;quot;&lt;/span&gt;&lt;span style="COLOR:#ff0000;"&gt; extends&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;=&amp;quot;Client&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;key &lt;/span&gt;&lt;span style="COLOR:#ff0000;"&gt;column&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;=&amp;quot;Id&amp;quot;&lt;/span&gt;&lt;span style="COLOR:#ff0000;"&gt; &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;property &lt;/span&gt;&lt;span style="COLOR:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;=&amp;quot;CompanyName&amp;quot;&lt;/span&gt;&lt;span style="COLOR:#ff0000;"&gt; type&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;=&amp;quot;String&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;property &lt;/span&gt;&lt;span style="COLOR:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;=&amp;quot;ContactName&amp;quot;&lt;/span&gt;&lt;span style="COLOR:#ff0000;"&gt; type&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;=&amp;quot;String&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;joined-subclass&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;hibernate-mapping&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;h3&gt;Las aplicaciones&lt;/h3&gt;
&lt;p&gt;Se pueden generar aplicaciones completas, con proyectos y solución web.&amp;nbsp;La generación se invoca con comando de línea, como se explica en la &lt;a href="http://msmvps.com/blogs/lopez/archive/2007/09/25/generando-c-243-digo-para-nhibernate-parte-2.aspx"&gt;Parte 2&lt;/a&gt;. Hay que agregar el directorio bin del AjGenesis en el path de ejecución para que funcionen.&lt;/p&gt;
&lt;p&gt;Ahora están habilitados cuatro generaciones de soluciones:&lt;/p&gt;
&lt;p&gt;&lt;font face="Consolas"&gt;GenerateProject AjOmar VbNet2Nh&lt;br /&gt;GenerateProject AjOmar CSharp2Nh&lt;br /&gt;GenerateProject AjOmar VbNet2DDDNh&lt;br /&gt;GenerateProject AjOmar CSharp2DDDNh&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;Los dos primeros generan aplicaciones VB.NET y C Sharp, con ASP.NET 2.x, y acceso a datos usando DAOs que usan NHibernate.&lt;/p&gt;
&lt;p&gt;Los dos nuevos comandos generan aplicaciones con VB.NET y C Sharp, que utilizan algunas ideas de Domain-Driven Design.&lt;/p&gt;
&lt;h3&gt;Generando DDD&lt;/h3&gt;
&lt;p&gt;Las nuevas soluciones generadas, tienen&amp;nbsp;varios proyectos de librerías de clases:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;AjNHibernate&lt;/strong&gt;: contiene las clases para el manejo de las llamadas al NHibernate, como configuración, factoría y obtención de sesiones. 
&lt;li&gt;&lt;strong&gt;AjOmar.Domain&lt;/strong&gt;: contiene las Entities, Services, y Repositories, a la Evans. No hay conceptos de Value Objects, o Aggregates. Los servicios se llaman Manager, para distinguirlos de la fachada de servicio que uso en Application. 
&lt;li&gt;&lt;strong&gt;AjOmar.Application&lt;/strong&gt;: la capa que coordina las llamadas al Dominio, desde la presentación. &lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;img src="http://www.ajlopez.net/images/articles/ajomar07.jpg" alt="" /&gt; &lt;/p&gt;
&lt;p&gt;Y como antes, hay una aplicación web &lt;strong&gt;AjOmar.WebClient&lt;/strong&gt;. &lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.ajlopez.net/images/articles/ajomar08.jpg" alt="" /&gt; &lt;/p&gt;
&lt;h3&gt;Próximos pasos&lt;/h3&gt;
&lt;p&gt;Tengo que generar aplicaciones similares para Hibernate, Java, y MySql. La idea es que sirva como prueba de concepto: desde un mismo modelo, se pueden generar aplicaciones implementadas con distintas tecnologías.&lt;/p&gt;
&lt;p&gt;Habrá que estudiar e implementar el manejo de nulos, restricciones por tamaño de campo, y mejorar la apariencia de las aplicaciones generadas.&lt;/p&gt;
&lt;p&gt;Hay que mejorar (y probar) el manejo de relaciones uno a varios, o varios a uno. Lo tengo implementado en los ejemplos &lt;a href="http://www.codeplex.com/ajgenesis/Release/ProjectReleases.aspx?ReleaseId=7261" target="_blank"&gt;AjGenesisExamples3&lt;/a&gt;, pero debería pasar ese código de plantillas y adaptarlo para este ejemplo.&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=1273179" 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/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/Domain-Driven+Design/default.aspx">Domain-Driven Design</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+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>Generando aplicaciones con AjGenesis</title><link>http://msmvps.com/blogs/lopez/archive/2007/06/25/generando-aplicaciones-con-ajgenesis.aspx</link><pubDate>Mon, 25 Jun 2007 08:20:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:986671</guid><dc:creator>lopez</dc:creator><slash:comments>16</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/lopez/rsscomments.aspx?PostID=986671</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2007/06/25/generando-aplicaciones-con-ajgenesis.aspx#comments</comments><description>&lt;p&gt;En estos días, estuve escribiendo unos ejemplos de AjGenesis&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.ajlopez.com/ajgenesis"&gt;http://www.ajlopez.com/ajgenesis&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;mi proyecto de código abierto de generación de código, para producir, desde un modelo, aplicaciones tanto en ASP.NET 1.x/2.x, como en JSP, tanto usando SQL Server en el primer caso, como con MySql en Java, y tanto con ADO.NET, como con NHibernate, Hibernate, ya sea con arquitectura de capas, como en capas a la Domain-Driven Design de Evans.&lt;/p&gt;
&lt;p&gt;Sigo escribiendo esos ejemplos, pero ya hay algo publicado en&lt;/p&gt;
&lt;p&gt;&lt;a title="AjGenesisExamples3.zip" href="http://www.ajlopez.com/downloads/AjGenesisExamples3.zip"&gt;AjGenesisExamples3.zip&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Usaremos la versión del proyecto que está actualmente en desarrollo:&lt;/p&gt;
&lt;p&gt;&lt;a title="AjGenesis-0.4.3.zip" href="http://www.ajlopez.com/downloads/AjGenesis-0.4.3.zip"&gt;AjGenesis-0.4.3.zip&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Quisiera en este artículo, comentar cómo funciona y se construye, uno de esos ejemplos. Permítanme primero repasar&amp;nbsp;algo sobre el proyecto. Primero, &amp;quot;the big picture&amp;quot;:&lt;/p&gt;
&lt;p&gt;&lt;img height="863" alt="" src="http://www.ajlopez.com/ajgenesis/AjGenesisDrawings01-01.gif" width="561" border="0" /&gt;&lt;/p&gt;
&lt;p&gt;Está escrito en Visual Basic .NET 1.x,&amp;nbsp;y es código abierto, pues viene con una licencia tipo BSD, que permite utilizarlo en cualquier proyecto que quieran. Se puede usar como librería, invocado desde nuestro proyecto, se puede invocar desde la línea de comando, o puede ser utilizado desde el poderoso &lt;a href="http://nant.sourceforge.net/" target="_blank"&gt;NAnt&lt;/a&gt; (esto último me permitió organizar mejor las tareas que realiza el generador de código).&lt;/p&gt;
&lt;p&gt;En la &lt;a href="http://www.ajlopez.com/ajgenesis"&gt;página del proyecto&lt;/a&gt; (y en el proyecto mismo) hay varios ejemplos, que generan código desde un modelo, usando plantillas. Los ejemplos generan código PHP, Java, JSP, VB.NET, C#, ASP.NET, y hasta scripts de base de datos y procedimientos almacenados. Quisiera destacar dos puntos:&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;- El modelo del que parte es totalmente definible por el usuario&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;- Las tareas y plantillas a aplicar son totalmente programables y controlables&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;Esto lo diferencia de otros generadores. Podemos construirnos nuestro propio modelo, y sus propias plantillas, para generar los artefactos de texto que prefiera. Otros sistemas parten de la base de datos, y sólo generan un grupo de artefactos de textos predefinidos (por ejemplo, POJOs, plain old java objects, o DAOs, Data Access Objects). Pero con &lt;a href="http://www.ajlopez.com/ajgenesis" target="_blank"&gt;AjGenesis&lt;/a&gt; puede generar el artefacto de texto que se nos ocurra.&lt;/p&gt;
&lt;p&gt;Para comprender mejor que el modelo se puede construir y consumir como uno lo disponga, ver un artículo anterior:&lt;/p&gt;
&lt;p&gt;&lt;a title="Generando Có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;p&gt;Ahí se describen los pasos iniciales, y un modelo que es totalmente libre. &lt;/p&gt;
&lt;h3&gt;Creando una aplicación&lt;/h3&gt;
&lt;p&gt;&lt;br /&gt;Encaremos hoy algo más completo. Necesitamos armar una solución sencilla, con dos tablas, sobre una base de datos SQL Server, con código VB.NET 2.0, con interface web, capa de servicios, capa de datos, entidades y componentes de negocio a la Microsoft. Queremos generar la solución, los proyectos, los scripts de creación de la base, y procedimientos almacenados. Este ejemplo está incluido en los ejemplos &lt;a title="AjGenesisExamples3.zip" href="http://www.ajlopez.com/downloads/AjGenesisExamples3.zip"&gt;AjGenesisExamples3.zip&lt;/a&gt;. Primer paso: escribir el modelo.&lt;/p&gt;
&lt;h3&gt;El proyecto&lt;/h3&gt;
&lt;p&gt;En un directorio de proyectos de los ejemplos que acompañan este artículo, hay un directorio Projects/AjFirstExample.&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.ajlopez.com/images/articles/AjFirstExample.jpg" alt="" /&gt; &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;En ese directorio está el archivo Project.xml que contiene el modelo.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New"&gt;&amp;lt;Project&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;Name&amp;gt;AjFirstExample&amp;lt;/Name&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;Description&amp;gt;First Example using AjGenesis&amp;lt;/Description&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;Prefix&amp;gt;AjFE&amp;lt;/Prefix&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;Domain&amp;gt;com.ajlopez&amp;lt;/Domain&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;CompanyName&amp;gt;ajlopez&amp;lt;/CompanyName&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;Model&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;Entities&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;lt;Entity Source=&amp;quot;Entities/Customer.xml&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;lt;Entity Source=&amp;quot;Entities/Supplier.xml&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;/Entities&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/Model&amp;gt;&lt;br /&gt;&amp;lt;/Project&amp;gt;&lt;/font&gt; 
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Recordemos: el modelo es libre. Acá definimos, para los templates que vamos a usar, las entidades de nuestro modelo: customers y suppliers.&lt;/p&gt;
&lt;h3&gt;Las entidades&lt;/h3&gt;
&lt;p&gt;Para que un archivo XML no resulte terriblemente largo, AjGenesis permite que cualquier nodo del modelo se especifique en un archivo aparte. Es un criterio que he usado para definir cómo se escribe el modelo: el XML resultante no debe herir a la vista, debe ser entendible y abarcable en una lectura.&lt;/p&gt;
&lt;p&gt;En el Project.xml, eso aparece en el caso de las entidades, con el atributo Source. Examinemos una entidad, escrita en Entities/Customer.xml:&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;font face="Courier New"&gt;&amp;lt;Entity&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;Name&amp;gt;Customer&amp;lt;/Name&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;Description&amp;gt;Customer Entity&amp;lt;/Description&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;SetName&amp;gt;Customers&amp;lt;/SetName&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;Descriptor&amp;gt;Customer&amp;lt;/Descriptor&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;SetDescriptor&amp;gt;Customers&amp;lt;/SetDescriptor&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;SqlTable&amp;gt;customers&amp;lt;/SqlTable&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;Properties&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;Property&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;Name&amp;gt;Id&amp;lt;/Name&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;Type&amp;gt;Id&amp;lt;/Type&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;/Property&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;Property&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;Name&amp;gt;Name&amp;lt;/Name&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;Type&amp;gt;Text&amp;lt;/Type&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;SqlType&amp;gt;varchar(200)&amp;lt;/SqlType&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;/Property&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;Property&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;Name&amp;gt;Address&amp;lt;/Name&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;Type&amp;gt;Text&amp;lt;/Type&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;SqlType&amp;gt;text&amp;lt;/SqlType&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;/Property&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;Property&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;Name&amp;gt;Notes&amp;lt;/Name&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;Type&amp;gt;Text&amp;lt;/Type&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;SqlType&amp;gt;text&amp;lt;/SqlType&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;/Property&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/Properties&amp;gt;&lt;br /&gt;&amp;lt;/Entity&amp;gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;Hay atributos de la entidad, como su nombre y descripción, en singular y plural, que sirve para nombrarlas en las páginas resultantes, o dentro del código. Las propiedades son los campos a mantener en cada entidad. Vemos que en este ejemplo, no hay más que datos dentro de una entidad.&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Aparte de las entidades, en otro directorio, Technologies, se especifica el modelo dependiente de la tecnología, como VbNet2:&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New"&gt;&amp;lt;Technology&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;Programming&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Dialect&amp;gt;VbNet2&amp;lt;/Dialect&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/Programming&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;Database&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Dialect&amp;gt;MsSql&amp;lt;/Dialect&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Name&amp;gt;AjFirstExample&amp;lt;/Name&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Username&amp;gt;sa&amp;lt;/Username&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Prefix&amp;gt;ajfe_&amp;lt;/Prefix&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Host&amp;gt;(local)&amp;lt;/Host&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/Database&amp;gt;&lt;br /&gt;&amp;lt;/Technology&amp;gt;&lt;br /&gt;&lt;/font&gt;&lt;/p&gt;
&lt;h3&gt;Las plantillas&lt;/h3&gt;
&lt;p&gt;En el directorio Templates/VbNet2 encontramos&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.ajlopez.com/images/articles/VbNet2.jpg" alt="" /&gt; &lt;/p&gt;
&lt;p&gt;Son las plantillas para generación de código VB.Net 2.0. También encontraremos plantillas para C# 1.x y 2, Vb.NET 1, Java. Hay plantillas para usar Nhibernate, Hibernate, JSP, MySql, y conceptos de Domain-Driven Design. Todo desde el mismo modelo. Tomemos como muestra una plantilla, la que genera la entidad en Visual Basic, EntityVb.tpl:&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;font face="Courier New"&gt;&amp;lt;#&lt;br /&gt;message &amp;quot;Generating Entity ${Entity.Name}&amp;quot;&lt;br /&gt;include &amp;quot;Templates/VbNet2/VbFunctions.tpl&amp;quot;&lt;br /&gt;include &amp;quot;Templates/VbNet2/Prologue.tpl&amp;quot;&lt;br /&gt;#&amp;gt;&lt;br /&gt;&amp;#39;&lt;br /&gt;&amp;#39; Project ${Project.Name}&lt;br /&gt;&amp;#39; ${Project.Description}&lt;br /&gt;&amp;#39; Entity ${Entity.Name}&lt;br /&gt;&amp;#39; ${Entity.Description}&lt;br /&gt;&amp;#39; &lt;br /&gt;&amp;#39;&lt;br /&gt;Public Class ${Entity.Name} &lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New"&gt;&amp;#39; Private Fields &lt;/font&gt;
&lt;p&gt;&lt;font face="Courier New"&gt;&amp;lt;# for each Property in Entity.Properties&lt;br /&gt;&amp;nbsp; message &amp;quot;Procesando Campo ${Property.Name}&amp;quot;&lt;br /&gt;#&amp;gt; &lt;br /&gt;Private m${Property.Name} as ${VbType(Property)}&lt;br /&gt;&amp;lt;# &lt;br /&gt;&amp;nbsp; end for&lt;br /&gt;#&amp;gt;&lt;br /&gt;&amp;#39; Default Constructor &lt;/font&gt;
&lt;p&gt;&lt;font face="Courier New"&gt;Public Sub New()&lt;br /&gt;End Sub&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New"&gt;&lt;br /&gt;&amp;#39; Public Properties &lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New"&gt;&amp;lt;#&lt;br /&gt;&amp;nbsp; for each Property in Entity.Properties&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; message &amp;quot;Procesando Propiedad ${Property.Name}&amp;quot;&lt;br /&gt;#&amp;gt; &lt;br /&gt;Public Property ${Property.Name}() as ${VbType(Property)}&lt;br /&gt;&amp;nbsp; Get&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Return m${Property.Name}&lt;br /&gt;&amp;nbsp; End Get&lt;br /&gt;&amp;nbsp; Set(ByVal Value As ${VbType(Property)})&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; m${Property.Name} = Value&lt;br /&gt;&amp;nbsp; End Set&lt;br /&gt;End Property&lt;br /&gt;&amp;lt;#&lt;br /&gt;end for&lt;br /&gt;#&amp;gt; &lt;/font&gt;
&lt;p&gt;&lt;font face="Courier New"&gt;End Class&lt;br /&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;Como antes, se usan estructuras de control, y recorrido de una entidad del modelo. No se maneja el XML. El formato XML es la forma de serialización del modelo. Durante el proceso de la plantilla, el modelo ya está en memoria, accesible desde variables dinámicas.&lt;/p&gt;
&lt;h3&gt;Los pasos&lt;/h3&gt;
&lt;p&gt;Ahora tenemos más archivos a generar: desde las páginas ASPX, y su código asociado, los proyectos de fachada de servicio, entidades, acceso a datos, el archivo de solución, y más. Para automatizar esta generación, el ejemplo tiene varios archivos de tareas, en el directorio Tasks, donde se describen los pasos a ejecutar. Hay dos grandes tareas: los pasos a ejecutar independientemente de la tecnología elegida, como completar el modelo, revisarlo, y las dependientes de la tecnología, como generar tal archivo JSP o ASPX, dependiendo de si queremos Java o .NET.&lt;/p&gt;
&lt;p&gt;La tarea de completar el modelo está&amp;nbsp;a cargo de Tasks\BuildProject.ajg, que comienza con:&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New"&gt;&amp;#39;&lt;br /&gt;&amp;#39; Build Project&lt;br /&gt;&amp;#39; Complete the Project Data&lt;br /&gt;&amp;#39; Project must be loaded in global variable Project&lt;br /&gt;&amp;#39; &lt;/font&gt;
&lt;p&gt;&lt;font face="Courier New"&gt;PrintLine &amp;quot;Completing Project ${Project.Name}&amp;quot; &lt;/font&gt;
&lt;p&gt;&lt;font face="Courier New"&gt;include &amp;quot;Templates/EntityFunctions.tpl&amp;quot;&lt;br /&gt;include &amp;quot;Templates/Utilities.tpl&amp;quot; &lt;/font&gt;
&lt;p&gt;&lt;font face="Courier New"&gt;if not Project.Title then&lt;br /&gt;&amp;nbsp; Project.Title = Project.Name&lt;br /&gt;end if &lt;/font&gt;
&lt;p&gt;&lt;font face="Courier New"&gt;if not Project.Version then&lt;br /&gt;&amp;nbsp; Project.Version = &amp;quot;1.0.*&amp;quot;&lt;br /&gt;end if &lt;/font&gt;
&lt;p&gt;&lt;font face="Courier New"&gt;if not Project.SystemName then&lt;br /&gt;&amp;nbsp; Project.SystemName = Project.Name&lt;br /&gt;end if &lt;/font&gt;
&lt;p&gt;Acá incluye algunas funciones auxiliares, y luego comienza a completar el modelo que reside en la variable Project. Ejemplo: si falta Project.Title le coloca como título el Project.Name. Prosigue:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New"&gt;for each Entity in Project.Model.Entities&lt;br /&gt;&amp;nbsp; PrintLine &amp;quot;Entity &amp;quot; + Entity.Name &lt;/font&gt;
&lt;p&gt;&lt;font face="Courier New"&gt;&amp;nbsp; for each Property in Entity.Properties&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PrintLine &amp;quot;Property &amp;quot; &amp;amp; Property.Name&lt;/font&gt;&lt;/p&gt;&lt;font face="Courier New"&gt;
&lt;p&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font face="Courier New"&gt;if not Property.Description then&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Property.Description = Property.Name&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end if&lt;/font&gt;&lt;/p&gt;&lt;font face="Courier New"&gt;
&lt;p&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if not Property.Title then&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Property.Title = Property.Description&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; end if&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if Property.Type=&amp;quot;Id&amp;quot; and not Property.SqlType then&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Property.SqlType=&amp;quot;int&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; end if&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if Property.SqlType and not Property.SqlColumn then&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Property.SqlColumn = Property.Name&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; end if&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if Property.Type=&amp;quot;Id&amp;quot; and not Entity.IdProperty then&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Entity.IdProperty = Property&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; end if&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if Property.Reference then&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New"&gt;...&lt;/font&gt; 
&lt;p&gt;Mas adelante, se ejecutan las tareas de tecnología. Como ejemplo, veamos un fragmento de Tasks\BuildVbNet2.ajg: &lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New"&gt;&amp;lt;#&lt;br /&gt;include &amp;quot;Templates/Utilities.tpl&amp;quot;&lt;br /&gt;include &amp;quot;Templates/VbNet2/UtilitiesVb.tpl&amp;quot; &lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New"&gt;message &amp;quot;Creating Directories...&amp;quot; &lt;/font&gt;
&lt;p&gt;&lt;font face="Courier New"&gt;FileManager.CreateDirectory(Project.BuildDir)&lt;br /&gt;FileManager.CreateDirectory(&amp;quot;${Project.BuildDir}/Sql&amp;quot;)&lt;br /&gt;FileManager.CreateDirectory(&amp;quot;${Project.BuildDir}/Src/${Project.Name}.Entities&amp;quot;)&lt;br /&gt;FileManager.CreateDirectory(&amp;quot;${Project.BuildDir}/Src/${Project.Name}.Entities/My Project&amp;quot;)&lt;br /&gt;FileManager.CreateDirectory(&amp;quot;${Project.BuildDir}/Src/${Project.Name}.Data&amp;quot;)&lt;br /&gt;FileManager.CreateDirectory(&amp;quot;${Project.BuildDir}/Src/${Project.Name}.Data/My Project&amp;quot;)&lt;br /&gt;FileManager.CreateDirectory(&amp;quot;${Project.BuildDir}/Src/${Project.Name}.Services&amp;quot;)&lt;br /&gt;…&lt;/font&gt; 
&lt;p&gt;En este fragmento, se crean los directorios necesarios para albergar la solución. El nombre del directorio se extrae del modelo desde ${Project.BuildDir}. 
&lt;h3&gt;Generando la solución&lt;/h3&gt;
&lt;p&gt;Podríamos lanzar las tareas desde la línea de comando, pero tenemos un build armado para el Nant, uno para cada tecnología. Ejecutamos las tareas build, buildsql, y deploysql de AjFirstExampleVbNet2.build:&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.ajlopez.com/images/articles/nantgui2.jpg" alt="" /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;En el directorio Build/AjFirstExample/VbNet2/Sql quedan los scripts de creación de la base y procedimientos almacenados. Y en el directorio hermano Src, sorpresa, tenemos la solución ya preparada:&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.ajlopez.com/images/articles/Src.jpg" alt="" /&gt; &lt;/p&gt;
&lt;p&gt;Encontramos varios proyectos armados. Si levantamos la solución en el Visual Studio 2005, aparece todo el código generado:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.ajlopez.com/images/articles/ajfirstexamplevs.jpg" alt="" /&gt; &lt;br /&gt;&lt;br /&gt;Con otro archive build AjFirstExampleCSharp2.build, generamos la misma solución en CSharp:&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;img src="http://www.ajlopez.com/images/articles/ajfirstexamplevs2.jpg" alt="" /&gt; &lt;/p&gt;
&lt;p&gt;Encontrarán otros proyectos y ejemplos de .build, que usan NHibernate, Hibernate, JSP, y conceptos de DDD.&lt;/p&gt;
&lt;h3&gt;Reflexiones&lt;/h3&gt;
&lt;p&gt;Claro, no todo se puede generar automáticamente. Es importante tener siempre presente esto. Pero en el día a día, reconozcamos que tenemos cantidad de texto repetitivo, tareas que bien podemos encargar al propio software. 
&lt;p&gt;Recordemos siempre: el modelo es libre. Los ejemplos presentados son solamente ejemplos: podemos general el modelo que queremos, y escribir las plantillas que necesitamos. Es importante escribir las plantillas de forma que el código generado sea similar al que hubiéramos generado nosotros. Si no nos sentimos cómodos con el código generado, si no tiene nuestro estilo, nuestra experiencia, terminamos generando algo que no entendemos. 
&lt;p&gt;Otra reflexión: el modelo debe ser independiente de la tecnología. En el ejemplo final, hemos visto cómo, desde el mismo modelo, se puede generar la solución para VB.NET2, y para CSharp. Encontrarán las plantillas para generarla con Nhibernate, con DDD, con Hibernate, con Java y JSP, y podemos escribir la que necesitamos. 
&lt;p&gt;El software debe ayudarnos a generar software. Nuestra experiencia cuenta: lo que aprendimos de hacer aplicaciones, podemos volcarlo en esta especie de sistema experto, generador de código. Justamente, en el futuro, espero poder incorporar al proyecto, en las plantillas, más toma de decisiones: así como volcamos nuestra experiencia en escritura de aplicaciones, podemos incorporar nuestro conocimiento acumulado sobre patrones, arquitectura, estilos de programación. 
&lt;p&gt;Y al ser de código abierto, AjGenesis permite que lo extendamos, a nuestro gusto y necesidad. 
&lt;p&gt;Se aceptan sugerencias, historias de uso. Pueden escribir&amp;nbsp;comentarios a este artículo, o escribirme. Desde ya, muchas gracias por cualquier &amp;quot;feedback&amp;quot;. 
&lt;p&gt;Nos leemos! 
&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=986671" 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/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/Domain-Driven+Design/default.aspx">Domain-Driven Design</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/AjGenesis/default.aspx">AjGenesis</category></item><item><title>Mini Book Domain Driven Design Quickly</title><link>http://msmvps.com/blogs/lopez/archive/2006/12/12/mini-book-domain-driven-design-quickly.aspx</link><pubDate>Tue, 12 Dec 2006 19:48:17 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:415309</guid><dc:creator>lopez</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/lopez/rsscomments.aspx?PostID=415309</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2006/12/12/mini-book-domain-driven-design-quickly.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://www.infoq.com" target="_blank"&gt;InfoQ&lt;/a&gt; ha publicado un mini-libro (versión impresa con costo, hay un PDF para bajase libremente, más información al final de este artículo), que es un resumen sobre DDD, del libro de Eric Evans.&lt;/p&gt; &lt;h4&gt;&lt;em&gt;Table of contents&lt;/em&gt;&lt;/h4&gt;&lt;em&gt;This book is a short, quickly-readable summary and introduction to the fundamentals of DDD; it does not introduce any new concepts; it attempts to concisely summarize the essence of what DDD is, drawing mostly &lt;/em&gt;&lt;a href="http://www.amazon.com/exec/obidos/ASIN/0321125215/domainlanguag-20"&gt;&lt;em&gt;Eric Evans' book&lt;/em&gt;&lt;/a&gt;&lt;em&gt;, as well other sources since published such as Jimmy Nilsson's &lt;/em&gt;&lt;a href="http://www.amazon.com/Applying-Domain-Driven-Design-Patterns-Examples/dp/0321268202/sr=1-1/qid=1165872962"&gt;&lt;em&gt;Applying Domain Driven Design&lt;/em&gt;&lt;/a&gt;&lt;em&gt;, and various &lt;/em&gt;&lt;a href="http://tech.groups.yahoo.com/group/domaindrivendesign/"&gt;&lt;em&gt;DDD discussion forums&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.&amp;nbsp; Chapters of the book include: &lt;/em&gt; &lt;ol&gt; &lt;li&gt;&lt;em&gt;Building Domain Knowledge &lt;/em&gt; &lt;li&gt;&lt;em&gt;The Ubiquitous Language &lt;/em&gt; &lt;li&gt;&lt;em&gt;Model Driven Design &lt;/em&gt; &lt;li&gt;&lt;em&gt;Refactoring Toward Deeper Insight &lt;/em&gt; &lt;li&gt;&lt;em&gt;Preserving Model Integrity &lt;/em&gt; &lt;li&gt;&lt;em&gt;Interview with Eric Evans on why DDD matters today &lt;/em&gt;&lt;/li&gt;&lt;/ol&gt; &lt;h4&gt;&lt;em&gt;About the book&lt;/em&gt;&lt;/h4&gt;&lt;em&gt;Domain-Driven Design Quickly was produced by InfoQ.com, summarized primarily by Abel Avram and with Floyd Marinescu as managing editor. Special thanks to Eric Evans for his support and Vladimir Gitlevich and Dan Bergh Johnsson for their detailed reviews. The intention of this book is to get an introduction to Domain-Driven Design into as many hands as possible, to help it become mainstream.&lt;/em&gt;  &lt;p&gt;Más información:&lt;/p&gt; &lt;p&gt;&lt;a title="http://www.infoq.com/minibooks/domain-driven-design-quickly" href="http://www.infoq.com/minibooks/domain-driven-design-quickly"&gt;http://www.infoq.com/minibooks/domain-driven-design-quickly&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Yo descargué el .pdf desde&lt;/p&gt; &lt;p&gt;&lt;a title="Download this book FREE (PDF)" href="http://www.infoq.com/resource/minibooks/domain-driven-design-quickly/en/pdf/dddquickly.pdf"&gt;Download this book FREE (PDF)&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Tal vez les pida registrarse.&lt;/p&gt; &lt;p&gt;Nos leemos!&lt;br&gt;&lt;/p&gt; &lt;p&gt;Angel "Java" Lopez&lt;br&gt;&lt;a href="http://www.ajlopez.com/"&gt;http://www.ajlopez.com/&lt;/a&gt;&lt;/p&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=415309" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/Domain-Driven+Design/default.aspx">Domain-Driven Design</category></item><item><title>Enlaces y Recursos Domain-Driven Design</title><link>http://msmvps.com/blogs/lopez/archive/2006/12/09/enlaces-y-recursos-domain-driven-design.aspx</link><pubDate>Sat, 09 Dec 2006 09:18:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:407385</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=407385</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2006/12/09/enlaces-y-recursos-domain-driven-design.aspx#comments</comments><description>&lt;P&gt;Hola gente!&lt;/P&gt;
&lt;P&gt;Tengo en mi colección de enlaces, en mis apuntes para mis charlas, algunos enlaces sobre Domain-Driven Design, que quisiera compartir, no estarán muy ordenados, pero me sirven de mucho:&lt;/P&gt;
&lt;P&gt;El sitio de Eric Evans&lt;BR&gt;&lt;A title=http://domaindrivendesign.org href="http://domaindrivendesign.org/"&gt;http://domaindrivendesign.org&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Mi colección de enlaces en Delicious sobre DDD&lt;BR&gt;&lt;A title=http://del.icio.us/ajlopez/ddd href="http://del.icio.us/ajlopez/ddd"&gt;http://del.icio.us/ajlopez/ddd&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Organizing Domain Logic&lt;BR&gt;&lt;A href="http://weblogs.asp.net/pgielens/archive/2006/08/08/Organizing-Domain-Logic.aspx"&gt;http://weblogs.asp.net/pgielens/archive/2006/08/08/Organizing-Domain-Logic.aspx&lt;/A&gt; 
&lt;P&gt;Spring XT&lt;BR&gt;&lt;A href="http://springxt.sourceforge.net/index.php/Main_Page"&gt;http://springxt.sourceforge.net/index.php/Main_Page&lt;/A&gt; 
&lt;P&gt;Anemic Domain Model&lt;BR&gt;&lt;A href="http://www.martinfowler.com/bliki/AnemicDomainModel.html"&gt;http://www.martinfowler.com/bliki/AnemicDomainModel.html&lt;/A&gt; 
&lt;P&gt;Notifications&lt;BR&gt;&lt;A href="http://www.martinfowler.com/eaaDev/Notification.html"&gt;http://www.martinfowler.com/eaaDev/Notification.html&lt;/A&gt; 
&lt;P&gt;Fluent Interface&lt;BR&gt;&lt;A href="http://www.martinfowler.com/bliki/FluentInterface.html"&gt;http://www.martinfowler.com/bliki/FluentInterface.html&lt;/A&gt; 
&lt;P&gt;Specifications&lt;BR&gt;&lt;A href="http://www.martinfowler.com/apsupp/spec.pdf"&gt;http://www.martinfowler.com/apsupp/spec.pdf&lt;/A&gt;&lt;BR&gt;&lt;A href="http://www.martinfowler.com/bliki/SpecificationByExample.html"&gt;http://www.martinfowler.com/bliki/SpecificationByExample.html&lt;/A&gt;&lt;BR&gt;&lt;A href="http://sbtourist.blogspot.com/2006/01/case-for-specifications.html"&gt;http://sbtourist.blogspot.com/2006/01/case-for-specifications.html&lt;/A&gt;&lt;BR&gt;&lt;A href="http://sbtourist.blogspot.com/2006/02/another-case-for-specifications.html"&gt;http://sbtourist.blogspot.com/2006/02/another-case-for-specifications.html&lt;/A&gt;&lt;BR&gt;&lt;A href="http://sbtourist.blogspot.com/2006/05/idea-for-composite-specifications.html"&gt;http://sbtourist.blogspot.com/2006/05/idea-for-composite-specifications.html&lt;/A&gt;&lt;BR&gt;&lt;A href="http://sbtourist.blogspot.com/2006/05/implementing-composite-specifications.html"&gt;http://sbtourist.blogspot.com/2006/05/implementing-composite-specifications.html&lt;/A&gt;&lt;BR&gt;&lt;A href="http://www.jeffperrin.com/index.php/2006/06/28/specification-pattern-with-predicates/"&gt;http://www.jeffperrin.com/index.php/2006/06/28/specification-pattern-with-predicates/&lt;/A&gt; 
&lt;P&gt;Ver todo lo de Sergio Bossa&lt;BR&gt;&lt;A href="http://sbtourist.blogspot.com/"&gt;http://sbtourist.blogspot.com&lt;/A&gt;&lt;BR&gt;&lt;A title=http://del.icio.us/sbtourist/Domain-Driven-Design href="http://del.icio.us/sbtourist/Domain-Driven-Design"&gt;http://del.icio.us/sbtourist/Domain-Driven-Design&lt;/A&gt; 
&lt;P&gt;Spring Modules XT&lt;BR&gt;&lt;A href="https://springmodules.dev.java.net/docs/reference/0.5/html_single/#about"&gt;https://springmodules.dev.java.net/docs/reference/0.5/html_single/#about&lt;/A&gt; 
&lt;P&gt;Hay un ejemplo carserv.zip con DDD en Java&lt;BR&gt;&lt;A href="http://www.bettersoftwarefaster.com/"&gt;http://www.bettersoftwarefaster.com/&lt;/A&gt;&lt;BR&gt;&lt;A href="http://www.myjavaserver.com/~bswf/downloads/carserv.zip"&gt;http://www.myjavaserver.com/~bswf/downloads/carserv.zip&lt;/A&gt; 
&lt;P&gt;Applying the Application Layer in Domain-Driven Design&lt;BR&gt;&lt;A title=http://weblogs.asp.net/pgielens/archive/2006/05/31/Applying-the-Application-Layer-in-Domain-Driven-Design.aspx href="http://weblogs.asp.net/pgielens/archive/2006/05/31/Applying-the-Application-Layer-in-Domain-Driven-Design.aspx"&gt;http://weblogs.asp.net/pgielens/archive/2006/05/31/Applying-the-Application-Layer-in-Domain-Driven-Design.aspx&lt;/A&gt; 
&lt;P&gt;DDD: Can I drop my Service Layer? &lt;BR&gt;&lt;A href="http://peter.jteam.nl/?p=17"&gt;http://peter.jteam.nl/?p=17&lt;/A&gt; 
&lt;P&gt;Concurrency control in databases: Introduction&lt;BR&gt;&lt;A title=http://peter.jteam.nl/?p=8 href="http://peter.jteam.nl/?p=8"&gt;http://peter.jteam.nl/?p=8&lt;/A&gt; 
&lt;P&gt;y todo lo que escribe Peter Veenjter sobre DDD&lt;BR&gt;&lt;A title=http://peter.jteam.nl/?cat=6 href="http://peter.jteam.nl/?cat=6"&gt;http://peter.jteam.nl/?cat=6&lt;/A&gt; 
&lt;P&gt;Constructing View objects with the Builder pattern&lt;BR&gt;&lt;A href="http://sbtourist.blogspot.com/2006/07/constructing-view-objects-with-builder.html"&gt;http://sbtourist.blogspot.com/2006/07/constructing-view-objects-with-builder.html&lt;/A&gt; 
&lt;P&gt;Domain-Driven Design: Model Driven Architecture Done Right? &lt;BR&gt;&lt;A href="http://hinchcliffe.org/archive/2005/03/20/189.aspx"&gt;http://hinchcliffe.org/archive/2005/03/20/189.aspx&lt;/A&gt; 
&lt;P&gt;A Better Path to Enterprise Architectures&lt;BR&gt;&lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnbda/html/sessfin00.asp"&gt;http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnbda/html/sessfin00.asp&lt;/A&gt; 
&lt;P&gt;Puede ser interesante este articulo de Hibernate con un Modelo de Dominio sencillo&lt;BR&gt;&lt;A href="http://www.theserverside.net/tt/articles/showarticle.tss?id=NHibernate"&gt;http://www.theserverside.net/tt/articles/showarticle.tss?id=NHibernate&lt;/A&gt; 
&lt;P&gt;Avoiding Anemic Domain Models with Hibernate&lt;BR&gt;&lt;A href="http://wrschneider.blogspot.com/2005/01/avoiding-anemic-domain-models-with.html"&gt;http://wrschneider.blogspot.com/2005/01/avoiding-anemic-domain-models-with.html&lt;/A&gt;&lt;BR&gt;&lt;BR&gt;What is a View in Domain Driven Design?&lt;BR&gt;&lt;A href="http://billhamaker.wordpress.com/2006/08/03/what-is-a-view-in-domain-driven-design/"&gt;http://billhamaker.wordpress.com/2006/08/03/what-is-a-view-in-domain-driven-design/&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;A Proposal for an Abstract Domain Pattern « Bill Hamaker’s Blog&lt;BR&gt;&lt;A href="http://billhamaker.wordpress.com/2006/08/24/a-proposal-for-an-abstract-domain-pattern/"&gt;http://billhamaker.wordpress.com/2006/08/24/a-proposal-for-an-abstract-domain-pattern/&lt;/A&gt; 
&lt;P&gt;Un ejemplo de Repositorio&lt;BR&gt;&lt;A href="http://abc.truemesh.com/archives/000464.html"&gt;http://abc.truemesh.com/archives/000464.html&lt;/A&gt; 
&lt;P&gt;Ver el blog que refleja el grupo ddd&lt;BR&gt;&lt;A href="http://blog.gmane.org/gmane.comp.programming.domain-driven-design"&gt;http://blog.gmane.org/gmane.comp.programming.domain-driven-design&lt;/A&gt; 
&lt;P&gt;Steve Eichert - Domain Driven Design&lt;BR&gt;&lt;A href="http://www.emxsoftware.com/Domain+Driven+Design"&gt;http://www.emxsoftware.com/Domain+Driven+Design&lt;/A&gt; 
&lt;P&gt;Hooking your Domain Model and UI Layer&lt;BR&gt;&lt;A href="http://www.emxsoftware.com/Domain+Driven+Design/Hooking+your+Domain+Model+and+UI+Layer"&gt;http://www.emxsoftware.com/Domain+Driven+Design/Hooking+your+Domain+Model+and+UI+Layer&lt;/A&gt; 
&lt;P&gt;Keeping the Domain Model free from Persistence Logic&lt;BR&gt;&lt;A href="http://weblogs.asp.net/pgielens/archive/2005/07/29/420995.aspx"&gt;http://weblogs.asp.net/pgielens/archive/2005/07/29/420995.aspx&lt;/A&gt;&lt;BR&gt;&lt;BR&gt;DDD: Aggregates &amp;amp; Repositories&lt;BR&gt;&lt;A href="http://www.emxsoftware.com/Domain+Driven+Design/DDD+Aggregates++Repositories"&gt;http://www.emxsoftware.com/Domain+Driven+Design/DDD+Aggregates++Repositories&lt;/A&gt; 
&lt;P&gt;How Domain Driven Design changed my way of thinking&lt;BR&gt;&lt;A href="http://www.emxsoftware.com/Domain+Driven+Design/How+Domain+Driven+Design+changed+my+way+of+thinking"&gt;http://www.emxsoftware.com/Domain+Driven+Design/How+Domain+Driven+Design+changed+my+way+of+thinking&lt;/A&gt; 
&lt;P&gt;A quick comparison of Domain Model vs. Manager (Service) Model&lt;BR&gt;&lt;A href="http://www.emxsoftware.com/SOA/A+quick+comparison+of+Domain+Model+vs+Manager+Service+Model"&gt;http://www.emxsoftware.com/SOA/A+quick+comparison+of+Domain+Model+vs+Manager+Service+Model&lt;/A&gt; 
&lt;P&gt;Implementing Manager Models with a domain model&lt;BR&gt;&lt;A href="http://www.emxsoftware.com/SOA/Implementing+Manager+Models+with+a+domain+model"&gt;http://www.emxsoftware.com/SOA/Implementing+Manager+Models+with+a+domain+model&lt;/A&gt; 
&lt;P&gt;Vote Manager Model, Domain Model, or Both&lt;BR&gt;&lt;A href="http://www.emxsoftware.com/SOA/Vote+Manager+Model+Domain+Model+or+Both"&gt;http://www.emxsoftware.com/SOA/Vote+Manager+Model+Domain+Model+or+Both&lt;/A&gt; 
&lt;P&gt;Does SOA require Object-Message mappers It depends&lt;BR&gt;&lt;A href="http://weblogs.asp.net/fbouma/archive/2004/03/06/85105.aspx"&gt;http://weblogs.asp.net/fbouma/archive/2004/03/06/85105.aspx&lt;/A&gt; 
&lt;P&gt;Domain-Specific Modeling and Model Driven Architecture&lt;BR&gt;&lt;A href="http://www.bptrends.com/publicationfiles/01-04%20COL%20Dom%20Spec%20Modeling%20Frankel-Cook.pdf#search=%22domain%20driven%20example%22"&gt;http://www.bptrends.com/publicationfiles/01-04%20COL%20Dom%20Spec%20Modeling%20Frankel-Cook.pdf#search=%22domain%20driven%20example%22&lt;/A&gt; 
&lt;P&gt;Domain driven design implemented in Spring 01&lt;BR&gt;&lt;A href="http://forum.springframework.org/showthread.php?t=19429"&gt;http://forum.springframework.org/showthread.php?t=19429&lt;/A&gt;&lt;BR&gt;Domain driven design implemented in Spring 02&lt;BR&gt;&lt;A href="http://forum.springframework.org/showthread.php?t=19429&amp;amp;page=2"&gt;http://forum.springframework.org/showthread.php?t=19429&amp;amp;page=2&lt;/A&gt;&lt;BR&gt;Domain driven design implemented in Spring 03&lt;BR&gt;&lt;A href="http://forum.springframework.org/showthread.php?t=19429&amp;amp;page=3"&gt;http://forum.springframework.org/showthread.php?t=19429&amp;amp;page=3&lt;/A&gt;&lt;BR&gt;Domain driven design implemented in Spring 04&lt;BR&gt;&lt;A href="http://forum.springframework.org/showthread.php?t=19429&amp;amp;page=4"&gt;http://forum.springframework.org/showthread.php?t=19429&amp;amp;page=4&lt;/A&gt;&lt;BR&gt;Domain driven design implemented in Spring 05&lt;BR&gt;&lt;A href="http://forum.springframework.org/showthread.php?t=19429&amp;amp;page=5"&gt;http://forum.springframework.org/showthread.php?t=19429&amp;amp;page=5&lt;/A&gt;&lt;BR&gt;Domain driven design implemented in Spring 06&lt;BR&gt;&lt;A href="http://forum.springframework.org/showthread.php?t=19429&amp;amp;page=6"&gt;http://forum.springframework.org/showthread.php?t=19429&amp;amp;page=6&lt;/A&gt;&lt;BR&gt;Domain driven design implemented in Spring 07&lt;BR&gt;&lt;A href="http://forum.springframework.org/showthread.php?t=19429&amp;amp;page=7"&gt;http://forum.springframework.org/showthread.php?t=19429&amp;amp;page=7&lt;/A&gt;&lt;BR&gt;Domain driven design implemented in Spring 08&lt;BR&gt;&lt;A href="http://forum.springframework.org/showthread.php?t=19429&amp;amp;page=8"&gt;http://forum.springframework.org/showthread.php?t=19429&amp;amp;page=8&lt;/A&gt; 
&lt;P&gt;&lt;A href="http://forum.springframework.org/showthread.php?t=19429&amp;amp;page=5"&gt;http://forum.springframework.org/showthread.php?t=19429&amp;amp;page=5&lt;/A&gt; 
&lt;P&gt;Domain Driven Design vs Data Driven Design -- Domain Driven Design&lt;BR&gt;&lt;A href="http://vikasnetdev.blogspot.com/2006/07/domain-driven-design-vs-data-driven.html"&gt;http://vikasnetdev.blogspot.com/2006/07/domain-driven-design-vs-data-driven.html&lt;/A&gt; 
&lt;P&gt;Domain-Driven Framework Layering in Large Systems&lt;BR&gt;&lt;A href="http://www.riehle.org/computer-science/research/2000/cs-2000-gebos.pdf#search=%22domain%20driven%20example%22"&gt;http://www.riehle.org/computer-science/research/2000/cs-2000-gebos.pdf#search=%22domain%20driven%20example%22&lt;/A&gt; 
&lt;P&gt;Test Driven Development with Domain Driven Design – Part 1&lt;BR&gt;&lt;A href="http://donxml.com/allthingstechie/archive/2005/12/15/2348.aspx"&gt;http://donxml.com/allthingstechie/archive/2005/12/15/2348.aspx&lt;/A&gt; 
&lt;P&gt;Test Driven Development with Domain Driven Design – Part 2&lt;BR&gt;&lt;A href="http://donxml.com/allthingstechie/archive/2005/12/18/2361.aspx"&gt;http://donxml.com/allthingstechie/archive/2005/12/18/2361.aspx&lt;/A&gt; 
&lt;P&gt;Domain-Driven Design, the quest for software perfection&lt;BR&gt;&lt;A href="http://coding.mu/index.php/archives/2005/02/11/domain-driven-design-the-ultimate-solution/"&gt;http://coding.mu/index.php/archives/2005/02/11/domain-driven-design-the-ultimate-solution/&lt;/A&gt; 
&lt;P&gt;Some thoughts about DDD: Introduction &lt;BR&gt;&lt;A href="http://peter.jteam.nl/?p=16"&gt;http://peter.jteam.nl/?p=16&lt;/A&gt; 
&lt;P&gt;DDD: Can I drop my Service Layer? (en Arquitectura)&lt;BR&gt;&lt;A href="http://peter.jteam.nl/?p=17"&gt;http://peter.jteam.nl/?p=17&lt;/A&gt; 
&lt;P&gt;Domain-Driven Design Using Active Record in .NET&lt;BR&gt;&lt;A href="http://davidhayden.com/blog/dave/archive/2006/06/21/2995.aspx"&gt;http://davidhayden.com/blog/dave/archive/2006/06/21/2995.aspx&lt;/A&gt; 
&lt;P&gt;Explore model-driven development (MDD) and related approaches: A closer look at model-driven development and other industry initiatives&lt;BR&gt;&lt;A href="http://www-128.ibm.com/developerworks/library/ar-mdd3/"&gt;http://www-128.ibm.com/developerworks/library/ar-mdd3/&lt;/A&gt; 
&lt;P&gt;RAD That Ain't Bad: Domain-Driven Development with Trails&lt;BR&gt;&lt;A href="http://today.java.net/pub/a/today/2005/06/23/trails.html"&gt;http://today.java.net/pub/a/today/2005/06/23/trails.html&lt;/A&gt; 
&lt;P&gt;Trails and Firebird&lt;BR&gt;&lt;A href="http://www.cstengel.de/tutorial/trails_firebird_tutorial/"&gt;http://www.cstengel.de/tutorial/trails_firebird_tutorial/&lt;/A&gt; 
&lt;P&gt;Trails&lt;BR&gt;&lt;A href="https://trails.dev.java.net/"&gt;https://trails.dev.java.net/&lt;/A&gt; 
&lt;P&gt;The Development Abstraction Layer&lt;BR&gt;&lt;A href="http://www.joelonsoftware.com/printerFriendly/articles/DevelopmentAbstraction.html"&gt;http://www.joelonsoftware.com/printerFriendly/articles/DevelopmentAbstraction.html&lt;/A&gt; 
&lt;P&gt;Advnace Mocking Scenarios With Active Record (using Rhino Mocks)&lt;BR&gt;&lt;A href="http://www.ayende.com/Blog/2006/04/14/AdvnaceMockingScenariosWithActiveRecordUsingRhinoMocks.aspx"&gt;http://www.ayende.com/Blog/2006/04/14/AdvnaceMockingScenariosWithActiveRecordUsingRhinoMocks.aspx&lt;/A&gt; 
&lt;P&gt;Testing ActiveRecord objects&lt;BR&gt;&lt;A href="http://www.ayende.com/Blog/2006/04/14/TestingActiveRecordObjects.aspx"&gt;http://www.ayende.com/Blog/2006/04/14/TestingActiveRecordObjects.aspx&lt;/A&gt; 
&lt;P&gt;ADO.NET Team Blog&lt;BR&gt;&lt;A href="http://blogs.msdn.com/adonet/"&gt;http://blogs.msdn.com/adonet/&lt;/A&gt; 
&lt;P&gt;LINQ to Entities vs. LINQ to SQL - What should I use and when?&lt;BR&gt;&lt;A href="http://dotnetaddict.dotnetdevelopersjournal.com/adoef_vs_linqsql.htm"&gt;http://dotnetaddict.dotnetdevelopersjournal.com/adoef_vs_linqsql.htm&lt;/A&gt; 
&lt;P&gt;Trouble with Testing "ActiveRecord" objects&lt;BR&gt;&lt;A href="http://steve.emxsoftware.com/NET/Trouble+with+Testing+ActiveRecord+objects"&gt;http://steve.emxsoftware.com/NET/Trouble+with+Testing+ActiveRecord+objects&lt;/A&gt; 
&lt;P&gt;Repository vs ActiveRecord&lt;BR&gt;&lt;A href="http://geekswithblogs.net/gyoung/archive/2006/04/28/76647.aspx"&gt;http://geekswithblogs.net/gyoung/archive/2006/04/28/76647.aspx&lt;/A&gt; 
&lt;P&gt;Repository, the Foundation of Domain Driven Design&lt;BR&gt;&lt;A href="http://geekswithblogs.net/gyoung/archive/2006/05/03/77171.aspx"&gt;http://geekswithblogs.net/gyoung/archive/2006/05/03/77171.aspx&lt;/A&gt; 
&lt;P&gt;Lecture 23: Domain-Driven Design, Part 1&lt;BR&gt;&lt;A href="http://www.cs.colorado.edu/~kena/classes/6448/s05/lectures/lecture23.pdf"&gt;http://www.cs.colorado.edu/~kena/classes/6448/s05/lectures/lecture23.pdf&lt;/A&gt;&lt;BR&gt;Lecture 23: Domain-Driven Design, Part 2&lt;BR&gt;&lt;A href="http://www.cs.colorado.edu/~kena/classes/6448/s05/lectures/lecture24.pdf"&gt;http://www.cs.colorado.edu/~kena/classes/6448/s05/lectures/lecture24.pdf&lt;/A&gt;&lt;BR&gt;Lecture 23: Domain-Driven Design, Part 3&lt;BR&gt;&lt;A href="http://www.cs.colorado.edu/~kena/classes/6448/s05/lectures/lecture25.pdf"&gt;http://www.cs.colorado.edu/~kena/classes/6448/s05/lectures/lecture25.pdf&lt;/A&gt;&lt;BR&gt;Lecture 23: Domain-Driven Design, Part 4&lt;BR&gt;&lt;A href="http://www.cs.colorado.edu/~kena/classes/6448/s05/lectures/lecture26.pdf"&gt;http://www.cs.colorado.edu/~kena/classes/6448/s05/lectures/lecture26.pdf&lt;/A&gt;&lt;BR&gt;Lecture 30: Domain-Driven Design, Part 5 Supple Design&lt;BR&gt;&lt;A href="http://www.cs.colorado.edu/~kena/classes/6448/s05/lectures/lecture30.pdf#search=%22domain%20driven%20example%22"&gt;http://www.cs.colorado.edu/~kena/classes/6448/s05/lectures/lecture30.pdf#search=%22domain%20driven%20example%22&lt;/A&gt; 
&lt;P&gt;Domain-Driven Modeling with Aspects and Ontologies&lt;BR&gt;&lt;A href="http://www.st.informatik.tu-darmstadt.de:8080/ecoop2005/maw/acceptedPapers/Hruby.pdf#search=%22domain%20driven%20example%22"&gt;http://www.st.informatik.tu-darmstadt.de:8080/ecoop2005/maw/acceptedPapers/Hruby.pdf#search=%22domain%20driven%20example%22&lt;/A&gt; 
&lt;P&gt;An End to End Domain Driven Development Framework&lt;BR&gt;&lt;A href="http://www.isis.vanderbilt.edu/publications/archive/Agrawal_A_10_0_2003_An_End_to_.pdf#search=%22domain%20driven%20example%22"&gt;http://www.isis.vanderbilt.edu/publications/archive/Agrawal_A_10_0_2003_An_End_to_.pdf#search=%22domain%20driven%20example%22&lt;/A&gt; 
&lt;P&gt;Model View Presenter with ASP.NET&lt;BR&gt;&lt;A href="http://www.codeproject.com/useritems/ModelViewPresenter.asp#Downloads"&gt;http://www.codeproject.com/useritems/ModelViewPresenter.asp#Downloads&lt;/A&gt;&lt;BR&gt;&lt;BR&gt;Book Review: Applying Domain-Driven Design and Patterns&lt;BR&gt;&lt;A href="http://www.aspnetresources.com/blog/applying_ddd_patterns_book_review.aspx"&gt;http://www.aspnetresources.com/blog/applying_ddd_patterns_book_review.aspx&lt;/A&gt; 
&lt;P&gt;The Vietnam of Computer Science &lt;BR&gt;&lt;A href="http://blogs.tedneward.com/2006/06/26/The+Vietnam+Of+Computer+Science.aspx"&gt;http://blogs.tedneward.com/2006/06/26/The+Vietnam+Of+Computer+Science.aspx&lt;/A&gt; 
&lt;P&gt;Business domain-driven Java class hierarchies for Domino&lt;BR&gt;&lt;A href="http://www-128.ibm.com/developerworks/lotus/library/ls-Java_hierarchies/index.html"&gt;http://www-128.ibm.com/developerworks/lotus/library/ls-Java_hierarchies/index.html&lt;/A&gt; 
&lt;P&gt;Applying Domain-Driven Design and Patterns With Examples in C# and .NET&lt;BR&gt;&lt;A href="http://codebetter.com/blogs/david.hayden/archive/2006/06/04/146045.aspx"&gt;http://codebetter.com/blogs/david.hayden/archive/2006/06/04/146045.aspx&lt;/A&gt; 
&lt;P&gt;&lt;A href="http://www.theserverside.net/tt/books/addisonwesley/DomainDrivenDesign/DomainDrivenDesign.pdf"&gt;http://www.theserverside.net/tt/books/addisonwesley/DomainDrivenDesign/DomainDrivenDesign.pdf&lt;/A&gt; 
&lt;P&gt;Next-Generation Data Access: Making the Conceptual Level Real&lt;BR&gt;&lt;A href="http://msdn.microsoft.com/vstudio/default.aspx?pull=/library/en-us/dnvs05/html/nxtgenda.asp"&gt;http://msdn.microsoft.com/vstudio/default.aspx?pull=/library/en-us/dnvs05/html/nxtgenda.asp&lt;/A&gt; 
&lt;P&gt;ADO.NET Tech Preview: Entity Data Model&lt;BR&gt;&lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnvs05/html/ADONET_EDM.asp"&gt;http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnvs05/html/ADONET_EDM.asp&lt;/A&gt; 
&lt;P&gt;&lt;A href="http://mondragon.angeltowns.net/paradiso/AplicacionesProyectos.html"&gt;http://mondragon.angeltowns.net/paradiso/AplicacionesProyectos.html&lt;/A&gt; 
&lt;P&gt;Ver los resources de&lt;BR&gt;&lt;A href="http://www.orm.net/"&gt;http://www.orm.net&lt;/A&gt;&lt;BR&gt;&lt;A href="http://sourceforge.net/projects/orm"&gt;http://sourceforge.net/projects/orm&lt;/A&gt; 
&lt;P&gt;Conceptual Queries using ConQuer-II&lt;BR&gt;&lt;A href="http://www.orm.net/pdf/ER97-final.pdf"&gt;http://www.orm.net/pdf/ER97-final.pdf&lt;/A&gt; 
&lt;P&gt;ConQuer: a Conceptual Query Language&lt;BR&gt;&lt;A href="http://www.orm.net/pdf/ER96.pdf"&gt;http://www.orm.net/pdf/ER96.pdf&lt;/A&gt; 
&lt;P&gt;Conceptual Queries&lt;BR&gt;&lt;A href="http://www.orm.net/pdf/ConceptQueries.pdf"&gt;http://www.orm.net/pdf/ConceptQueries.pdf&lt;/A&gt; 
&lt;P&gt;Business Rules and Object Role Modeling&lt;BR&gt;&lt;A href="http://www.orm.net/pdf/dppd.pdf"&gt;http://www.orm.net/pdf/dppd.pdf&lt;/A&gt; 
&lt;P&gt;Agent Oriented Enterprise Modeling Based on Business Rules&lt;BR&gt;&lt;A href="http://www.informatik.tu-cottbus.de/~gwagner/papers/EM-BR.pdf"&gt;http://www.informatik.tu-cottbus.de/~gwagner/papers/EM-BR.pdf&lt;/A&gt; 
&lt;P&gt;Dual Schema Problem&lt;BR&gt;&lt;A href="http://devhawk.net/2006/03/28/The+Dual+Schema+Problem.aspx"&gt;http://devhawk.net/2006/03/28/The+Dual+Schema+Problem.aspx&lt;/A&gt; 
&lt;P&gt;Understanding and Using ValueModels&lt;BR&gt;&lt;A href="http://c2.com/ppr/vmodels.html"&gt;http://c2.com/ppr/vmodels.html&lt;/A&gt; 
&lt;P&gt;Más patrones&lt;BR&gt;&lt;A href="http://wiki.moredesignpatterns.com/"&gt;http://wiki.moredesignpatterns.com&lt;/A&gt; 
&lt;P&gt;El bueno de Ezequiel Jadib ha compilado 
&lt;P&gt;&lt;A href="http://ejadib.wordpress.com/2006/11/20/nhibernate-and-domain-driven-design/"&gt;http://ejadib.wordpress.com/2006/11/20/nhibernate-and-domain-driven-design/&lt;/A&gt; 
&lt;P&gt;sobre una serie de artículos de Ben Scheirman: 
&lt;P&gt;&lt;A class=TitleLinkStyle href="http://www.flux88.com/2006/07/05/A+Journey+With+NHibernate++Part+1.aspx" target=_blank&gt;A Journey with NHibernate - Part 1&lt;/A&gt;&lt;BR&gt;&lt;A class=TitleLinkStyle href="http://www.flux88.com/2006/07/10/A+Journey+With+NHibernate++Part+2.aspx" target=_blank&gt;A Journey With NHibernate - Part 2&lt;/A&gt;&lt;BR&gt;&lt;A class=TitleLinkStyle href="http://www.flux88.com/2006/07/20/A+Journey+With+NHibernate+And+DDD++Part+3.aspx" target=_blank&gt;A Journey With NHibernate (and DDD) - Part 3&lt;/A&gt;&lt;BR&gt;&lt;A class=TitleLinkStyle href="http://www.flux88.com/2006/07/23/A+Journey+With+Domain+Driven+Design+And+NHibernate++Part+4.aspx" target=_blank&gt;A Journey with Domain Driven Design (and NHibernate) - Part 4&lt;/A&gt;&lt;BR&gt;&lt;A class=TitleLinkStyle href="http://www.flux88.com/2006/08/24/A+Journey+With+Domain+Driven+Design+And+NHibernate++Part+5.aspx" target=_blank&gt;A Journey with Domain Driven Design (and NHibernate) - Part 5&lt;/A&gt;&lt;BR&gt;&lt;A class=TitleLinkStyle href="http://www.flux88.com/2006/09/02/A+Journey+With+Domain+Driven+Design+And+NHibernate++Part+6.aspx" target=_blank&gt;A Journey with Domain Driven Design (and NHibernate) - Part 6&lt;/A&gt;&lt;BR&gt;&lt;A class=TitleLinkStyle href="http://www.flux88.com/2006/11/14/A+Journey+With+Domain+Driven+Design+And+NHibernate++Part+7.aspx" target=_blank&gt;A Journey with Domain Driven Design (and NHibernate) - Part 7&lt;/A&gt; 
&lt;P&gt;Espero que les sirva 
&lt;P&gt;Nos leemos! 
&lt;P&gt;Angel "Java" Lopez&lt;BR&gt;&lt;A href="http://www.ajlopez.com/"&gt;http://www.ajlopez.com/&lt;/A&gt;&lt;/P&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=407385" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/Domain-Driven+Design/default.aspx">Domain-Driven Design</category></item><item><title>Domain-Driven Design en Buenos Aires, Arquitectura .NET en Bahía Blanca</title><link>http://msmvps.com/blogs/lopez/archive/2006/12/03/domain-driven-design-en-buenos-aires-arquitectura-net-en-bah-a-blanca.aspx</link><pubDate>Sun, 03 Dec 2006 21:40:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:371926</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=371926</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2006/12/03/domain-driven-design-en-buenos-aires-arquitectura-net-en-bah-a-blanca.aspx#comments</comments><description>&lt;P&gt;Esta semana tengo que dar, aparte de los cursos, dos charlas. Una en Buenos Aires, sobre &lt;A href="http://domaindrivendesign.org/"&gt;Domain-Driven Design&lt;/A&gt;, en el &lt;A href="http://www.clubdeprogramadores.com/" target=_blank&gt;Club de Programadores&lt;/A&gt;. El temario es algo ambicioso, pero creo que interesante: exploraremos las ideas de Eric Evans, y de cómo sugiere emplear el Modelo de Dominio como conductor en el diseño. Y comentaramos cómo implementarlo en la práctica. Seguramente, aprovecharé algún template de AjGenesis para producir artefactos como Repositories, Entities, Application Layer, y demás. Más información en&lt;/P&gt;
&lt;P&gt;&lt;A href="http://www.clubdeprogramadores.com/cursos/CursoMuestra.php?Id=307"&gt;http://www.clubdeprogramadores.com/cursos/CursoMuestra.php?Id=307&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Eso es el martes. El miércoles viajo a Bahía Blanca, para dar una charla sobre Arquitectura .NET paso a paso, organizada por el &lt;A href="http://www.mug.org.ar/" target=_blank&gt;Grupo de Usuarios Microsoft&lt;/A&gt;. Me parece interesante plantear el tema viendo cómo aparecen conceptos de arquitectura, desde una simple aplicación web. Me reencontraré con Paola Piovano, Guillermo Reggiani, Marcos Melli, y cía. Más información en&lt;/P&gt;
&lt;P&gt;&lt;A title=http://www.mug.org.ar/Eventos/2496.aspx href="http://www.mug.org.ar/Eventos/2496.aspx"&gt;http://www.mug.org.ar/Eventos/2496.aspx&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Mientras, sigo desarrollando, dando cursos, y de vez en cuando, durmiendo... :-)&lt;/P&gt;
&lt;P&gt;Nos leemos!&lt;/P&gt;
&lt;P&gt;Angel "Java" Lopez&lt;BR&gt;&lt;A href="http://www.ajlopez.com/"&gt;http://www.ajlopez.com/&lt;/A&gt;&lt;/P&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=371926" 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/Cursos/default.aspx">Cursos</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Domain-Driven+Design/default.aspx">Domain-Driven Design</category></item></channel></rss>