<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-61343362448121600</id><updated>2011-09-19T14:30:35.447-03:00</updated><category term='Tips'/><category term='Quetzal'/><category term='Generación de código'/><title type='text'>Dominando el Dominio?</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://claudiomeschini.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/61343362448121600/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://claudiomeschini.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Claudio</name><uri>http://www.blogger.com/profile/05052446974844504256</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>13</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-61343362448121600.post-559175274823963314</id><published>2011-03-01T08:54:00.005-03:00</published><updated>2011-03-01T09:55:44.769-03:00</updated><title type='text'>Katayunos de febrero</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-5v-NbSd_U2U/TWzrTIlCTEI/AAAAAAAAAwo/iFEOLUXGEtg/s1600/MesaKatayuno.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 221px; height: 166px;" src="http://1.bp.blogspot.com/-5v-NbSd_U2U/TWzrTIlCTEI/AAAAAAAAAwo/iFEOLUXGEtg/s320/MesaKatayuno.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5579092752358067266" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;El 17 y 25 de febrero pasado tuve la suerte de participar en la organización de dos "Katayunos". El primero lo realizamos junto con un grupo de amigos (Mario Dal Lago y Francisco Larramendi) en un bar de Buenos Aires, donde degustando unas ricas medialunas llevamos adelante una "kata" de "&lt;a href="http://www.osherove.com/tdd-kata-1/"&gt;StringCalculator&lt;/a&gt;". El segundo lo realizamos en el laboratorio de &lt;a href="http://www.mug.org.ar"&gt;Grupo de Usuarios Microsoft(MUG)&lt;/a&gt;, (el próximo será el 29 de marzo) junto a Ariel Cen, Alejandro Nelis y Carlos Peix.&lt;br /&gt;&lt;br /&gt;Para quien no conozca lo que son los "&lt;a href="http://www.programania.net/webdev/katayunos/"&gt;katayunos&lt;/a&gt;", les cuento que es una reunión, inspirada en los "&lt;a href="http://www.codingdojo.org/"&gt;coding dojo&lt;/a&gt;", donde un grupo de programadores nos juntamos a escribir código para resolver un problema (o sea la "kata"), y a la vez desayunamos. El acento no está puesto en resolver un problema complejo, en general son muy sencillos, sino en practicar pair-programming y TDD. La idea es ir adquiriendo una "gimnasia", que nos acostumbre a incorporar estas prácticas, como movimientos naturales, a nuestra programación diaria, al estilo de las "katas" en las artes marciales.&lt;br /&gt;&lt;br /&gt;Las ventajas que le encuentro a los "katayunos" es que son reuniones que organizarlas cuesta muy poco, solamente se necesita combinar un lugar de encuentro como un bar y un par de notebooks, y que nos permite aprender e intercambiar experiencias con programadores que quieren innovar y mejorar la calidad del software que construyen diariamente. Por otro lado la escala no condiciona su realización, ya que con dos personas ya le da sentido a la reunión.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.codeandbeyond.org/2011/02/video-y-ejercicio-agiles-buenos-aires.html"&gt;Acá &lt;/a&gt;les dejo un video de la comunidad ágil de Buenos Aires sobre la realización de un "randori coding dojo" con una explicación más detallada del sentido de estas prácticas.&lt;br /&gt;Y una "&lt;a href="https://docs.google.com/document/pub?id=1zoJlBIXiHncxkyVgzpYfop6Lc-AxUzX-i8RwtuRViq8"&gt;traducción&lt;/a&gt;" de la kata de "String Calculator"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/61343362448121600-559175274823963314?l=claudiomeschini.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://claudiomeschini.blogspot.com/feeds/559175274823963314/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=61343362448121600&amp;postID=559175274823963314' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/61343362448121600/posts/default/559175274823963314'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/61343362448121600/posts/default/559175274823963314'/><link rel='alternate' type='text/html' href='http://claudiomeschini.blogspot.com/2011/03/katayunos-de-febrero.html' title='Katayunos de febrero'/><author><name>Claudio</name><uri>http://www.blogger.com/profile/05052446974844504256</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-5v-NbSd_U2U/TWzrTIlCTEI/AAAAAAAAAwo/iFEOLUXGEtg/s72-c/MesaKatayuno.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-61343362448121600.post-5238060276075635641</id><published>2010-03-23T18:56:00.006-03:00</published><updated>2010-03-23T19:52:40.852-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Quetzal'/><title type='text'>Are you ConfORM? Yes!!!</title><content type='html'>&lt;a href="http://fabiomaulo.blogspot.com/"&gt;Fabio&lt;/a&gt; volvió a hacerlo(cfr. NHValidator, SharpTestEx),  y nos voló la cabeza con un espectacular código para olvidarnos de los .hbm, y mapear directamente nuestras entidades a la BD sólo escribiendo lo mínimo indispensable.&lt;br /&gt;&lt;a href="http://code.google.com/p/codeconform/"&gt;ConfORM&lt;/a&gt;, que así se llama el proyecto, es (entiendo) un framework para CONFigurar  desde código el ORM NHibernate, sin necesidad de utilizar los archivos XML, y aprovechando las nuevas funcionalidades de NH 3.0. Pueden saber más de como usarlo visitando su blog o escuchando la VAN que dio en altnet.hispano.&lt;br /&gt;Pero a que viene todo este cuento?&lt;br /&gt;Es que estuve trabajando en mi framework Quetzal para implementar una "extensión" (no son extensiones de .net) que use ConfOrm en lugar de AutomationNH( o NHGenerator) , ya que el espiritú es el mismo, pero ConfOrm esta mucho mejor resuelto, y posee como ventaja el amplísimo conocimiento que tiene su autor sobre NH y el manejo de BD en general.&lt;br /&gt;El cuento viene entonces debido a que, luego de "bucear" en el código de ConfOrm, y de preguntarle algunas cositas al "bueno" de Fabio, pude implementar la extensión, y parece que todo funciona.&lt;br /&gt;Así que &lt;a href="http://svn2.assembla.com/svn/Quetzal"&gt;el código esta subido&lt;/a&gt; como para empezar a probarlo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/61343362448121600-5238060276075635641?l=claudiomeschini.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://claudiomeschini.blogspot.com/feeds/5238060276075635641/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=61343362448121600&amp;postID=5238060276075635641' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/61343362448121600/posts/default/5238060276075635641'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/61343362448121600/posts/default/5238060276075635641'/><link rel='alternate' type='text/html' href='http://claudiomeschini.blogspot.com/2010/03/are-you-conform-yes.html' title='Are you ConfORM? Yes!!!'/><author><name>Claudio</name><uri>http://www.blogger.com/profile/05052446974844504256</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-61343362448121600.post-6191188057549552394</id><published>2010-03-23T17:58:00.006-03:00</published><updated>2010-03-23T18:44:49.071-03:00</updated><title type='text'>Documentación ágil y Open Source</title><content type='html'>El pasado sábado 13 de marzo participé del Agile Open Space 2010 en Buenos Aires que organizó la gente de &lt;a href="http://www.agiles.org/argentina"&gt;Agiles de Argentina&lt;/a&gt;&lt;span style="text-decoration: underline;"&gt;.&lt;/span&gt; Demás esta decir, que fue una experiencia muy productiva y enriquecedora, no solo desde el punto  de vista técnico sino humano también.&lt;br /&gt;En una de las charlas en que se dividio el Open Space, se tocó el tema de la documentación de un proyecto "ágil". La motivación de quien había propuesto el tema provenía de que estaba trabajando, junto con su equipo, en un proyecto como consultor externo, y terminado este deberían transferirle las capacidades para que un equipo interno de la empresa lo siguiera desarrollando.&lt;br /&gt;Esto disparó una serie de propuestas desde armar videos con entrevistas a los propios desarrolladores, como demos para mostrar el deployment, hasta distintos tipos de gráficas, o infografías que explicaran la "metafora" del sistema que estaban desarrollando. Todas propuestas que implicaban dejar mucho más que un "Manual del usuario", y que apuntaban a tratar de "explicar" en un nivel de mayor abstracción, lo que el código decía.&lt;br /&gt;Pero una de ellas me quedo picando en la cabeza, y fue la idea de &lt;span style="font-weight: bold;"&gt;escribir un blog con las decisiones de arquitectura&lt;/span&gt; que vamos tomando en el día  a día, porqué usamos esta opción y desacartamos otras, o porque el surgimiento de un nuevo requerimiento implico cambios, etc.&lt;br /&gt;Y esto me pareció muy aplicable al escenario que presentan los proyectos "open source", donde también se necesita tranferir el saber de un proyecto a personas que no han trabajado en  él. Y pongo el acento en esto, porque creo que una de las grandes dificultades para que no haya más personas en proyectos "open source" es lo difícil que resulta iniciarse en uno, es decir tener un nivel de conocimiento mínimo de lo codificado, entender la "metáfora" de quienes lo diseñaron, y como eso impacto en el código.&lt;br /&gt;Ya sabemos que arduo es, escribir la documentación de cualquier proyecto, quizás este sea un mecanismo "ágil" para lograrlo, ya que no solo ayudará a los "newbie", sino a nosotros mismo cuando volvamos 2 años despues a modificarlo :(&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/61343362448121600-6191188057549552394?l=claudiomeschini.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://claudiomeschini.blogspot.com/feeds/6191188057549552394/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=61343362448121600&amp;postID=6191188057549552394' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/61343362448121600/posts/default/6191188057549552394'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/61343362448121600/posts/default/6191188057549552394'/><link rel='alternate' type='text/html' href='http://claudiomeschini.blogspot.com/2010/03/documentacion-agil-y-open-source.html' title='Documentación ágil y Open Source'/><author><name>Claudio</name><uri>http://www.blogger.com/profile/05052446974844504256</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-61343362448121600.post-2991529371044560439</id><published>2009-01-12T23:54:00.001-02:00</published><updated>2009-01-13T00:02:15.295-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Quetzal'/><category scheme='http://www.blogger.com/atom/ns#' term='Generación de código'/><title type='text'>Quetzal finalmente disponible</title><content type='html'>&lt;p&gt;Luego de un a&amp;#241;o ajetreado, finalmente he liberado el c&amp;#243;digo de Quetzal bajo una licencia GPL. Lo pueden descargar de &lt;a href="http://svn2.assembla.com/svn/Quetzal/trunk"&gt;aqu&amp;#237;&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Varias fueron las razones por las que tarde tanto en liberar este framework, pero la principal era que en la primeras versiones era arduo de configurar y de extender, cosa que lo hac&amp;#237;a muy improductivo. Por suerte, Quetzal ha cambiado mucho internamente, desde esas primeras versiones principalmente para facilitar su extensibilidad.&lt;/p&gt;  &lt;p&gt;Es as&amp;#237; que Quetzal es un framework &amp;quot;&lt;em&gt;orientado a la generaci&amp;#243;n de c&amp;#243;digo&lt;/em&gt;&amp;quot;, ya que si bien fue pensado para resolver varios de los problemas que se presentan al trabajar con la generaci&amp;#243;n de c&amp;#243;digo, su capacidad de mantener el &amp;quot;modelo&amp;quot; en memoria permite que funcione como una &amp;quot;extensi&amp;#243;n&amp;quot; de las clases del dominio agregando propiedades y m&amp;#233;todos de forma din&amp;#225;mica. &lt;/p&gt;  &lt;p&gt;Quienes bajen el c&amp;#243;digo tendr&amp;#225;n entre sus manos lo siguiente:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;El &amp;quot;core&amp;quot; de Quetzal que es &amp;quot;ModelDescriptor&amp;quot; y tres &lt;em&gt;&lt;strong&gt;extensiones&lt;/strong&gt;&lt;/em&gt;, &lt;/li&gt;    &lt;li&gt;AutomationNH tambien conocida como NHGenerator que permite generar los .hbm a partir de las clases del dominio. &lt;/li&gt;    &lt;li&gt;ModelToArtifact (M2A) que implementa un mecanismo para la manipulaci&amp;#243;n y la administraci&amp;#243;n de la generaci&amp;#243;n de c&amp;#243;digo &lt;/li&gt;    &lt;li&gt;y Validator que como su nombre lo indica implementa validaciones usando como validadores espec&amp;#237;ficos los de EntityLibrary 3.1 &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Pueden seguir como ejemplo los test, para el caso de M2A y Validator,&amp;#160; y el sample para el funcionamiento de &amp;quot;NHGenerator&amp;quot;. Se que los ejemplos son pobres pero mi idea es tener una demo y &amp;quot;alguna&amp;quot; documentaci&amp;#243;n que integre todo pr&amp;#243;ximamente.&lt;/p&gt;  &lt;p&gt;Espero sus comentarios y que les sea &amp;#250;til.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/61343362448121600-2991529371044560439?l=claudiomeschini.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://claudiomeschini.blogspot.com/feeds/2991529371044560439/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=61343362448121600&amp;postID=2991529371044560439' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/61343362448121600/posts/default/2991529371044560439'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/61343362448121600/posts/default/2991529371044560439'/><link rel='alternate' type='text/html' href='http://claudiomeschini.blogspot.com/2009/01/quetzal-finalmente-disponible.html' title='Quetzal finalmente disponible'/><author><name>Claudio</name><uri>http://www.blogger.com/profile/05052446974844504256</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-61343362448121600.post-5905602241186067233</id><published>2008-04-14T00:57:00.003-03:00</published><updated>2008-04-19T22:24:36.597-03:00</updated><title type='text'>ASP.NET MVC II : Recursos</title><content type='html'>&lt;p&gt;Como les conté estoy trabajando con Asp.Net MVC y como todo proyecto en ejecución carece de muchas funcionalidades y recursos que nos facilitan las cosas para construir aplicaciones del mundo real. Si aparte trabajan con Visual Web Developer 2008(VWD2008) como es mi caso, la cosa se complica un poco más, ya que el CTP 2 no soporta el tipo de proyectos que se manejan con esta IDE. Así que mi idea es compartir con Uds. algunos recursos que me resultaron de mucha ayuda y un pequeño aporte de mi parte.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://thinkingindotnet.wordpress.com/"&gt;Thinking in .NET&lt;/a&gt; blog con traducciones al castellano de importantes referentes de .net, sobre sus ultimas tecnologías. Entre las traducciones figuran el tutorial de MVC de Scott Gutthrie. &lt;/li&gt;    &lt;li&gt;Un &lt;a href="http://www.variablenotfound.com/2008/03/probando-aspnet-mvc-preview-2-con-web.html"&gt;template&lt;/a&gt; de una aplicación de Asp.Net MVC CTP 2 para utilizar con VWD 2008. Esencial para nuevos proyectos. Si ya venias trabajando con el CTP 1 te simplifica la migración. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.codeplex.com/MVCContrib"&gt;MVC Contrib - MvcContrib.org&lt;/a&gt; un importante proyecto de la comunidad para aumentar la funcionalidad del framework. Varias cosas muy interesantes (IOC, helpers, templates, &lt;a href="http://andrewpeters.net/2007/12/19/introducing-nhaml-an-aspnet-mvc-view-engine/"&gt;NHaml&lt;/a&gt; para los que conocen RoR, etc). No lo use todavía.&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.codeplex.com/MvcMembership"&gt;ASP.Net MVC Membership Starter Kit&lt;/a&gt; esta implemetación para MVC solo funciona en proyectos bajo VS2008. Se puede usar tambien con OpenID. Podrán hallar &lt;a href="http://svn2.assembla.com/svn/MembershipMVCVWD2008"&gt;aquí&lt;/a&gt; (svn) una adaptación del codigo fuente de mi autoría para Visual Web Developer 2008.&lt;/li&gt;&lt;li&gt;El &lt;a href="http://weblogs.asp.net/fredriknormen/archive/tags/MVC+Framework/default.aspx"&gt;blog&lt;/a&gt; de Fredrick Normén con ejemplos de programación avanzada.&lt;br /&gt;&lt;/li&gt; &lt;/ul&gt; Bueno, espero que a ustedes les sirva también .&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/61343362448121600-5905602241186067233?l=claudiomeschini.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://claudiomeschini.blogspot.com/feeds/5905602241186067233/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=61343362448121600&amp;postID=5905602241186067233' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/61343362448121600/posts/default/5905602241186067233'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/61343362448121600/posts/default/5905602241186067233'/><link rel='alternate' type='text/html' href='http://claudiomeschini.blogspot.com/2008/04/aspnet-mvc-ii-recursos.html' title='ASP.NET MVC II : Recursos'/><author><name>Claudio</name><uri>http://www.blogger.com/profile/05052446974844504256</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-61343362448121600.post-2395294574238990560</id><published>2008-04-10T20:04:00.010-03:00</published><updated>2010-12-21T20:47:09.482-03:00</updated><title type='text'>ASP.NET MVC I : RenderComponents y bugs</title><content type='html'>Estoy desarrollando desde el fin del año pasado un proyecto que usa Asp.Net MVC. Demás esta decir las bondades de la nueva arquitectura.&lt;br /&gt;Recientemente se lanzó el CTP 2 que trae una serie de mejoras, muchas basadas en las recomendaciones de la comunidad, y tambien se puede ver el código fuente (&lt;a href="http://www.codeplex.com/aspnet/SourceControl/ListDownloadableCommits.aspx"&gt;sic&lt;/a&gt;) ;).&lt;br /&gt;Para los conocedores de MVC, especialmente de MonoRail, entre las mejoras se encuentra la utilización de "ViewComponents", pero como toda tecnología que esta "verde" trae sus bugs.&lt;br /&gt;Es así que me cruce con uno de estos "bichitos" que es comentado en este &lt;a href="http://csainty.blogspot.com/2008/03/rendercomponent-or-renderusercontrol.html"&gt;post&lt;/a&gt;&lt;br /&gt;y cuyo autor plantea el "core" de la solución, y tambien propone una solución más general pero sin código. Mi humilde aporte va en este sentido, es decir aqui les dejo el código mas general que permita avanzar hasta el próximo CTP. La funcionalidad se implementa mediante "extensions" (.net 3.5)  de la clase ViewPage:&lt;br /&gt;&lt;br /&gt;&lt;script type="syntaxhighlighter" class="brush:csharp"&gt;&lt;![CDATA[&lt;br /&gt;using System;&lt;br /&gt;using System.Linq.Expressions;&lt;br /&gt;using System.Web.Mvc;&lt;br /&gt;&lt;br /&gt;public static class Extensions&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;   public static string RenderComponent&lt;T&gt;(this ViewPage vwp,&lt;br /&gt;Expression&lt;Action&lt;T&gt;&gt; action) where T : ComponentController&lt;br /&gt;   {&lt;br /&gt;       T controller = Activator.CreateInstance&lt;T&gt;();&lt;br /&gt;       controller.Context = vwp.ViewContext;&lt;br /&gt;       var ex = action.Compile();&lt;br /&gt;       ex.Invoke(controller);&lt;br /&gt;       return controller.RenderedHtml;&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Y lo utilizamos en las .aspx así:&lt;br /&gt;&lt;br /&gt;....&lt;br /&gt;&lt;script type="syntaxhighlighter" class="brush:csharp"&gt;&lt;![CDATA[&lt;br /&gt;&lt;%=  this.RenderComponent&lt;datecomponentcontroller&gt;&lt;br /&gt;( c =&gt; c.Show("Today", DateTime.Today() , true ))%&gt;&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;Bueno la seguimos en el próximo post.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/61343362448121600-2395294574238990560?l=claudiomeschini.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://claudiomeschini.blogspot.com/feeds/2395294574238990560/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=61343362448121600&amp;postID=2395294574238990560' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/61343362448121600/posts/default/2395294574238990560'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/61343362448121600/posts/default/2395294574238990560'/><link rel='alternate' type='text/html' href='http://claudiomeschini.blogspot.com/2008/04/aspnet-mvc-i.html' title='ASP.NET MVC I : RenderComponents y bugs'/><author><name>Claudio</name><uri>http://www.blogger.com/profile/05052446974844504256</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-61343362448121600.post-2626137392047600242</id><published>2008-03-08T03:19:00.004-02:00</published><updated>2009-01-13T00:00:17.978-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Quetzal'/><category scheme='http://www.blogger.com/atom/ns#' term='Generación de código'/><title type='text'>NHGenerator ve la luz</title><content type='html'>Para aquellos que les aburre como a mí escribir los mappings de nHibernate, deje una &lt;a href="http://www.assembla.com/wiki/show/demonhgenerator"&gt;demo&lt;/a&gt;  tan  temprana, que casi es una prueba de concepto, de &lt;span style="font-style: italic;"&gt;NHGenerator&lt;/span&gt;, una herramienta que espero evolucione, guste  y fundamentalmente acorte nuestros tiempos de desarrollo.&lt;br /&gt;NHGenerator es una herramienta que esta inspirada por las mismas ideas que exprese cuando presente a Quetzal, y que las  podrán leer en post anteriores aunque bajo el nombre de Automation.NH.&lt;br /&gt;Utilice para la demostración los test del proyecto &lt;a href="http://unhaddins.googlecode.com/"&gt;uNHAddins&lt;/a&gt; , indispensables para encarar cualquier proyecto con NHibernate.&lt;br /&gt;Hasta ahora he implementado los test que implicaban los mapeos mas básicos "Master-Detail", "one-to-one", "many-to-one" y "component", quedando como paso importante los mapeos de herencia.&lt;br /&gt;Cabe aclarar tambien que no he tenido tiempo todavía de probarlo en dominio "complejos".&lt;br /&gt;Espero sus comentarios.&lt;br /&gt;&lt;a href="http://unhaddins.googlecode.com/"&gt; &lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/61343362448121600-2626137392047600242?l=claudiomeschini.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://claudiomeschini.blogspot.com/feeds/2626137392047600242/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=61343362448121600&amp;postID=2626137392047600242' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/61343362448121600/posts/default/2626137392047600242'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/61343362448121600/posts/default/2626137392047600242'/><link rel='alternate' type='text/html' href='http://claudiomeschini.blogspot.com/2008/03/nhgenerator-ve-la-luz.html' title='NHGenerator ve la luz'/><author><name>Claudio</name><uri>http://www.blogger.com/profile/05052446974844504256</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-61343362448121600.post-4618995479870432524</id><published>2007-11-17T21:04:00.000-03:00</published><updated>2007-11-17T22:44:48.329-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tips'/><title type='text'>Prism y nuestro IDE</title><content type='html'>Me &lt;a href="http://www.uberbin.net/archivos/open-source/mozilla-prism-uniendo-la-web-y-el-escritorio.php"&gt;entere &lt;/a&gt;que Mozilla había "relanzado" una especie de "Firefox-light", es decir un Firefox que permite correr un solo sitio , impidiendo la navegación por otras urls. La aplicación se denomina ahora "&lt;a href="http://labs.mozilla.com/2007/10/prism/"&gt;Prism&lt;/a&gt;",  y antes  era conocida como "WebRunner".&lt;br /&gt;&lt;br /&gt;Leyendo sobre las ventajas (menor consumo de recursos, mayor seguridad, etc.) se me ocurrió que podía ser el compañero ideal de nuestro "IDE" para desarrollar sitios web y no esperar tanto cada vez que "recargabamos" el proyecto. Así que lo puse a prueba con VS2005 y anduvo bárbaro, cargando como esperaba "muchísimo" más rápido el proyecto para debuguear.&lt;br /&gt;&lt;br /&gt;Para hacerlo procedan así&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Generen un "Acceso directo" con Prism con el URL de su aplicación por ej: "http://localhost:4401/Website/Default.aspx".&lt;/li&gt;&lt;li&gt; luego tomando de la hoja de propiedades del Acceso Directo que genero Prism los valores del campo "Destino"&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_vBHVZQqyRRs/Rz-KYgh04NI/AAAAAAAAAJ8/eo2LSv7SSPU/s1600-h/TestPrisma1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp3.blogger.com/_vBHVZQqyRRs/Rz-KYgh04NI/AAAAAAAAAJ8/eo2LSv7SSPU/s320/TestPrisma1.png" alt="" id="BLOGGER_PHOTO_ID_5133974253878960338" border="0" /&gt;&lt;/a&gt;&lt;li&gt;configuren en las opciones de Inicio en el menu WebSite de VS2005, poniendo en este caso en el campo de&lt;br /&gt;"Start external program":   &lt;span style="font-weight: bold;"&gt;C:\Archivos de programa\Prism\prism.exe&lt;br /&gt;&lt;/span&gt;y en el campo "Command line argument": &lt;span style="font-weight: bold;"&gt;-webapp TestPrisma@prism.app&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_vBHVZQqyRRs/Rz-Mzgh04PI/AAAAAAAAAKM/273XUkKjOGE/s1600-h/TestPrisma2.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp3.blogger.com/_vBHVZQqyRRs/Rz-Mzgh04PI/AAAAAAAAAKM/273XUkKjOGE/s320/TestPrisma2.jpg" alt="" id="BLOGGER_PHOTO_ID_5133976916758683890" border="0" /&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Aplicar, y listo.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/61343362448121600-4618995479870432524?l=claudiomeschini.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://claudiomeschini.blogspot.com/feeds/4618995479870432524/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=61343362448121600&amp;postID=4618995479870432524' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/61343362448121600/posts/default/4618995479870432524'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/61343362448121600/posts/default/4618995479870432524'/><link rel='alternate' type='text/html' href='http://claudiomeschini.blogspot.com/2007/11/prisma-y-nuestro-ide.html' title='Prism y nuestro IDE'/><author><name>Claudio</name><uri>http://www.blogger.com/profile/05052446974844504256</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_vBHVZQqyRRs/Rz-KYgh04NI/AAAAAAAAAJ8/eo2LSv7SSPU/s72-c/TestPrisma1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-61343362448121600.post-5617916710332671776</id><published>2007-09-03T13:27:00.000-03:00</published><updated>2007-10-10T01:30:19.250-03:00</updated><title type='text'>Agradecimiento y deuda</title><content type='html'>Hoy abro el correo de la lista de arquitectura del MUG y encuentro el &lt;a href="http://msmvps.com/blogs/lopez/archive/2007/09/03/reuni-243-n-de-generaci-243-n-de-sistemas-con-ajgenesis.aspx"&gt;post&lt;/a&gt; que escribío Angel sobre la charla que dio el viernes y que ya les comente . Y me llevé la grata sorpresa de ser citado en él, y en su blog, lo cual le agradezco.&lt;br /&gt;Próximamente subire una version mejorada de "templates compilados" para aclarar un poco  màs el asunto&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/61343362448121600-5617916710332671776?l=claudiomeschini.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://claudiomeschini.blogspot.com/feeds/5617916710332671776/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=61343362448121600&amp;postID=5617916710332671776' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/61343362448121600/posts/default/5617916710332671776'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/61343362448121600/posts/default/5617916710332671776'/><link rel='alternate' type='text/html' href='http://claudiomeschini.blogspot.com/2007/09/agradecimiento-y-deuda.html' title='Agradecimiento y deuda'/><author><name>Claudio</name><uri>http://www.blogger.com/profile/05052446974844504256</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-61343362448121600.post-8893977826543183721</id><published>2007-08-31T13:59:00.000-03:00</published><updated>2007-09-03T18:46:31.017-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Generación de código'/><title type='text'>Templates compilados?</title><content type='html'>Hoy, luego de asistir a una charla en el &lt;a href="http://www.mug.org.ar/"&gt;"MUG"&lt;/a&gt; dictada por el "maestro" &lt;a href="http://ajlopez.com/"&gt;Angel&lt;/a&gt; sobre generación de código y su excelente &lt;span style="font-weight: bold;"&gt;"ajgenesis", &lt;/span&gt;&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;me quede "tildado" en la relación entre templates, código "vivo" y su actualización de forma dinámica. Ya que uno de los grandes problemas de la "generación de código" es la actualización del código generado, sobre todo si estamos produciendo software de una forma incremental. O sea,  si actualizamos el "template", como "brodcastiamos" o difundimos eso en el "código" ya generado, y por sobre todo no pisamos el "ajuste fino" que hicimos sobre él.&lt;br /&gt;&lt;br /&gt;Por otro lado, habitualmente para generar un template en alguna herrmienta de generación de código lo que hago es reemplazar las partes "variables" de un codigo en el lenguaje original que estoy trabajando y lo reemplazo por los token que me da el generador. O sea algo así:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;"Edit&lt;span style="font-weight: bold;"&gt;Persona&lt;/span&gt;"  se transforma en "Edit&lt;span style="font-weight: bold;"&gt;${NombreEntidad}&lt;/span&gt;".&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Esto implica abrir el notepad buscar "Persona" y reemplazarlo por "Edit${NombreEntidad}". Esto sucede cada vez que cambio mi código "fuente", o sino debo agregar a "pelo" en el template lo que modifique sin garantía de que este código este compilado. Demás esta decir que si son muchas las variables a reemplazar y muchos los templates a actualizar el trabajo se torna largo, y tedioso.&lt;br /&gt;&lt;br /&gt;Lo ideal sería entonces que:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;El template "compilara".&lt;/li&gt;&lt;li&gt;Que en el proceso de re-generación no pisará nuestro "ajuste fino".&lt;/li&gt;&lt;/ol&gt;Lo que les dejó &lt;a href="http://www.gigasize.com/get.php/3195486106/TemplateNant.zip"&gt;aquí&lt;/a&gt; es una especie de "prueba de concepto" que me gustaría profundizar con la opinión de ustedes. Solamente atacá el primer problema, ya que es un mero ejemplo que más que ofrecer una solución lo pongo para explorar una idea. Esta realizado simplemente con NAnt y algún "truquillo" en el código c#.&lt;br /&gt;&lt;br /&gt;Para usarlo simplemente tenemos que respetar que las variables/string que queremos reemplazar empiezen con "_" y terminen con "0",  (se pueden elegir otros que c# permita) ,   lanzar el build de NAnt (GeneraEntidad) y luego recargar el proyecto. El único problema es que deberán comentar el código de cada generación de entidad ya que NAnt NO &lt;a href="http://https//sourceforge.net/tracker/?func=detail&amp;atid=402868&amp;amp;amp;amp;amp;amp;aid=1677226&amp;amp;group_id=31650"&gt;"puede"!!!&lt;/a&gt; sobreescribir sus propiedades.&lt;br /&gt;&lt;br /&gt;Los comentarios estan abiertos para opinar&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/61343362448121600-8893977826543183721?l=claudiomeschini.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://claudiomeschini.blogspot.com/feeds/8893977826543183721/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=61343362448121600&amp;postID=8893977826543183721' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/61343362448121600/posts/default/8893977826543183721'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/61343362448121600/posts/default/8893977826543183721'/><link rel='alternate' type='text/html' href='http://claudiomeschini.blogspot.com/2007/08/templates-compilados.html' title='Templates compilados?'/><author><name>Claudio</name><uri>http://www.blogger.com/profile/05052446974844504256</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-61343362448121600.post-1980229161610987210</id><published>2007-08-16T18:13:00.000-03:00</published><updated>2007-08-16T19:12:24.923-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Quetzal'/><title type='text'>Presentando a Quetzal</title><content type='html'>Como dijimos en el &lt;a href="http://claudiomeschini.blogspot.com/2007/08/introduccin-quetzal.html"&gt;blog introductorio&lt;/a&gt; Quetzal es un framework de librerías de mi autoría, realizado en c# que consta de dos capas:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;La &lt;span style="font-weight: bold;"&gt;capa de descripción del modelo&lt;/span&gt; (Model Descriptor): que comprende las clases que describen el modelo inferido a partir de las clases del dominio. El cual puede ser "refinado" desde el evento Init.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;y la &lt;span style="font-weight: bold;"&gt;capa de automatización&lt;/span&gt; que comprende las librerías que generan distintos artefactos de nuestra aplicación. De esta capa solo desarrollé dos librerías:&lt;/li&gt;&lt;/ol&gt;&lt;ol&gt;&lt;ol&gt;&lt;li&gt;Automation.UI: para la generación de pantallas.&lt;/li&gt;&lt;li&gt;Automation.NH: para la generación de los .hbm para NHibernate.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/ol&gt;Quizas una imagen describa mejor lo dicho:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_vBHVZQqyRRs/RsS-eH-w9CI/AAAAAAAAAAM/jglyc7PQNF0/s1600-h/Quetzal.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_vBHVZQqyRRs/RsS-eH-w9CI/AAAAAAAAAAM/jglyc7PQNF0/s320/Quetzal.png" alt="" id="BLOGGER_PHOTO_ID_5099410102837900322" border="0" /&gt;&lt;/a&gt;Existe una &lt;span style="font-weight: bold;"&gt;tercera capa de servicios&lt;/span&gt;, que no aparece en el gráfico, y que por ahora sólo contiene unas tareas en NAnt que permite ejecutar unos templates de NVelocity inyectandole &lt;span style="font-style: italic;"&gt;el modelo descripto.&lt;br /&gt;&lt;/span&gt;&lt;span&gt;Vale la pena decir que si bien esta es mi cuarta version de las librerías, (hace casi un año que empecé) estas continuan aún en un estado beta en el caso de Model Descriptor y Automation.UI y en un estado alfa Automation.NH.&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/61343362448121600-1980229161610987210?l=claudiomeschini.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://claudiomeschini.blogspot.com/feeds/1980229161610987210/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=61343362448121600&amp;postID=1980229161610987210' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/61343362448121600/posts/default/1980229161610987210'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/61343362448121600/posts/default/1980229161610987210'/><link rel='alternate' type='text/html' href='http://claudiomeschini.blogspot.com/2007/08/presentando-quetzal.html' title='Presentando a Quetzal'/><author><name>Claudio</name><uri>http://www.blogger.com/profile/05052446974844504256</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_vBHVZQqyRRs/RsS-eH-w9CI/AAAAAAAAAAM/jglyc7PQNF0/s72-c/Quetzal.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-61343362448121600.post-3952673048515486801</id><published>2007-08-15T18:31:00.000-03:00</published><updated>2007-08-16T19:10:15.660-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Quetzal'/><title type='text'>Introducción a Quetzal</title><content type='html'>&lt;h3&gt;El surgimiento...&lt;/h3&gt;&lt;br /&gt;Hace varios años que vengo girando alrededor del tema de ser "productivo" en mi trabajo, y a su vez me aburre mucho "copiar y pegar" código y luego reemplazar, para hacer aplicaciones nuevas, sin hablar de los riesgos que esto implica. Así es que siempre he tratado de construirme algún framework, o herramientas que me ayudaran a evitar esta tediosa tarea.&lt;br /&gt;Unos de mis primeros intentos fue por Marzo del 2002 con un proyecto de "generación de código" que se llamo "GenClases" y que realice en VB6 + XML + XSLT.  Demás esta decir que fracasé en tanto que debía escribir las XSLT(o sea los templates)  para hacer las transformaciones. Un trabajo que luego de cierto grado de complejidad se torna "inhumano".&lt;br /&gt;Luego vino .Net, c#, CodeSmith, MyGeneration, NHibernate, Patrones, DDD, ASP.NET 2.0, AJAX etc.   por lo que pasó un tiempo hasta que logre reacomodar la cabeza para insistir con el tema y finalmente pude volver a la tarea de hacer algo que me ayudara en la generación de mis aplicaciones.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Pero... que es Quetzal?&lt;/h3&gt;&lt;br /&gt;Quetzal es un framework de librerías desarrollado en C#, que junto a otras herramientas como &lt;a href="http://nant.sourceforge.net/"&gt;NAnt&lt;/a&gt; y &lt;a href="http://nvelocity.sourceforge.net/"&gt;NVelocity&lt;/a&gt;, permite la &lt;span style="font-weight: bold;"&gt;creación de aplicaciones&lt;/span&gt; y sus multiples artefactos, &lt;span style="font-weight: bold;"&gt;a partir del código escrito para las clases del dominio&lt;/span&gt; de la aplicación.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Algunos antecedentes&lt;/h3&gt;&lt;br /&gt;Es dificil entender el "punto nodal" de Quetzal sin ver un panorama de las herramientas de &lt;span style="font-weight: bold;"&gt;"automatización"&lt;/span&gt; para la generación de aplicaciones.&lt;br /&gt;Una primera aproximación es la de los "generadores de código". &lt;a href="http://www.ajlopez.com/"&gt;Angel "Java" López&lt;/a&gt;  &lt;a href="http://msmvps.com/blogs/lopez/archive/2007/08/02/sobre-la-generaci-243-n-de-c-243-digo.aspx"&gt;ha escrito&lt;/a&gt; muy, mucho y bien sobre el tema (y en castellano para colmo) lo que me ahorra de escribir unos buenos párrafos sobre esto.&lt;br /&gt;Pero tambien hay frameworks, como "&lt;a href="http://www.castleproject.org/monorail/index.html"&gt;MonoRail&lt;/a&gt;" que van más allá de la generación del código y parte de su "trabajo" lo realizan de forma dinámica o en "runtime" como en el caso de la generación de los .hbm de NHibernate  con "Castle ActiveRecord".&lt;br /&gt;Otra mirada del asunto la encontrmos en "&lt;a href="http://nakedobjects.org/wiki/Main_Page"&gt;Naked Objects&lt;/a&gt;" para el mundo Java, con su "futura" &lt;a href="http://www.nakedobjects.net/"&gt;versión optimizada&lt;/a&gt; para .net, donde solamente debemos escribir "una" capa (la del dominio) para tener la aplicación hecha. Y no sigo más para no aburrir y porque con esto me alcanza para marcar algunas diferencias en la visión de Quetzal.&lt;br /&gt;Queda sin embargo un tema importate en todo esto : &lt;a href="http://www.onboard.jetbrains.com/is1/articles/04/10/lop/2.html"&gt;LOP&lt;/a&gt; o "Lenguajes Orientados a la Programación", una especie de "esperanto" para programar, pero me referiré a esto más adelante .&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Los problemas de estos enfoques&lt;/h3&gt;&lt;br /&gt;En la mayoría de las estrategias de los "generadores de código" el modelo esta separado de la aplicación, siempre hay una &lt;span style="font-weight: bold;"&gt;metadata &lt;/span&gt;que define al &lt;span style="font-weight: bold;"&gt;dominio &lt;/span&gt;de la aplicación que es &lt;span style="font-style: italic;"&gt;distinta &lt;/span&gt;del codigo de las clases, siempre debe sucederse una transformación con el consiguiente problema de el "gap"(distancia) posible entre el modelo de la metadata  y el modelo de la aplicación. A esto debemos sumarle que pasa con el código "nuevo" agregado, ante una nueva generación, "partial class" y herencia juegan aquí su rol para garantizar la "sincronía", que si no esta prevista implica "fuertes" dolores de cabeza.&lt;br /&gt;En cambio los frameworks como Mono Rail, tienen el problema de que estan "atados" a una "arquitectura" y en este caso tambien a una tecnología (NHibernate con ActiveRecord), entiendo que su uso no es excluyentes, pero implican un costo y pierde algo de la gracia de su uso.&lt;br /&gt;El enfoque en cambio de Naked Object, que es el que más me simpatiza en términos de "productividad", implica escribir el dominio de una forma "extraña", definiendo las clases del dominio con los tipos que propone el framework, pudiendo implicar que ciertas actualizaciones del lenguaje impliquen la actualización previa del framework para su utilización. Tambien tiene su costo en el entrenamiento, si trabajamos con personas no entrenadas en el framework&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Que sería entonces lo deseable de un generador de aplicaciones?&lt;/h3&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Poder escribir el modelo en el mismo código de la aplicación.&lt;/li&gt;&lt;li&gt;Que no implicara acoplamiento alguno con una determinada tecnología.&lt;/li&gt;&lt;li&gt;Que no usara otro tipo de clases para definir el dominio que nos impidan reutiliazar lo ya codificado y que la curva de aprendizaje sea leve.&lt;/li&gt;&lt;li&gt;Que no usen bases de datos  para inferir el modelo, evitando así la impedancia entre objetos y tablas.&lt;/li&gt;&lt;/ol&gt;En la &lt;a href="http://claudiomeschini.blogspot.com/2007/08/presentando-quetzal.html"&gt;próxima entrada&lt;/a&gt; les presento a Quetzal.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/61343362448121600-3952673048515486801?l=claudiomeschini.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://claudiomeschini.blogspot.com/feeds/3952673048515486801/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=61343362448121600&amp;postID=3952673048515486801' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/61343362448121600/posts/default/3952673048515486801'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/61343362448121600/posts/default/3952673048515486801'/><link rel='alternate' type='text/html' href='http://claudiomeschini.blogspot.com/2007/08/introduccin-quetzal.html' title='Introducción a Quetzal'/><author><name>Claudio</name><uri>http://www.blogger.com/profile/05052446974844504256</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-61343362448121600.post-239444002134687944</id><published>2007-08-15T17:57:00.000-03:00</published><updated>2007-08-16T18:46:15.320-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tips'/><title type='text'>Extendiendo las propiedades de una clase dinámicamente</title><content type='html'>El otro día estaba tratando de pasar parametros de una forma "muy" desacoplada, pero con cierto "rigor" y salio esto. No se que tan correcto sea, pero lo comparto por si a alguien le sirve.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt; /// &amp;lt;summary&amp;gt;&lt;br /&gt;     /// Parametros para extender dinámicamente las propiedades&lt;br /&gt;     /// &amp;lt;/summary&amp;gt;&lt;br /&gt;     Dictionary&amp;lt;string, object&amp;gt; _parameters = new Dictionary&amp;lt;string, object&amp;gt;();&lt;br /&gt;     public void SetParameter&amp;lt;T&amp;gt;(string name, T value)&lt;br /&gt;     {&lt;br /&gt;         if (_parameters.ContainsKey(name))&lt;br /&gt;             _parameters[name] = value;&lt;br /&gt;&lt;br /&gt;         else&lt;br /&gt;             _parameters.Add(name, value);&lt;br /&gt;     }&lt;br /&gt;&lt;br /&gt;     public T GetParameter&amp;lt;T&amp;gt;(string name)&lt;br /&gt;     {&lt;br /&gt;         try&lt;br /&gt;         {&lt;br /&gt;             if (_parameters.ContainsKey(name))&lt;br /&gt;                 return (T)_parameters[name];&lt;br /&gt;             else&lt;br /&gt;                 throw new Exception("El parametro solicitado no existe");&lt;br /&gt;         }&lt;br /&gt;         catch&lt;br /&gt;         {&lt;br /&gt;&lt;br /&gt;         }&lt;br /&gt;         return default(T);&lt;br /&gt;     }&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/61343362448121600-239444002134687944?l=claudiomeschini.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://claudiomeschini.blogspot.com/feeds/239444002134687944/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=61343362448121600&amp;postID=239444002134687944' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/61343362448121600/posts/default/239444002134687944'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/61343362448121600/posts/default/239444002134687944'/><link rel='alternate' type='text/html' href='http://claudiomeschini.blogspot.com/2007/08/extendiendo-las-propiedades-de-una.html' title='Extendiendo las propiedades de una clase dinámicamente'/><author><name>Claudio</name><uri>http://www.blogger.com/profile/05052446974844504256</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
