<?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 : ASP.NET</title><link>http://msmvps.com/blogs/lopez/archive/tags/ASP.NET/default.aspx</link><description>Tags: ASP.NET</description><dc:language>en</dc:language><generator>CommunityServer 2008.5 SP2 (Build: 40407.4157)</generator><item><title>Alt.Net Hispano VAN, ASP.NET MVC 2 con estilo, de Oxite a CodeCamp</title><link>http://msmvps.com/blogs/lopez/archive/2009/11/19/alt-net-hispano-van-asp-net-mvc-2-con-estilo-de-oxite-a-codecamp.aspx</link><pubDate>Thu, 19 Nov 2009 12:08:52 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1740732</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=1740732</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2009/11/19/alt-net-hispano-van-asp-net-mvc-2-con-estilo-de-oxite-a-codecamp.aspx#comments</comments><description>&lt;p&gt;Este sábado 21 de Noviembre, tendremos VAN (reunión virtual) organizada por la comunidad ALT.NET Hispano. El tema será ASP.NET MVC, en particular, la versión 2. Como siempre, la reunión no será sólo una exposición, sino también discusión, preguntas, ejemplos, recursos, opiniones. Hasta donde sé, el horario es el de siempre 5:00pm GMT (2 de la tarde acá en Buenos Aires). Y en enlace a usar es &lt;a title="http://snipr.com/virtualaltnet" href="http://snipr.com/virtualaltnet"&gt;http://snipr.com/virtualaltnet&lt;/a&gt; (más detalle sobre software y qué es una VAN al final de este post).&lt;/p&gt;  &lt;p&gt;La presentación inicial estará a cargo de Cristian Prieto, Microsoft ASP.NET MVP, MCPD ASP.NET Web Development Applications 3.5, MCTS Workflow Foundation 3.5:&lt;/p&gt;  &lt;p&gt;&lt;a title="http://www.cprieto.com/" href="http://www.cprieto.com/"&gt;http://www.cprieto.com/&lt;/a&gt; (me gusta el título “IDisposable Thoughts” :-)&lt;/p&gt;  &lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/cprieto01.png" alt="" /&gt; &lt;/p&gt;  &lt;p&gt;&lt;em&gt;Hi, My name is Cristian Prieto, I&amp;#39;m a Senior Software Developer living in Guatemala, Central America. I mainly &amp;quot;speak&amp;quot; in .Net languages (like C#, F# and _even_ VB.NET) but I really love programming in Python/Ruby/Erlang. When I&amp;#39;m not programming (or speaking at a .net user group) I enjoy reading and spend my life with my beautiful wife (Emy) and my three cats: Cocco, Motto and Chester&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Pueden seguirlo en Twitter como &lt;a href="http://twitter.com/cprieto" target="_blank"&gt;@cprieto&lt;/a&gt;:&lt;/p&gt;  &lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/cprieto02.png" alt="" /&gt; &lt;/p&gt;  &lt;p&gt;y en LinkedIn como &lt;a title="http://www.linkedin.com/in/cprieto" href="http://www.linkedin.com/in/cprieto"&gt;http://www.linkedin.com/in/cprieto&lt;/a&gt;. Ahí leemos su experiencia:&lt;/p&gt;  &lt;p&gt;&lt;em&gt;- Experienced Web Developer with more than 9 years in technologies like ASP.NET, PHP, Python, JavaScript and distributed programming.     &lt;br /&gt;- Agile software developer proficient with patterns and best practices like Test Driven Development, Behavior Driven Development and Continuous Integration.      &lt;br /&gt;- Lover of agile process based development like Lean Development, Kanban and Scrum.      &lt;br /&gt;- Technical Community Leader, mentor of new development trends and best practices. Awarded Microsoft ASP.NET MVP 2009      &lt;br /&gt;- Accustomed to work with many languages and tools.      &lt;br /&gt;- Self-thought and early adopter &lt;/em&gt;&lt;/p&gt;  &lt;h5&gt;&lt;em&gt;Cristian Prieto’s Specialties:&lt;/em&gt;&lt;/h5&gt;  &lt;p&gt;&lt;em&gt;ASP.NET, SQL Server, Web Development in general     &lt;br /&gt;Python, Best practices, Multi tier application development, Agile development (lean, kanban, scrum) &lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Escribe el bueno de Cristian &lt;a href="http://groups.google.com/group/altnet-hispano/t/6cd63a245ee45d60?hl=es" target="_blank"&gt;en la lista de ALT.NET Hispano&lt;/a&gt;, cuál va a ser el tema de la charla:&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Como ustedes recordaran, este sábado 21 de noviembre tendremos la VAN acerca de &lt;/em&gt;&lt;a href="http://ASP.NET"&gt;&lt;em&gt;ASP.NET&lt;/em&gt;&lt;/a&gt;&lt;em&gt; MVC 2, quería comentar un poco de que esperar para esta VAN (bueno, quizás también por parte del nerviosismo de ser mi primera VAN :P)     &lt;br /&gt;&lt;/em&gt;&lt;a href="http://ASP.NET"&gt;&lt;em&gt;ASP.NET&lt;/em&gt;&lt;/a&gt;&lt;em&gt; MVC fue &amp;quot;cocinado&amp;quot; durante 1 año y mientras tanto nos mantubieron pegados a la silla con 5 CTP&amp;#39;s y un par de betas... después de varios meses hemos visto aplicaciones en producción con la plataforma, 5 libros acerca del tema, muchos y muchos webcasts (hay 2 en &lt;/em&gt;&lt;a href="http://alt.net"&gt;&lt;em&gt;alt.net&lt;/em&gt;&lt;/a&gt;&lt;em&gt; hispano :D) y conferencias de &amp;quot;cómo explotarla&amp;quot;, multiples proyectos de ejemplo.... y, obviamente, muchas preguntas luego de hacer el &amp;quot;hola mundo&amp;quot;.     &lt;br /&gt;¿Qué pasa cuando necesitamos algo más que el típico proyecto de NerdDinner? ¿Qué pasa cuando mi aplicación realmente no es un típico ejemplo? ¿Dónde pongo la lógica? ¿Cómo divido y saco provecho de la framework? ¿Qué otras cosas podemos tener bajo la manga para hacernos la vida más sencilla?      &lt;br /&gt;Para aclarar estas dudas, examinaremos desde el punto de vista histórico y práctico con qué solemos comenzar y hasta dónde lo podemos llevar, mencionando cosas como MvcContrib y MvcTurbine y dónde encajan cosas como SharpArchitecture en todo esto...      &lt;br /&gt;¿Porqué menciono todo esto si la charla es de &lt;/em&gt;&lt;a href="http://ASP.NET"&gt;&lt;em&gt;ASP.NET&lt;/em&gt;&lt;/a&gt;&lt;em&gt; MVC 2?, simple, porque gran parte de los &amp;quot;problemas&amp;quot; que solemos encontrarnos con &lt;/em&gt;&lt;a href="http://ASP.NET"&gt;&lt;em&gt;ASP.NET&lt;/em&gt;&lt;/a&gt;&lt;em&gt; MVC vienen o prometen venir solucionados en la &amp;quot;cajita&amp;quot; de la versión 2...     &lt;br /&gt;Espero verlos en la VAN, y espero que les guste lo que he preparado :)&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Todo indica que va a ser una VAN muy interesante: el título del mensaje (y de este post) alude a un proyecto “fracaso” Oxite, con código disponibl, que fue critica por la comunidad por los “bad smell” que presentaba en la implementación, y a &lt;a href="http://code.google.com/p/codecampserver/" target="_blank"&gt;CodeCamp&lt;/a&gt;, un nuevo proyecto de código abierto, que sirve de muestra de mejores prácticas con &lt;a href="http://www.asp.net/mvc" target="_blank"&gt;ASP.NET MVC&lt;/a&gt; (&lt;a href="http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller" target="_blank"&gt;Model View Controller&lt;/a&gt;). Cristian menciona también a proyectos como &lt;a href="http://code.google.com/p/sharp-architecture/" target="_blank"&gt;SharpArchitecture&lt;/a&gt;, &lt;a href="http://www.codeplex.com/MVCContrib" target="_blank"&gt;MvcContrib&lt;/a&gt; y &lt;a href="http://mvcturbine.codeplex.com/" target="_blank"&gt;MvcTurbine&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Si no conocen qué es una reunión VAN, pueden consultar &lt;a href="http://www.zachariahyoung.com/zy/post/2009/01/Introduction-to-Virtual-ALTNET.aspx"&gt;VAN meetings&lt;/a&gt;. Para ver cómo se desarrolla una VAN de ALT.NET Hispano, y qué software necesitan para asistir, ver &lt;a href="http://altnet-hispano.pbworks.com/Descripcion-de-Reuniones-VAN"&gt;Descripcion-de-Reuniones-VAN&lt;/a&gt;. Pueden ver &lt;a href="http://altnet-hispano.pbworks.com/Historial-de-reuniones"&gt;el historial de anteriores reuniones VAN&lt;/a&gt; (visiten las que dieron, por ejemplo, sobre NHibernate, WPF y demás) (yo participé en &lt;a href="http://msmvps.com/blogs/lopez/archive/2009/09/18/resultado-de-la-van-en-alt-net-hispano-sobre-scrum.aspx"&gt;VAN sobre Scrum&lt;/a&gt; y en otra &lt;a href="http://msmvps.com/blogs/lopez/archive/2009/10/27/resultado-de-la-van-alt-net-hispano-sobre-generaci-243-n-de-c-243-digo.aspx" target="_blank"&gt;sobre generación de código&lt;/a&gt;). Supongo (pero confirmen) que la URL de entrada de esta VAN será &lt;a href="http://snipr.com/virtualaltnet"&gt;http://snipr.com/virtualaltnet&lt;/a&gt;. Cualquier cosa, pueden consultar &lt;a href="http://groups.google.com/group/altnet-hispano/"&gt;la lista de correo de ALT.NET Hispano&lt;/a&gt;. También pueden suscribirse para proponer nuevos temas, y colaborar con la comunidad. Si no pueden asistir a ésta VAN, seguramente quedará publicada más adelante, con video incluido.&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;br /&gt;&lt;a href="http://twitter.com/ajlopez"&gt;http://twitter.com/ajlopez&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1740732" 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/Desarrollo+de+Software/default.aspx">Desarrollo de Software</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Desarrollo+Web/default.aspx">Desarrollo Web</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/ALT.NET/default.aspx">ALT.NET</category></item><item><title>Ejemplos de ASP.NET, capas y Linq</title><link>http://msmvps.com/blogs/lopez/archive/2009/07/23/ejemplos-de-asp-net-capas-y-linq.aspx</link><pubDate>Thu, 23 Jul 2009 10:03:45 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1706460</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=1706460</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2009/07/23/ejemplos-de-asp-net-capas-y-linq.aspx#comments</comments><description>&lt;p&gt;Hace dos semanas, terminé de dar un curso de ASP.NET, con máquinas, en el laboratorio del &lt;a href="http://www.mug.org.ar/" target="_blank"&gt;Microsoft User Group de Argentina&lt;/a&gt;, en Buenos Aires, contando con diez asistentes, con los que tuvimos 30 horas explorando el desarrollo de sitios dinámicos con .NET. Los ejemplos que fuimos desarrollando y otros que bajamos de ejemplos míos, están disponibles para bajarse desde:&lt;/p&gt;  &lt;p&gt;&lt;a title="Material del Curso de ASP.NET en el MUG" href="http://www.ajlopez.net/ReferenciaVe.php?Id=267"&gt;Material del Curso de ASP.NET en el MUG&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;(Siempre pueden bajar lo que tratamos en mis cursos, desde&lt;/p&gt;  &lt;p&gt;&lt;a title="Materiales de Cursos" href="http://www.ajlopez.net/CursosEjemplos.php"&gt;Materiales de Cursos&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;ya sea ASP.NET, .NET, arquitectura, Java, JSP, Spring, Struts, etc… así como las presentaciones que se usaron)&lt;/p&gt;  &lt;p&gt;Hay varios ejemplos para estudiar, que podría explicar más en detalle en algún post, pero vaya ahora una introducción:&lt;/p&gt;  &lt;p&gt;&lt;a title="AjFirstExample" href="http://cid-9f903f3d6db0c176.skydrive.live.com/self.aspx/Examples/DotNet/AjFirstExampleDotNet.zip"&gt;AjFirstExample&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;En este ejemplo&lt;/p&gt;  &lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/aspnetmug01.png" alt="" /&gt; &lt;/p&gt;  &lt;p&gt;tenemos una base de datos, que pueden instalar usando cualquiera de los dos directorios Sql, y dos soluciones, una en VB.NET y otra en C#.&lt;/p&gt;  &lt;p&gt;En el directorio Sql, tenemos:&lt;/p&gt;  &lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/aspnetmug02.png" alt="" /&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Podemos lanzar la creación de la base con el comando ExecuteAll.cmd, que contiene&lt;/p&gt;  &lt;div id="codeSnippetWrapper"&gt;   &lt;div id="codeSnippet" style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;     &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;@&lt;span style="color:#008000;"&gt;REM  -------------------------------------------------------------&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;@&lt;span style="color:#008000;"&gt;REM  You can change server.&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;@&lt;span style="color:#008000;"&gt;REM  -------------------------------------------------------------&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;SET&lt;/span&gt; sqlServer=%1%&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; &lt;span style="color:#006080;"&gt;&amp;quot;%1%&amp;quot;&lt;/span&gt;==&lt;span style="color:#006080;"&gt;&amp;quot;&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;set&lt;/span&gt; sqlServer=(local)&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;call&lt;/span&gt; CreateDatabase %sqlServer%&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;&lt;span style="color:#008000;"&gt;rem TBD:&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;&lt;span style="color:#008000;"&gt;rem call LinkData %sqlServer%&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;&lt;span style="color:#008000;"&gt;rem call InsertData %sqlServer%&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;goto&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;end&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;:&lt;span style="color:#0000ff;"&gt;end&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Si lo invocamos sin parámetros, va a conectarse con nuestro MS SQL Server (local). Si queremos ir contra otra instancia, por ejemplo, contra .\SQLEXPRESS, hay que invocarlo como:&lt;/p&gt;

&lt;p&gt;ExecuteAll.cmd .\SQLEXPRESS&lt;/p&gt;

&lt;p&gt;Crea una base simple, AjFirstExample, con dos tablas, clientes y proveedores, y procedimientos almacenados:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/aspnetmug03.png" alt="" /&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;El ejemplo sigue algunos linemamientos de Patterns &amp;amp; Practices, de Microsoft, como tener separados Business Entities de Business Components. La solución tiene varios proyectos:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/aspnetmug04.png" alt="" /&gt; &lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;WebClient es el sitio web. AjFirstExample.Services es una capa de servicios lógicos (no tecnológicos, como podría ser un Web Service), que es un .DLL que se invoca directamente de el sitio web. Es lo que en patrones llamamos una Service Layer. AjFirstExample.Entities contiene entidadas simples, con datos, sin conducta ni persistencia. Está muy orientada al ejemplo, que apenas es un CRUD (Create Read Update Delete) de entidades, fragmento:&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;div id="codeSnippet" style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;
    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;Imports&lt;/span&gt; System.Collections.Generic&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;Imports&lt;/span&gt; AjFirstExample.Entities&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;Imports&lt;/span&gt; AjFirstExample.Business&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;Imports&lt;/span&gt; AjFramework.Data&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;Class&lt;/span&gt; SupplierService&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;Private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;Shared&lt;/span&gt; mSupplierComponent &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; SupplierComponent&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;Shared&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;Sub&lt;/span&gt; Insert(entity &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; Supplier)&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;        mSupplierComponent.Insert(entity)&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;Sub&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;Shared&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;Sub&lt;/span&gt; Update(entity &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; Supplier)&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;        mSupplierComponent.Update(entity)&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;Sub&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;Shared&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;Sub&lt;/span&gt; Delete(id &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;Integer&lt;/span&gt;)&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;        mSupplierComponent.Delete(id)&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;Sub&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;Shared&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;Function&lt;/span&gt; GetById(id &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;Integer&lt;/span&gt;) &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; Supplier&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;        &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; mSupplierComponent.GetById(id)&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;End&lt;/span&gt; Function&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;AjFirstExample.BusinessComponents tiene lógica de validación antes de grabar o insertar una entidad, y AjFirstExample.Data termina encargándose de la persistencia, usando un DataService, que yo había codificado dentro de algo que uso en mis cursos, AjFramework.&lt;/p&gt;

&lt;p&gt;En las páginas web, es común conversar con el servicio, para tomar y enviar datos a ese proyecto:&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;div id="codeSnippet" style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;
    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;Public&lt;/span&gt; Partial &lt;span style="color:#0000ff;"&gt;Class&lt;/span&gt; Admin_CustomersPage&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;Inherits&lt;/span&gt; System.Web.UI.Page&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;Protected&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;Sub&lt;/span&gt; Page_Load(&lt;span style="color:#0000ff;"&gt;ByVal&lt;/span&gt; sender &lt;span style="color:#0000ff;"&gt;As&lt;/span&gt; System.&lt;span style="color:#0000ff;"&gt;Object&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;ByVal&lt;/span&gt; e &lt;span style="color:#0000ff;"&gt;As&lt;/span&gt; System.EventArgs) &lt;span style="color:#0000ff;"&gt;Handles&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;Me&lt;/span&gt;.Load&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;        &lt;span style="color:#008000;"&gt;&amp;#39;Put user code to initialize the page here&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;        &lt;span style="color:#0000ff;"&gt;If&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;Not&lt;/span&gt; IsPostBack &lt;span style="color:#0000ff;"&gt;Then&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;            gvwData.DataSource = CustomerService.GetList&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;            gvwData.DataBind()&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;        &lt;span style="color:#0000ff;"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;If&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;Sub&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;Class&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Este ejemplo lo tienen también en ese mismo .zip implementada en C#. Van a ver que ha sido generada directamente por AjGenesis, el generador de código que uso para armar gran parte de mis ejemplos y del desarrollo del día a día que emprendo:&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;div id="codeSnippet" style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;
    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;&lt;span style="color:#008000;"&gt;&amp;#39;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;&lt;span style="color:#008000;"&gt;&amp;#39; File generated using AjGenesis&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;&lt;span style="color:#008000;"&gt;&amp;#39; http://www.ajlopez.com/ajgenesis&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;&lt;span style="color:#008000;"&gt;&amp;#39; http://www.ajlopez.net/ajgenesis&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;&lt;span style="color:#008000;"&gt;&amp;#39; Open Source Code Generation Engine&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;&lt;span style="color:#008000;"&gt;&amp;#39;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;&amp;#160;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Si tienen que cambiar el string de conexión, deben modificar el web.config del proyecto web, en el sector:&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;div id="codeSnippet" style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;
    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;AjFramework&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Parameters&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Parameter&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;ConnectionString&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Value&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;server=.\SQLEXPRESS;database=AjFirstExample;Integrated Security=true&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Parameters&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;AjFramework&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Hay otro ejemplo para bajarse e instalar de la misma manera:&lt;/p&gt;

&lt;p&gt;&lt;a title="AjTest" href="http://cid-9f903f3d6db0c176.skydrive.live.com/self.aspx/Examples/DotNet/AjTestDotNet.zip"&gt;AjTest&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Con las mismas ideas:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/aspnetmug05.png" alt="" /&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;pero con más entidades:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/aspnetmug06.png" alt="" /&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Cada departamento contiene empleados. Los proyectos contienen tareas, y las tareas se pueden asigna a empleados. Cada empleado tiene &amp;quot;Skills”, competencias, y cada competencia tiene empleados. Desde las páginas de administración, pueden ingresar los datos de estas entidades.&lt;/p&gt;

&lt;p&gt;Sin embargo, la relación entre estas entidades, no está en la entidad misma, sino en cómo recuperamos los datos necesarios desde el servicio. En vez de tener dentro de Department una lista de Employee, los empleados de un departamento se obtienen desde código, ejemplo:&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;div id="codeSnippet" style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;
    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Page_Load(&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; sender, System.EventArgs e)&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;{&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;    &lt;span style="color:#008000;"&gt;// Put user code to initialize the page here&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (!IsPostBack) {&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;        IdEntity = Convert.ToInt32(Request[&lt;span style="color:#006080;"&gt;&amp;quot;Id&amp;quot;&lt;/span&gt;]);&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;        Entity = DepartmentService.GetById(IdEntity);&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;        dtgDataEmployees.DataSource = EmployeeService.GetByDepartmentEx(IdEntity);&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;           DataBind();&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;    }&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Un ejemplo, donde usamos una base similar, pero en el código establecemos las relaciones, está en:&lt;/p&gt;

&lt;p&gt;&lt;a title="AjTestCSharp3Linq.zip" href="http://cid-9f903f3d6db0c176.skydrive.live.com/self.aspx/Examples/DotNet/AjTestCSharp3Linq.zip"&gt;AjTestCSharp3Linq.zip&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Acá usamos Linq2Sql&lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/aspnetmug07.png" alt="" /&gt; &lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;donde las entidades, generadas por el wizard de Linq2Sql, ya tienen las relaciones incorporadas. Entonces, una vez obtenido un Deparment, podemos pasar a Employees en una simple propiedad que tiene el objecto departamento:&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;div id="codeSnippet" style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;
    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Page_Load(&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; sender, System.EventArgs e)&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;{&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;    &lt;span style="color:#008000;"&gt;// Put user code to initialize the page here&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (!IsPostBack) {&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;        LinqDepartmentsService service = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; LinqDepartmentsService();&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;        IdEntity = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Guid(Request[&lt;span style="color:#006080;"&gt;&amp;quot;Id&amp;quot;&lt;/span&gt;]);&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;        Entity = service.GetDepartment(IdEntity);&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;        dtgDataEmployees.DataSource = Entity.Employees;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;           DataBind();&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;    }&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Un último ejemplo más, para este post rápido:&lt;/p&gt;

&lt;p&gt;&lt;a title="AjFirstExampleWcfCSharp3.zip" href="http://cid-9f903f3d6db0c176.skydrive.live.com/self.aspx/Examples/DotNet/AjFirstExampleWcfCSharp3.zip"&gt;AjFirstExampleWcfCSharp3.zip&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;En este caso, seguimos usando Linq, lo que viaja a la presentación, son mensajes Windows Communication Foundation, hay un sitio web que expone servicios WCF, y de la parte del cliente, código de gateway para llegar a esos servicios:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/aspnetmug08.png" alt="" /&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;En vez de llegar a la presentación las entidades de .Data, de Linq, pasamos mensajes de Data Contract de WCF:&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;div id="codeSnippet" style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;
    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;namespace&lt;/span&gt; AjFirstExample.Services.Contracts&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;{&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.Runtime.Serialization;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;    [DataContract]&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; Customer&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;    {&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;    &lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;        [DataMember]&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;       &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; Guid Id { get; set; }&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;    &lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;        [DataMember]&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;       &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; Name { get; set; }&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;    &lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;        [DataMember]&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;       &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; Address { get; set; }&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;    &lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;        [DataMember]&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;       &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; Notes { get; set; }&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;    }&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Bueno, espero que puedan sacar algo útil de estos ejemplo, vean también los archivos de ejemplos que fuimos desarrollando en cada clase.&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;br /&gt;&lt;a href="http://twitter.com/ajlopez"&gt;http://twitter.com/ajlopez&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1706460" 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/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/ASP.NET/default.aspx">ASP.NET</category></item><item><title>Enlaces y noticias IV</title><link>http://msmvps.com/blogs/lopez/archive/2009/07/19/enlaces-y-noticias-iv.aspx</link><pubDate>Sun, 19 Jul 2009 13:51:36 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1703061</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=1703061</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2009/07/19/enlaces-y-noticias-iv.aspx#comments</comments><description>&lt;p&gt;Sigo con la costumbre coleccionar enlaces, de distintos temas. Los que me llamaron la atención:&lt;/p&gt;  &lt;h3&gt;PHP&lt;/h3&gt;  &lt;p&gt;Es el lenguaje más usado para el desarrollo de sitios dinámicos en la web. Tiene la simplicidad necesaria, y también el soporte de clases, librerías, acceso a base de datos como para hacerlo más poderoso. Tal vez se ha quedado en el desarrollo web, perdiendo en el terreno de programas de consola, servicios, o de ventanas. Hay montañas de código de ejemplo para estudiar y aprender. Algunos enlaces:&lt;/p&gt;  &lt;p&gt;&lt;a title="PHP programming tips and tricks Code Purity" href="http://blog.code-purity.com/archives/2009/7/14/php_programming_tips_and_tricks/"&gt;PHP programming tips and tricks Code Purity&lt;/a&gt;    &lt;br /&gt;&lt;a title="Scripts Directory of PHP, ASP, ASP.NET, Java, Javascript, Perl and more! - Scripts" href="http://www.scripts.com/"&gt;Scripts Directory of PHP, ASP, ASP.NET, Java, Javascript, Perl and more! – Scripts&lt;/a&gt;    &lt;br /&gt;&lt;a title="43 Must Read PHP Articles and Resources Hi, I&amp;#39;m Grace Smith" href="http://www.gracesmith.co.uk/43-must-read-php-articles-and-resources/"&gt;43 Must Read PHP Articles and Resources Hi, I&amp;#39;m Grace Smith&lt;/a&gt;    &lt;br /&gt;&lt;a title="How To Create Your Own Stats Program (JavaScript, AJAX, PHP) Noupe" href="http://www.noupe.com/php/how-to-create-your-own-stats.html"&gt;How To Create Your Own Stats Program (JavaScript, AJAX, PHP) Noupe&lt;/a&gt;    &lt;br /&gt;&lt;a title="25 Resources to Get You Started with PHP from Scratch - Nettuts+" href="http://net.tutsplus.com/articles/web-roundups/25-resources-to-get-you-started-with-php-from-scratch/"&gt;25 Resources to Get You Started with PHP from Scratch - Nettuts+&lt;/a&gt;    &lt;br /&gt;&lt;a title="15 Wonderfully Creative Uses for PHP" href="http://net.tutsplus.com/tutorials/php/15-wonderfully-creative-uses-for-php/"&gt;15 Wonderfully Creative Uses for PHP&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Hay cantidad de sitios manejadores de contenidos (CMS) pueden ver&lt;/p&gt;  &lt;p&gt;&lt;a title="10 New PHP Content Management Systems(CMS)" href="http://www.dreamcss.com/2009/07/10-new-php-content-management.html"&gt;10 New PHP Content Management Systems(CMS)&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a title="http://php.opensourcecms.com/" href="http://php.opensourcecms.com/"&gt;http://php.opensourcecms.com/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Para un rápido Altas, bajas y modicaciones ver &lt;a href="http://www.ajaxcrud.com/" target="_blank"&gt;AjaxCRUD.com - Use PHP &amp;amp; AJAX to CRUD from a mysql database (create / read / update / delete)&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;No creo que alguien pueda pasar fácilmente de PHP a ASP.NET pero pueden leer &lt;a title="Move from PHP to ASP.NET" href="http://msdn.microsoft.com/en-us/rampup/dd861537.aspx"&gt;Move from PHP to ASP.NET&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Tiene sus años, pero es interesante &lt;a title="Understanding MVC in PHP - O&amp;#39;Reilly Media" href="http://www.oreillynet.com/pub/a/php/2005/09/15/mvc_intro.html"&gt;Understanding MVC in PHP - O&amp;#39;Reilly Media&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Un armador de proyectos, a la Apache Ant, pero en PHP: &lt;a title="Phing" href="http://phing.info/trac/"&gt;Phing&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Comenzando con Joomla &lt;a title="Beginners - Joomla! Documentation" href="http://docs.joomla.org/Beginners"&gt;Beginners - Joomla! Documentation&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Veo implementando el &lt;a href="http://en.wikipedia.org/wiki/Template_Attribute_Language" target="_blank"&gt;Template Attribute Language&lt;/a&gt; en PHP: &lt;a title="http://phptal.org/" href="http://phptal.org/"&gt;http://phptal.org/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;DEBEN VER &lt;a href="http://phpcamp.net/index.php" target="_blank"&gt;PHPCamp: learn something new everyday&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Para perderse en enlaces, &lt;a href="http://delicious.com/ajlopez/php"&gt;http://delicious.com/ajlopez/php&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;.NET&lt;/h3&gt;  &lt;p&gt;Para los que quieren ver manejadores de contenido (CMS) en ASP.NET:&lt;/p&gt;  &lt;p&gt;&lt;a title="http://aspx.opensourcecms.com/" href="http://aspx.opensourcecms.com/"&gt;http://aspx.opensourcecms.com/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;El área de código abierto de .NET está bien activo: &lt;a title="Open Source .NET projects" href="http://spreadsheets.google.com/pub?key=pKxDW35algYebfs8nssTjIQ"&gt;Open Source .NET projects&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Para estudiar: &lt;a title="Expert to Expert- Brian Beckman and Erik Meijer - Inside the .NET Reactive Framework (Rx) Going" href="http://channel9.msdn.com/shows/Going+Deep/Expert-to-Expert-Brian-Beckman-and-Erik-Meijer-Inside-the-NET-Reactive-Framework-Rx/"&gt;Expert to Expert- Brian Beckman and Erik Meijer - Inside the .NET Reactive Framework (Rx) Going&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Un ejemplo de referencia &lt;a title="FabrikamShipping - Home" href="http://code.msdn.microsoft.com/FabrikamShipping"&gt;FabrikamShipping – Home&lt;/a&gt; con Geneva Framework, autenticación federada y tutti li fiocci.&lt;/p&gt;  &lt;p&gt;Un camino a explorar: reemplazar ORM (Object Relational Mapping) en runtime por generación de código: &lt;a title=".NET ORM, Object Relational Mapping for .NET Telerik" href="http://www.telerik.com/products/orm.aspx"&gt;.NET ORM, Object Relational Mapping for .NET Telerik&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Librería para Twitter &lt;a title="http://tweetsharp.com/" href="http://tweetsharp.com/"&gt;http://tweetsharp.com/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;ASP.NET MVC 1.0 ejecutando en Mono &lt;a title="shaml-architecture - Google Code" href="http://code.google.com/p/shaml-architecture/"&gt;shaml-architecture - Google Code&lt;/a&gt; Basado en &lt;a title="s#arp-architecture" href="http://code.google.com/p/sharp-architecture/"&gt;s#arp-architecture&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Para mapear objetos &lt;a title="http://automapper.codeplex.com/" href="http://automapper.codeplex.com/"&gt;http://automapper.codeplex.com/&lt;/a&gt; (menos para el bueno de &lt;a href="http://weblogs.shockbyte.com.ar/rodolfof" target="_blank"&gt;Rodolfo Finochietti&lt;/a&gt; que prefiere hacerse su propio mapeador :-)&lt;/p&gt;  &lt;p&gt;Siempre es molesto el DataBinding a propiedades simples, habría que ver qué tal funciona &lt;a title="http://www.codeproject.com/KB/cs/ObjectBindingSource.aspx" href="http://www.codeproject.com/KB/cs/ObjectBindingSource.aspx"&gt;http://www.codeproject.com/KB/cs/ObjectBindingSource.aspx&lt;/a&gt; (nested property binding)&lt;/p&gt;  &lt;p&gt;Más de todo esto en &lt;a href="http://delicious.com/ajlopez/dotnet"&gt;http://delicious.com/ajlopez/dotnet&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;Generación de código&lt;/h3&gt;  &lt;p&gt;El proyecto Sculpture está muy bien armado, aunque focalizado en .NET &lt;a title="http://sculpture.codeplex.com/" href="http://sculpture.codeplex.com/"&gt;http://sculpture.codeplex.com/&lt;/a&gt; Es open source, se trasladó a la empresa:&lt;/p&gt;  &lt;p&gt;&lt;a title="http://www.dawliasoft.com/" href="http://www.dawliasoft.com/"&gt;http://www.dawliasoft.com/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Tienen una implementación de referencia: &lt;a title="VotingManager.zip" href="http://www.dawliasoft.com/Portals/0/Learn/VotingManager.zip"&gt;VotingManager.zip&lt;/a&gt; que partiendo de 55 líneas, consiguen generar una aplicación de 4111 líneas. Bueno, nada que el &lt;a href="http://ajgenesis.codeplex.com" target="_blank"&gt;AjGenesis&lt;/a&gt; no pueda hacer… :-) … pero es más bonito.&lt;/p&gt;  &lt;p&gt;&lt;a title="Hibernate Class Generation Using hbm2java - O&amp;#39;Reilly Media" href="http://onjava.com/pub/a/onjava/2005/12/14/hibernate-class-generation-with-hbm2java.html?page=last"&gt;Hibernate Class Generation Using hbm2java - O&amp;#39;Reilly Media&lt;/a&gt; Estoy reviendo esto, quiero comenzar a usar el tag &amp;lt;meta&amp;gt; para usar hibernate.cfg.xml y archivos .hbm.xml para alimentar como modelo a &lt;a href="http://ajgenesis.codeplex.com" target="_blank"&gt;AjGenesis&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Para estudiar dos “approachs” &lt;a title="Angle Bracket Percent - CodeDom vs T4- two approaches to Code Generation" href="http://blogs.msdn.com/davidebb/archive/2009/06/03/codedom-vs-t4-two-approaches-to-code-generation.aspx"&gt;Angle Bracket Percent - CodeDom vs T4- two approaches to Code Generation&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Veo el editor de T4 &lt;a title="T4 Editor - tangible T4 Editor plus UML tools" href="http://t4-editor.tangible-engineering.com/T4-Editor-Visual-T4-Editing.html"&gt;T4 Editor - tangible T4 Editor plus UML tools&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Desde AjGenesis puedo leer el archivo .dbml de Linq2Sql, que se puede generar desde la línea de comando con SqlMetal, tengo que estudiar &lt;a title="Oleg Sych - » T4 Toolbox- LINQ to SQL classes generator" href="http://www.olegsych.com/2009/01/t4-toolbox-linq-to-sql-classes-generator/"&gt;Oleg Sych - » T4 Toolbox- LINQ to SQL classes generator&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Yo tenía esta idea, pero la deseché por ser algo “convoluted”, pero es interesante: &lt;a title="Using ASP.Net for Code Generation" href="http://www.delphicsage.com/home/blog.aspx?d=600&amp;amp;title=Using_ASPNet_for_Code_Generation"&gt;Using ASP.Net for Code Generation&lt;/a&gt; . En su tiempo, usé también PHP como lenguaje de generación, pero me gustó tener un lenguaje dedicado a generación con objetos dinámicos (AjBasic) con acceso a un framework de base (.NET por ahora), cosa que no tiene PHP en principio. Y en cuanto a usar ASP.NET, me obligaba a usar un lenguaje tipado .NET, que me resistía a hacerlo.&lt;/p&gt;  &lt;p&gt;Siguiendo con T4, el lenguaje de templates de Visual Studio, a estudiar &lt;a title="Angle Bracket Percent - The MVC T4 template is now up on CodePlex, and it does change your code" href="http://blogs.msdn.com/davidebb/archive/2009/06/26/the-mvc-t4-template-is-now-up-on-codeplex-and-it-does-change-your-code-a-bit.aspx"&gt;Angle Bracket Percent - The MVC T4 template is now up on CodePlex, and it does change your code&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Parece interesante &lt;a title="Sample Fluent NHibernate T4 Templates for Code Generation via LINQ To SQL" href="http://www.pnpguidance.net/Post/SampleFluentNHibernateT4TemplatesCodeGenerationLINQToSQL.aspx"&gt;Sample Fluent NHibernate T4 Templates for Code Generation via LINQ To SQL&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.metacase.com/blogs/stevek/blogView" target="_blank"&gt;Steven Kelly&lt;/a&gt; siempre tiene algo interesante sobre DSM (Domain Specific Models) y generación de código. Comenta sobre &lt;a href="http://www.codegeneration.net/cg2009/" target="_blank"&gt;Code Generation 2009&lt;/a&gt; en &lt;a title="Code Generation 2009 round-up" href="http://www.metacase.com/blogs/stevek/blogView?showComments=true&amp;amp;entry=3423259520"&gt;Code Generation 2009 round-up&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Para los que estén con el framework .NET de Lohtka, CSLA, pueden visitar el&lt;/p&gt;  &lt;p&gt;&lt;a title="CslaGenerator Google Groups" href="http://groups.google.com/group/CslaGenerator"&gt;CslaGenerator Google Groups&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Ruby es un lenguaje que se presta a la generación de código, ver esto, de hace algunos años, pero a cargo del bueno Jack Herrington, autor de Code Generation in Action (alguien que vió la luz!!! :-) :&lt;/p&gt;  &lt;p&gt;   &lt;div class="wlWriterEditableSmartContent" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:e1c89a3c-3fa7-4139-a58a-282866a26e43" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt; &lt;/p&gt;  &lt;p&gt;Como siempre, más información en &lt;a href="http://delicious.com/ajlopez/codegeneration"&gt;http://delicious.com/ajlopez/codegeneration&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;Lenguajes de Programación&lt;/h3&gt;  &lt;p&gt;Descubriendo un clásico: &lt;a title="Let&amp;#39;s Build a Compiler" href="http://compilers.iecc.com/crenshaw/"&gt;Let&amp;#39;s Build a Compiler&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Un texto corto &lt;a href="http://forums.devshed.com/other-programming-languages-139/how-does-an-interpreter-compiler-work-312483.html" target="_blank"&gt;How does a an interpreter compiler work&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Para estudiar &lt;a title="Create a Language Compiler for the .NET Framework Using C#" href="http://msdn.microsoft.com/en-us/magazine/cc136756.aspx"&gt;Create a Language Compiler for the .NET Framework Using C#&lt;/a&gt; usa Reflection.Emit, bien a lo macho… :-)&lt;/p&gt;  &lt;p&gt;Hay que escribir intérpretes y compiladores, “compiler generators are for sissies” :-), pero si quieren, pueden ver &lt;a href="http://www.ssw.uni-linz.ac.at/coco/" target="_blank"&gt;The Compiler Generator Coco/R&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Más para ver &lt;a title="Free Compiler Construction Tools- Lexers, Parser Generators, Optimizers (thefreecountry.com)" href="http://www.thefreecountry.com/programming/compilerconstruction.shtml"&gt;Free Compiler Construction Tools- Lexers, Parser Generators, Optimizers (thefreecountry.com)&lt;/a&gt; y &lt;a title="Basics of Compiler Design (pdf)" href="http://www.diku.dk/hjemmesider/ansatte/torbenm/Basics/basics_lulu.pdf"&gt;Basics of Compiler Design (pdf)&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Para estudiar:&lt;/p&gt;  &lt;p&gt;&lt;a title="Michael Feathers on Programming Languages" href="http://www.infoq.com/interviews/michael-feathers-programming-languages"&gt;Michael Feathers on Programming Languages&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a title="Synrc Io Language CLR" href="http://synrc.com/io-language.htm"&gt;Synrc Io Language CLR&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a title="Io (programming language) - Wikipedia, the free encyclopedia" href="http://en.wikipedia.org/wiki/Io_(programming_language)"&gt;Io (programming language) - Wikipedia, the free encyclopedia&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a title="InfoQ- The Ioke JVM Language- The power of Lisp and Ruby with an intuitive syntax" href="http://www.infoq.com/news/2008/11/ioke"&gt;InfoQ- The Ioke JVM Language- The power of Lisp and Ruby with an intuitive syntax&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a title="Ending the Era of Patronizing Language Design" href="http://blog.objectmentor.com/articles/2009/07/13/ending-the-era-of-patronizing-language-design"&gt;Ending the Era of Patronizing Language Design&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Un volver a vivir:&lt;/p&gt;  &lt;p&gt;&lt;a title="History of the BASIC family of languages" href="http://dotnetmasters.com/HistoryOfBasic.htm"&gt;History of the BASIC family of languages&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Otro para el canal “Volver”, entorno de desarrollo xBase:&lt;/p&gt;  &lt;p&gt;&lt;a title="Xailer - El entorno de desarrollo definitivo en xbase" href="http://www.xailer.com/"&gt;Xailer - El entorno de desarrollo definitivo en xbase&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a title="Free Pascal compilers and Pascal Programming - Freebyte&amp;#39;s Guide to" href="http://www.freebyte.com/programming/pascal/"&gt;Free Pascal compilers and Pascal Programming - Freebyte&amp;#39;s Guide to&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Se acuerdan de MUMPS? &lt;a title="MUMPS - Wikipedia, the free encyclopedia" href="http://en.wikipedia.org/wiki/MUMPS"&gt;MUMPS - Wikipedia, the free encyclopedia&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Para leer &lt;a title="APL, COBOL, &amp;amp; Dijkstra Paul Murphy ZDNet.com" href="http://blogs.zdnet.com/Murphy/?p=568"&gt;APL, COBOL, &amp;amp; Dijkstra Paul Murphy ZDNet.com&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Podría volver a estudiar: &lt;a title="COBOL Programming Course" href="http://www.csis.ul.ie/cobol/Course/Default.htm"&gt;COBOL Programming Course&lt;/a&gt;, &lt;a title="The COBOL Programming Language" href="http://www.engin.umd.umich.edu/CIS/course.des/cis400/cobol/cobol.html"&gt;The COBOL Programming Language&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Lista para buscar recursos &lt;a title="Free Programming Tools, free compilers, free software components and" href="http://www.freebyte.com/programming/"&gt;Free Programming Tools, free compilers, free software components and&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Excelente contenido &lt;a title="Google Code University Programming Languages" href="http://code.google.com/intl/it-IT/edu/languages/index.html"&gt;Google Code University Programming Languages&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Hay que ir viendo:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://clojure.org/" target="_blank"&gt;Clojure&lt;/a&gt; ver &lt;a title="InfoQ- Rich Hickey on Clojure&amp;#39;s Features and Implementation" href="http://www.infoq.com/interviews/hickey-clojure"&gt;InfoQ- Rich Hickey on Clojure&amp;#39;s Features and Implementation&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.scala-lang.org/" target="_blank"&gt;Scala&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Yo sigo trabajando en reimplementar las ideas de Clojure en C#, lo llamaba AjClojure, pero Rick Hickey (el creador de Clojure) me pidió que le cambiara el nombre (al fin tengo evidencia de que alguien lee &lt;a href="http://twitter.com/ajlopez" target="_blank"&gt;mi Twitter&lt;/a&gt;!!! :-) Así, que en un rapto de imaginación, se llama AjSharpure. Pueden ir viendo mis avances en:&lt;/p&gt;  &lt;p&gt;&lt;a title="http://code.google.com/p/ajlisp/source/browse#svn/trunk/AjSharpure" href="http://code.google.com/p/ajlisp/source/browse#svn/trunk/AjSharpure"&gt;http://code.google.com/p/ajlisp/source/browse#svn/trunk/AjSharpure&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Más para ver sobre los lenguajes que me interesan en:   &lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/programminglanguages"&gt;http://delicious.com/ajlopez/programminglanguages&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/smalltalk"&gt;http://delicious.com/ajlopez/smalltalk&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/logo"&gt;http://delicious.com/ajlopez/logo&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/scala"&gt;http://delicious.com/ajlopez/scala&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/lisp"&gt;http://delicious.com/ajlopez/lisp&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/forth"&gt;http://delicious.com/ajlopez/forth&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/haskell"&gt;http://delicious.com/ajlopez/haskell&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/python"&gt;http://delicious.com/ajlopez/python&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/ruby"&gt;http://delicious.com/ajlopez/ruby&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/functionalprogramming"&gt;http://delicious.com/ajlopez/functionalprogramming&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/cobol"&gt;http://delicious.com/ajlopez/cobol&lt;/a&gt;    &lt;br /&gt;&lt;/p&gt;  &lt;h3&gt;MVPs&lt;/h3&gt;  &lt;p&gt;El bueno de &lt;a href="http://weblogs.shockbyte.com.ar/rodolfof" target="_blank"&gt;Rodolfo Finochietti&lt;/a&gt; fue nombrado Microsoft MVP por segundo año consecutivo. Felicitaciones @rodolfof! &lt;a href="http://weblogs.shockbyte.com.ar/rodolfof/archive/2009/07/01/mvp-for-another-year.aspx" target="_blank"&gt;MVP for another year&lt;/a&gt;. También felicitaciones para el pibe Woloski, que renovó el nombramiento.&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;br /&gt;&lt;a href="http://twitter.com/ajlopez"&gt;http://twitter.com/ajlopez&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1703061" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/PHP/default.aspx">PHP</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/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/ASP.NET/default.aspx">ASP.NET</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/AjGenesis/default.aspx">AjGenesis</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Lenguajes+de+Programaci_26002300_243_3B00_n/default.aspx">Lenguajes de Programaci&amp;#243;n</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Enlaces+y+Noticias/default.aspx">Enlaces y Noticias</category></item><item><title>Ejemplo ASP.NET usando Mere Mortals Framework</title><link>http://msmvps.com/blogs/lopez/archive/2009/07/15/asp_2D00_net_2D00_example_2D00_using_2D00_mere_2D00_mortals_2D00_framework.aspx</link><pubDate>Wed, 15 Jul 2009 09:32:45 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1701850</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=1701850</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2009/07/15/asp_2D00_net_2D00_example_2D00_using_2D00_mere_2D00_mortals_2D00_framework.aspx#comments</comments><description>&lt;p&gt;Estuve trabajando, como un spike dentro del proyecto Medusa, para reproducir el ejemplo ASP.NET que viene descripto en el Mere Mortals Framework Developer&amp;#39;s Guide, que usa la base de datos MS SQL Northwind. Lo escribí usando VB.NET como lenguaje (en la guía de Mere Mortals, que pueden bajar del sitio del framework, se describe también en C#).&lt;/p&gt;  &lt;p&gt;El sitio del framework es&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.oakleafsd.com/pgProducts.htm" target="_blank"&gt;Oak Leaf Products&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Pueden bajar la guía de:&lt;/p&gt;  &lt;p&gt;&lt;a title="DOWNLOAD the MM .NET Developer&amp;#39;s Guide" href="http://www.oakleafsd.com/pgMMNetDevGuide.htm"&gt;DOWNLOAD the MM .NET Developer&amp;#39;s Guide&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Lo que escribí pueden bajarlo de mi Skydrive:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://cid-9f903f3d6db0c176.skydrive.live.com/self.aspx/Examples/DotNet/MMNorthwind.zip" target="_blank"&gt;MMNorthwind.zip&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Pueden cargar la solución en VS 2008 (tienen que tener las DLLs del Mere Mortals framework en su máquina).&lt;/p&gt;  &lt;p&gt;La página que busca las órdenes de compra por código de cliente es CustomerOrders.aspx:&lt;/p&gt;  &lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/meremortals01.png" alt="" /&gt; &lt;/p&gt;  &lt;p&gt;The first column is a link, that points to OrderEdit.aspx, where you can edit &lt;/p&gt;  &lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/meremortals03.png" alt="" /&gt; &lt;/p&gt;  &lt;p&gt;Si necesitan cambiar la conexión a la base, pueden modificar el web.config:&lt;/p&gt;  &lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/meremortals02.png" alt="" /&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Diferencias: no estoy usando procedimientos almacenados para todos los Business Objects, como hace el ejemplo original, sólo en los lugares que necesito. Se puso entonces que el tipo de comando asumido a enviar al framework es .Text, en vez de .StoredProcedures. Tampoco puse la misma master page del ejemplo.&lt;/p&gt;  &lt;p&gt;En el proyecto Medusa, el equipo está trabajando para mejorar la validación de campos y reglas de negocios, y mensajes de error, generando una aplicación web completa, usando AjGenesis, partiendo de un modelo que nace de la base de datos. &lt;/p&gt;  &lt;p&gt;Espero poder escribir y publicar templates y tareas de AjGenesis, para generar algo como el ejemplo de arriba: una aplicación web, pero desde un modelo como el que uso en mis otros ejemplos de AjGenesis. Keep tuned! :-)&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;br /&gt;&lt;a href="http://twitter.com/ajlopez"&gt;http://twitter.com/ajlopez&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1701850" 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/VB.NET/default.aspx">VB.NET</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Mere+Mortals+Framework/default.aspx">Mere Mortals Framework</category></item><item><title>CodeRun plataforma de desarrollo en línea</title><link>http://msmvps.com/blogs/lopez/archive/2009/03/24/coderun-plataforma-de-desarrollo-en-l-237-nea.aspx</link><pubDate>Tue, 24 Mar 2009 11:54:50 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1680972</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=1680972</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2009/03/24/coderun-plataforma-de-desarrollo-en-l-237-nea.aspx#comments</comments><description>&lt;p&gt;El bueno de &lt;a href="http://blog.salias.com.ar/" target="_blank"&gt;Martín Salías&lt;/a&gt; (@MartinSalias) me avisa de este sitio y aplicación notable:&lt;/p&gt; &lt;p&gt;&lt;a title="http://www.coderun.com/" href="http://www.coderun.com/"&gt;http://www.coderun.com/&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/coderun03.png" alt="" /&gt; &lt;/p&gt; &lt;p&gt;Pueden registrarse, el servicio básico es gratuito.&lt;/p&gt; &lt;p&gt;Al ingresar, se encuentran con algo parecido al Visual Studio:&lt;/p&gt; &lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/coderun02.png" alt="" /&gt; &lt;/p&gt; &lt;p&gt;Si vamos a crear un nuevo proyecto, vemos los distintos tipos de soluciones soportadas:&lt;/p&gt; &lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/coderun01.png" alt="" /&gt; &lt;/p&gt; &lt;p&gt;Hasta tienen para desarrollar una aplicación para Facebook. Eligiendo el ejemplo de Hello World, clásico desde el Kernighan y Ritchie, obtenemos:&lt;/p&gt; &lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/coderun04.png" alt="" /&gt; &lt;/p&gt; &lt;p&gt;Lo podemos compilar y ejecutar:&lt;/p&gt; &lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/coderun05.png" alt="" /&gt; &lt;/p&gt; &lt;p&gt;Era algo que yo estaba esperando: tener un entorno de desarrollo en línea (no solamente una máquina a la que pueda acceder, sino todo instalado para cumplir con una función). Veremos hasta dónde llega esta tendencia, pero veo que tendremos cada vez más poder de procesamiento, sin tener que actualizar el hardware local o el software nuestro. En vez de menú de programas, iremos a favoritos en el browser.&lt;/p&gt; &lt;p&gt;Ya me veo programando un Code Kata desde un ciber, como en mis tiempos de PHP ... ;-)&lt;/p&gt; &lt;p&gt;Debe haber un Eclipse en línea, ¿conocen algún enlace?&lt;/p&gt; &lt;p&gt;Nos leemos!&lt;/p&gt; &lt;p&gt;Angel &amp;quot;Java&amp;quot; Lopez&lt;br /&gt;&lt;a href="http://www.ajlopez.com/"&gt;http://www.ajlopez.com/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://twitter.com/ajlopez"&gt;http://twitter.com/ajlopez&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1680972" 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/Desarrollo+de+Software/default.aspx">Desarrollo de Software</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/ASP.NET/default.aspx">ASP.NET</category></item><item><title>Ideas para un proyecto geospatial</title><link>http://msmvps.com/blogs/lopez/archive/2008/10/19/ideas-para-un-proyecto-geospatial.aspx</link><pubDate>Sun, 19 Oct 2008 14:51:45 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1651305</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=1651305</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2008/10/19/ideas-para-un-proyecto-geospatial.aspx#comments</comments><description>&lt;p&gt;El viernes pasado, asistí al MVP&amp;nbsp;(Most Valuable Professional)&amp;nbsp;Open Day, en la sucursal de Microsoft en Buenos Aires. Fue un gusto encontrarme con otros colegas y con gente de Microsoft, como &lt;a href="http://blogs.msdn.com/masaez/" target="_blank"&gt;Miguel Saez&lt;/a&gt;, &lt;a href="http://eglinsky.spaces.live.com/" target="_blank"&gt;Ezequiel Glinksy&lt;/a&gt;, y el carnal de todos &lt;a href="http://blogs.msdn.com/mvplead/" target="_blank"&gt;Fernando García Lorea&lt;/a&gt; para pasar todo un día en charlas de distintos temas, desde una discusión &lt;a href="http://en.wikipedia.org/wiki/Fishbowl_(conversation)" target="_blank"&gt;Fish Bowl&lt;/a&gt;, hasta el tema de las comunicaciones en la red y cómo afectan nuestras vidas. Interesantísimo, y además, hubo comida!!! ;-)&lt;/p&gt; &lt;p&gt;En una de las charlas, &lt;a href="http://blogs.technet.com/ponicke/" target="_blank"&gt;Alejandro Ponicke&lt;/a&gt; presentó un excelente trabajo programado por el bueno de Juan Ladetto (arquitecto de cepa tucumana, que ahora está trabajando en Microsoft Buenos Aires):&lt;/p&gt; &lt;p&gt;&lt;a href="http://blogs.technet.com/ponicke/archive/2008/10/14/el-nuevo-mapa-del-capitan-pero-que-mapa-no-es-cualquier-mapa-en-europa-no-se-consigue.aspx" target="_blank"&gt;El nuevo mapa del Capitan, pero que mapa!&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/mapacapitan.png" alt="" /&gt; &lt;/p&gt; &lt;p&gt;(Nota para Alejandro Ponicke: con lo de &amp;quot;En Europa no se consigue&amp;quot; se te cayeron, no dos, sino tres sotas.. ;-)&lt;/p&gt; &lt;p&gt;Se discutieron extensiones a este proyecto (como fue una charla privada, no puedo comentar todo, pero algo puedo filtrar...;-), para armar algo colaborativo a publicar en código abierto.&lt;/p&gt; &lt;p&gt;Estaba presente el bueno de &lt;a href="http://weblogs.asp.net/cazzu/" target="_blank"&gt;Daniel Cazzulino&lt;/a&gt; (&lt;a href="http://twitter.com/kzu" target="_blank"&gt;@kzu&lt;/a&gt; en Twitter) que comentó su trabajo con &lt;a href="http://twitter.com/edjez"&gt;@edjez&lt;/a&gt; (el inefable Eduardo Jeziersky) en &lt;a href="http://instedd.org/" target="_blank"&gt;Instedd.org&lt;/a&gt; y su aplicación &lt;a href="http://code.google.com/p/geochat/" target="_blank"&gt;Geo Chat&lt;/a&gt;: envío de un mensaje SMS sobre un mapa.&lt;/p&gt; &lt;p&gt;Hacia el final, &lt;a href="http://blog.salias.com.ar/" target="_blank"&gt;Martín Salías&lt;/a&gt; propuso que mucho de las extensiones que proponíamos podrían ser abstraidas en el concepto de agregar items sobre el mapa, y conectarlos.&lt;/p&gt; &lt;p&gt;Me gustaría comentar algunos breves puntos sobre esas ideas:&lt;/p&gt; &lt;p&gt;- Se podría implementar el concepto de Item, asociado a un punto geográfico.&lt;/p&gt; &lt;p&gt;- Los items no son todos iguales, podrían definirse distintos tipos de items.&lt;/p&gt; &lt;p&gt;- Se podrían definir distintas aplicaciones, sobre una API unificada, para que quien quiera pueda definir su propio item (con campos mínimos de la API, más campos extensibles por aplicación). Me imagino un aplicación SaaS con configuración por tenant. Los campos extensibles serían similares a los que ya maneja SQL Data Services (o los nuevos proyectos &amp;quot;in the cloud&amp;quot; que presentará Microsoft en el cercano PDC).&lt;/p&gt; &lt;p&gt;- Los items se pueden ver en el mapa, se podrían ampliar, ver de a uno, filtrar por posición, cercanía, por algún campo.&lt;/p&gt; &lt;p&gt;- Matcheo entre items: algunos &amp;quot;matchs&amp;quot; básicos por cercanía, coincidencia de campos, luego, un &amp;quot;match&amp;quot; genérico a implementar por cada aplicación.&lt;/p&gt; &lt;p&gt;- Integración con Twitter (siguiendo el camino de GeoChat).&lt;/p&gt; &lt;p&gt;- La API a desarrollar, sería expuesta por Web Services y/o REST. El consumidor inicial sería una página web como la del ejemplo de Ladetto, pero podría expandirse luego a distintos Smart Clients a desarrollar.&lt;/p&gt; &lt;p&gt;- Reaprovecharía ideas, implementación, de la demo sobre SQL Server que mostró Bill Gates y cía en su última Key Note, antes de dejar su trabajo a tiempo completo en Microsoft.&lt;/p&gt; &lt;p&gt;- No complicaría el desarrollo inicialmente, pero plantearía desde el principio, casos de uso de distintas aplicaciones (algunas en concreto fueron mencionadas en la charla). No quisiera una sola aplicación: me gustaría que se encarara con la idea de multi-aplicación definible &amp;quot;a piaccere&amp;quot;. (como le decía Olmedo a la &amp;quot;negra&amp;quot; Romero: &amp;quot;si la hacemo, la hacemo bien&amp;quot;... ;-)&lt;/p&gt; &lt;p&gt;- Aun cuando las aplicaciones puedan ser definidas, armaría una aplicación &amp;quot;cabeza de playa&amp;quot; para &amp;quot;cruzar el abismo&amp;quot; (¿notan aquí la lectura de &lt;a href="http://en.wikipedia.org/wiki/Geoffrey_Moore" target="_blank"&gt;Geoffrey Moore&lt;/a&gt;?). Es decir, alguna aplicación en concreto, que muestre la usabilidad de la aplicación base.&lt;/p&gt; &lt;p&gt;Algunos tags,&amp;nbsp;enlaces&amp;nbsp;a investigar:&lt;/p&gt; &lt;p&gt;&lt;a title="http://delicious.com/ajlopez/geospatial" href="http://delicious.com/ajlopez/geospatial"&gt;http://delicious.com/ajlopez/geospatial&lt;/a&gt;&lt;br /&gt;&lt;a title="http://delicious.com/ajlopez/geotagging" href="http://delicious.com/ajlopez/geotagging"&gt;http://delicious.com/ajlopez/geotagging&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Comentarios, ideas, crítica, enlaces, ¡bienvenidos!&lt;/p&gt; &lt;p&gt;Nos leemos!&lt;/p&gt; &lt;p&gt;Angel &amp;quot;Java&amp;quot; Lopez&lt;br /&gt;&lt;a href="http://www.ajlopez.com/"&gt;http://www.ajlopez.com/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://twitter.com/ajlopez"&gt;http://twitter.com/ajlopez&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1651305" 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/Desarrollo+de+Software/default.aspx">Desarrollo de Software</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Ajax/default.aspx">Ajax</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/ASP.NET/default.aspx">ASP.NET</category></item><item><title>Generación de código para LINQ y C# 3.0 con AjGenesis</title><link>http://msmvps.com/blogs/lopez/archive/2008/10/01/generaci-243-n-de-c-243-digo-para-linq-y-c-3-0-con-ajgenesis.aspx</link><pubDate>Wed, 01 Oct 2008 10:51:18 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1649363</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=1649363</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2008/10/01/generaci-243-n-de-c-243-digo-para-linq-y-c-3-0-con-ajgenesis.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://www.ajlopez.com/ajgenesi" target="_blank"&gt;AjGenesis&lt;/a&gt;, mi proyecto open source de generación de código, usa un modelo definido por el usuario. Podemos definir tareas y templates, para transformar el modelo a código y archivos de texto. Podemos escribir nuestro propio modelo, agregar tareas y transformaciones. Desde una tarea, se puede invocar a objetos .NET o código AjBasic, en el medio del proceso de generación. Es un proceso flexible: genera lo que Ud. quiera generar, no tiene un patrón predeterminado.&lt;/p&gt; &lt;p&gt;Como el modelo lo define uno, el sistema no está limitado a un tipo de proyecto. Al estar basado en templates y tareas definidas, genera artefactos de código que no están ligados una sola tecnología. Podmos generar archivos para cualquier tecnología, framework, línea de negocios y plataforma. Podemos generar scripts de DDL, o una aplicación completa de base, o cualquier cosa en el medio. Es nuestra decisión hasta donde llegar.&lt;/p&gt; &lt;p&gt;Cuando comencé a escribir y usar el sistema, no existía .NET 2.0. Cuando la nueva tecnología se hizo pública, escribí tareas y templates adicionas para aprovechar las nuevas características como master pages, themes y nuevos controles ASP.NET, sin necesidad de tocar el código núcleo de AjGenesis. Una vez los nuevos templates y tareas estuvieron escritos, pude generar aplicaciones ASP.NET 2.x, a partir de los mismos modelos que ya tenía armados para mis otros cursos y trabajos.&lt;/p&gt; &lt;p&gt;Ahora, como una prueba de concepto, escribí un nuevo ejemplo, que genera código usando LINQ, en nuevo chico en el barrio de .NET 3.x. El resultado fue publicado como AjGenesisExamplesNet3.zip en la página de&amp;nbsp;&amp;nbsp;&lt;a href="http://www.codeplex.com/ajgenesis/Release/ProjectReleases.aspx?ReleaseId=7261" target="_blank"&gt;ejemplos de AjGenesis en CodePlex&lt;/a&gt;. Para ejecutar el ejemplo, necesitamos la&amp;nbsp;&lt;a href="http://www.codeplex.com/ajgenesis/Release/ProjectReleases.aspx?ReleaseId=7262" target="_blank"&gt;actual versión 0.5&lt;/a&gt;&amp;nbsp;(incluye código fuente, ejemplos iniciales, y binarios). (Hay una versión 0.5.1 en desarrollo que pueden ir viendo en &lt;a href="http://www.codeplex.com/ajgenesis/SourceControl/ListDownloadableCommits.aspx" target="_blank"&gt;el repositorio de código del proyecto&lt;/a&gt;).&lt;/p&gt; &lt;h3&gt;El ejemplo&lt;/h3&gt; &lt;p&gt;&lt;img style="margin:0px 20px 20px 0px;" src="http://www.todocontenidos.com/images/articles/ajgenesisnet3dir.png" alt="" /&gt;&lt;/p&gt; &lt;p&gt;Hay sólo un modelo en el ejemplo: AjFirstExample, con un simple modelo XML describiendo a dos entidades planas, Customers y Suppliers. Es el mismo modelo que usé en otros ejemplos anteriores.&lt;/p&gt; &lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:30955e46-f9ad-4f79-a01b-42bcb25fff5c" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:White;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;white-space:pre-wrap;word-wrap:break-word;"&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#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;AjFirstExample&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;First Example using AjGenesis&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;AjFE&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.ajlopez&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;ajlopez&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/Customer.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/Supplier.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;Lists&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;List &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Entity&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Customer&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;List &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Entity&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Supplier&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;Lists&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;Forms&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;Form &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Entity&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Customer&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;Form &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Entity&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Supplier&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;Forms&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;Views&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;View &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Entity&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Customer&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;View &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Entity&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Supplier&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;Views&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;El directorio Templates contiene dos conjuntos de archivos .tpl&amp;nbsp;, que son templates AjGenesis. Los de MsSql son usados en la generación de scripts DDL. En el folder CSharp3, hay nuevos templates que generan un LINQ DataContext, y clases simples, como entidades y servicios.&lt;/p&gt;
&lt;h3&gt;Ejecutando el ejemplo&lt;/h3&gt;
&lt;p&gt;El directorio principal del ejemplo hay un archivo de comando:&lt;/p&gt;
&lt;p&gt;&lt;font face="Consolas"&gt;makeajfirstexample.cmd&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;que al ejecutarse, carga el modelo abstracto y el de tecnología en memoria, y&amp;nbsp;ejecuta dos tareas, creando códidog y scripts de generación de base de datos.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/ajfirstexamplenet3cmd.png" alt="" /&gt; 
&lt;p&gt;Lo generado reside en un nuevo directorio Build, con código fuente y scripts para MS SQL: 
&lt;p align="left"&gt;&lt;img src="http://www.todocontenidos.com/images/articles/ajfirstexamplenet3bld.png" alt="" /&gt; &lt;/p&gt;
&lt;p&gt;El archivo Build\AjFirstExample\CSharp3\Sql\CreateDatabase.sql crea la base y tablas, un fragmento:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:71309bad-5e97-4183-902e-bf846b13c171" 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;"&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;create&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;database&lt;/span&gt;&lt;span style="color:#000000;"&gt; AjFirstExampleNet3
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;go&lt;/span&gt;&lt;span style="color:#000000;"&gt;

...

&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;use&lt;/span&gt;&lt;span style="color:#000000;"&gt; AjFirstExampleNet3
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;go&lt;/span&gt;&lt;span style="color:#000000;"&gt;

...

&lt;/span&gt;&lt;span style="color:#008080;"&gt;--
--&lt;/span&gt;&lt;span style="color:#008080;"&gt;        Entity:        Customer&lt;/span&gt;&lt;span style="color:#008080;"&gt;
--&lt;/span&gt;&lt;span style="color:#008080;"&gt;        Description:    Customer Entity&lt;/span&gt;&lt;span style="color:#008080;"&gt;
--
&lt;/span&gt;&lt;span style="color:#000000;"&gt;

&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;exists&lt;/span&gt;&lt;span style="color:#000000;"&gt; (&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;select&lt;/span&gt;&lt;span style="color:#000000;"&gt; name &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;from&lt;/span&gt;&lt;span style="color:#000000;"&gt; sysobjects 
         &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;where&lt;/span&gt;&lt;span style="color:#000000;"&gt; name &lt;/span&gt;&lt;span style="color:#808080;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Customer&lt;/span&gt;&lt;span style="color:#FF0000;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;and&lt;/span&gt;&lt;span style="color:#000000;"&gt; type &lt;/span&gt;&lt;span style="color:#808080;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt;U&lt;/span&gt;&lt;span style="color:#FF0000;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;drop&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;table&lt;/span&gt;&lt;span style="color:#000000;"&gt; Customer
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;go&lt;/span&gt;&lt;span style="color:#000000;"&gt;

&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;create&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;table&lt;/span&gt;&lt;span style="color:#000000;"&gt; Customer (
        &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;[&lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Id&lt;/span&gt;&lt;span style="color:#FF0000;"&gt;]&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;[&lt;/span&gt;&lt;span style="color:#FF0000;"&gt;uniqueidentifier&lt;/span&gt;&lt;span style="color:#FF0000;"&gt;]&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;not&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;null&lt;/span&gt;&lt;span style="color:#000000;"&gt; 
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;CONSTRAINT&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;[&lt;/span&gt;&lt;span style="color:#FF0000;"&gt;DF_Customer_id&lt;/span&gt;&lt;span style="color:#FF0000;"&gt;]&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;DEFAULT&lt;/span&gt;&lt;span style="color:#000000;"&gt; (&lt;/span&gt;&lt;span style="color:#FF00FF;"&gt;newid&lt;/span&gt;&lt;span style="color:#000000;"&gt;()),    
        &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;[&lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#FF0000;"&gt;]&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;nvarchar&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#800000;font-weight:bold;"&gt;200&lt;/span&gt;&lt;span style="color:#000000;"&gt;),    
        &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;[&lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Address&lt;/span&gt;&lt;span style="color:#FF0000;"&gt;]&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;nvarchar&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#800000;font-weight:bold;"&gt;2048&lt;/span&gt;&lt;span style="color:#000000;"&gt;),    
        &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;[&lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Notes&lt;/span&gt;&lt;span style="color:#FF0000;"&gt;]&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;nvarchar&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#800000;font-weight:bold;"&gt;2048&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
 &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;CONSTRAINT&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;[&lt;/span&gt;&lt;span style="color:#FF0000;"&gt;PK_Customer&lt;/span&gt;&lt;span style="color:#FF0000;"&gt;]&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;PRIMARY&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;KEY&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;CLUSTERED&lt;/span&gt;&lt;span style="color:#000000;"&gt; 
(
    &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;[&lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Id&lt;/span&gt;&lt;span style="color:#FF0000;"&gt;]&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;ASC&lt;/span&gt;&lt;span style="color:#000000;"&gt;
)&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;WITH&lt;/span&gt;&lt;span style="color:#000000;"&gt; (PAD_INDEX  &lt;/span&gt;&lt;span style="color:#808080;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;OFF&lt;/span&gt;&lt;span style="color:#000000;"&gt;, IGNORE_DUP_KEY &lt;/span&gt;&lt;span style="color:#808080;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;OFF&lt;/span&gt;&lt;span style="color:#000000;"&gt;) 
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;ON&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;[&lt;/span&gt;&lt;span style="color:#FF0000;"&gt;PRIMARY&lt;/span&gt;&lt;span style="color:#FF0000;"&gt;]&lt;/span&gt;&lt;span style="color:#000000;"&gt;
)
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;go&lt;/span&gt;&lt;span style="color:#000000;"&gt;

&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p align="left"&gt;La solución puede cargarse directamente en Visual Studio 2008:&lt;/p&gt;
&lt;p align="left"&gt;&lt;img src="http://www.todocontenidos.com/images/articles/ajfirstexamplenet3sln.png" alt="" /&gt; &lt;/p&gt;
&lt;p align="left"&gt;La clase AjFirstExampleDataContext.cs es un simple LINQ DataContext:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:ac463baa-7e19-431b-bbba-a80824bcb120" 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;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;partial&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; AjFirstExampleDataContext : 
        System.Data.Linq.DataContext
    {
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; AjFirstExampleDataContext() 
....
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; Table&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Customer&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; Customers;
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; Table&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Supplier&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; Suppliers;
    }

&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Podríamos reemplazarlo por un DataContext generado por el wizard de Linq To SQL que viene en el Visual Studio. Hay una opción en el modelo de tecnología para especificar qué estrategia usar: o genera un archivo nuestro, o deja al desarrollador poner manualmen luego, al levantar la solución, un DataContext generado por el propio IDE. El resto de las clases funciona igual contra cualquiera de las dos opciones.&lt;/p&gt;
&lt;p&gt;La solución tiene 3 proyectos: datos, servicios y presentación ASP.NET. La página inicial es espartana (ya me conocen, soy desarrollador, no diseñador gráfico... :-)):&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/ajfirstexamplenet3pag.png" alt="" /&gt; &lt;/p&gt;
&lt;p&gt;Desde la opción de Administration, podemos explorar, agregar, editar y borrar clientes y proveedores:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/ajfirstexamplenet3cus.png" alt="" /&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;Próximos pasos&lt;/h3&gt;
&lt;p&gt;Quiero convertir otros ejemplos anteriores a estos nuevos templates (el modelo de AjTest es el más desafiante, con relaciones uno a varios y varias entidades). Sería interesante generar páginas ASP.NET MVC, en lugar de ASP.NET plano. Y algunos proyectos adicionales, de infraestructura de testo. Estoy viendo el código de &lt;a href="http://www.codeplex.com/ScrumLite" target="_blank"&gt;ScrumLite&lt;/a&gt; como un ejemplo base a seguir.&lt;/p&gt;
&lt;p&gt;Nos leemos!&lt;/p&gt;
&lt;p&gt;Angel &amp;quot;Java&amp;quot; Lopez&lt;br /&gt;&lt;a href="http://www.ajlopez.com"&gt;http://www.ajlopez.com&lt;/a&gt;&lt;br /&gt;&lt;a href="http://delicious.com/ajlopez"&gt;http://delicious.com/ajlopez&lt;/a&gt;&lt;br /&gt;&lt;a href="http://twitter.com/ajlopez"&gt;http://twitter.com/ajlopez&lt;/a&gt;&lt;br /&gt;&lt;a title="http://friendfeed.com/ajlopez" href="http://friendfeed.com/ajlopez"&gt;http://friendfeed.com/ajlopez&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1649363" 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/C+Sharp/default.aspx">C Sharp</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/AjGenesis/default.aspx">AjGenesis</category></item><item><title>Modelo textual para generación de código con AjGenesis</title><link>http://msmvps.com/blogs/lopez/archive/2008/09/29/modelo-textual-para-generaci-243-n-de-c-243-digo-con-ajgenesis.aspx</link><pubDate>Mon, 29 Sep 2008 04:33:57 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1649127</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=1649127</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2008/09/29/modelo-textual-para-generaci-243-n-de-c-243-digo-con-ajgenesis.aspx#comments</comments><description>&lt;p&gt;Estuve trabajando agregando una &amp;quot;feature&amp;quot; a &lt;a href="http://www.ajlopez.com/ajgenesis"&gt;mi proyecto de generación de código AjGenesis&lt;/a&gt;. El sistema maneja un modelo definido por el usuario, que puede ser cargado en memoria desde archivos .xml. AjGenesis puede procesar el modelo, completarlo, invocar a objetos .NET, crear directorios, archivos y aplicar templates para crear código y archivos de texto cualesquiera.&lt;/p&gt; &lt;p&gt;Pero el modelo reside en memoria: la deserialización desde XML es solamente una opción de implementación. Este fin de semana, he agregado el nuevo código en el&amp;nbsp;&lt;a href="http://www.codeplex.com/ajgenesis"&gt;repositorio de código del proyecto&amp;nbsp;Codeplex&lt;/a&gt;: ahora, todo usuario de AjGenesis puede expresar su modelo en texto plano.&lt;/p&gt; &lt;p align="center"&gt;&lt;img src="http://www.todocontenidos.com/images/articles/ajgenesiscodeplex.png" alt="" /&gt; &lt;/p&gt; &lt;p&gt;El modelo puede, entonces, expresarse en simples archivos de texto. Veamos un ejemplo.&lt;/p&gt; &lt;p&gt;El ejemplo más simple que se me ocurre es el modelo para &lt;a href="http://msmvps.com/blogs/lopez/archive/2006/11/19/generando-c-digo-hello-world-con-ajgenesis.aspx" target="_blank"&gt;una aplicación Hello World en AjGenesis&lt;/a&gt;. El modelo en XML es:&lt;/p&gt; &lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:f37f5c33-9a32-4458-8ba2-23a563355b90" 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;"&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:#FF0000;"&gt;Company&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;ajlopez.com&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Message&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Hello, World&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Message&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&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;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ahora, podemos expresar el mismo modelo en un archivo de texto:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:e2a1ed03-e576-4515-8fe1-7329ee1b0893" 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;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;Project
    Company &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;ajlopez.com&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    Message &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Hello, World&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
End Project
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Si necesitamos más mensajes, en XML escribíamos:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:49a0b1f6-dde2-4bfe-a9f5-7eba1d739dce" 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;"&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;Messages&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;Message&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Hello, World One&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Message&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&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;Message&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Hello, World Two&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Message&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&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;Message&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Hello, World Three&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Message&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&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;Messages&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;&lt;/p&gt;
&lt;p&gt;Ahora, en texto, podemos escribir:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:6822ba95-44d6-4cf9-9ffe-a3aaac06c90c" 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;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;Project
    Messages
        Message &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Hello, World One&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        Message &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Hello, World Two&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        Message &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Hello, World Three&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    End Messages
End Project
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Se puede cargar el modelo desde el programa de consola, indicando un archivo .txt o .xml:&lt;/p&gt;
&lt;p&gt;&lt;font face="Consolas"&gt;..\..\..\bin\AjGenesis.Console Model.txt ModuleVb.tpl HelloWorld.vb&lt;/font&gt; 
&lt;p&gt;&lt;font face="Consolas"&gt;..\..\..\bin\AjGenesis.Console Model.xml ModuleVb.tpl HelloWorld.vb&lt;/font&gt; 
&lt;p&gt;Lo mismo podemos hacer desde tareas de NAnt: cargar un modelo, en un archivo .XML o .txt.&lt;/p&gt;
&lt;p&gt;Hay más ejemplos en:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.codeplex.com/ajgenesis/SourceControl/DirectoryView.aspx?SourcePath=%24%2fajgenesis%2fexamples%2fHelloWorld&amp;amp;changeSetId=40723" target="_blank"&gt;Hello world Examples&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Un modelo más realista, donde describimos entidades en un XML:&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:49a47975-f343-4c9c-a68f-a2895e097664" 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;"&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:#008000;"&gt;&amp;lt;!--&lt;/span&gt;&lt;span style="color:#008000;"&gt; 
  An Entity with Properties
  &lt;/span&gt;&lt;span style="color:#008000;"&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;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Customer&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;Description&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;A Customer&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;Properties&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;Id&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; Type&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Id&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;Name&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; Type&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Text&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;Address&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; Type&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Text&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;Properties&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:#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;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Supplier&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;Description&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;A Supplier&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;Properties&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;Id&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; Type&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Id&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;Name&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; Type&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Text&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;Address&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; Type&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Text&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;Properties&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:#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;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;ahora puede ser expresado en texto (no es el mismo modelo de arriba, pero similar):&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:65a2cfc5-da18-4dd4-97b2-ad87289a03ac" 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;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;Entities

    Entity Customer
        Description &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Customer Entity&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        Properties
            Property Id Type&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Id&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
            Property Name Type&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Text&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
            Property Address Type&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Text&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        End Properties
    End Entity

    Entity Supplier
        Description &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Supplier Entity&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        Properties
            Property Id Type&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Id&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
            Property Name Type&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Text&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
            Property Address Type&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Text&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        End Properties
    End Entity

End Entities

&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Una vez que el modelo es cargado en memoria, AjGenesis lo procesa como siempre, sin importar su forma original, texto o XML.&lt;/p&gt;
&lt;p&gt;Más sobre AjGenesis:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://ajlopez.wordpress.com/category/ajgenesis/" target="_blank"&gt;Posts about AjGenesis&lt;/a&gt;&amp;nbsp;(English)&lt;br /&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/tags/AjGenesis/default.aspx" target="_blank"&gt;Posts sobre AjGenesis&lt;/a&gt; (Spanish)&lt;/p&gt;
&lt;p&gt;Apenas relacionado, pero interesante:&lt;/p&gt;
&lt;p&gt;&lt;a title="Problems for Textual Model Notations" href="http://metabubble.blogspot.com/2007/06/problems-for-textual-model-notations.html"&gt;Problems for Textual Model Notations&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=1649127" 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/Desarrollo+de+Software/default.aspx">Desarrollo de Software</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/ASP.NET/default.aspx">ASP.NET</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/AjGenesis/default.aspx">AjGenesis</category></item><item><title>Enlaces y noticias</title><link>http://msmvps.com/blogs/lopez/archive/2008/07/24/enlaces-y-noticias.aspx</link><pubDate>Thu, 24 Jul 2008 11:48:44 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1641989</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=1641989</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2008/07/24/enlaces-y-noticias.aspx#comments</comments><description>&lt;p&gt;Hay varios temas de los que quisiera bloguear más en detalle. Pero vaya hoy una lista de enlaces y comentarios cortos:&lt;/p&gt; &lt;p&gt;Primero de todo, tenemos nuevos Microsoft MVPs por aquí en Argentina, felicitaciones a &lt;a title="Rodolfo Finochietti" href="http://weblogs.shockbyte.com.ar/rodolfof/archive/2008/07/01/mvp-award-in-client-application-development.aspx"&gt;Rodolfo Finochietti&lt;/a&gt;, &lt;a title="archi" href="http://www.clariusconsulting.net/blogs/pga/archive/2008/07/01/77156.aspx"&gt;Pablo Galiano&lt;/a&gt;, y al pibe &lt;a href="http://blogs.southworks.net/mwoloski/2008/07/02/microsoft-mvp-award/" target="_blank"&gt;Matías Woloski&lt;/a&gt;. El bueno de Finochietti visita de vez en cuando este blog, y deja comentarios, por ejemplo, sobre programación funcional&amp;nbsp;y el lenguaje Cat. Tenemos varios intereses en común, como el estudio de lenguajes, compiladores, y compartimos la afición por la historia de las matemáticas. &lt;/p&gt; &lt;p&gt;Si se interesan en Smalltalk, es interesante &lt;a href="http://www.outbacksoftware.com/smalltalk/smalltalk.html" target="_blank"&gt;The Smalltalk programming language&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Gracias al bueno de Martin Salias, que me avisó de este texto en la web&amp;nbsp;&lt;a title="The Early History of Smalltalk" href="http://gagne.homedns.org/~tgagne/contrib/EarlyHistoryST.html"&gt;The Early History of Smalltalk&lt;/a&gt;&amp;nbsp;de Alan Kay (yo había anunciado una versión en PDF en &lt;a title="La historia de Smalltalk" href="http://msmvps.com/blogs/lopez/archive/2008/06/26/la-historia-de-smalltalk.aspx"&gt;La historia de Smalltalk&lt;/a&gt;). Es un &amp;quot;DEBESERLEIDO&amp;quot; por todo aquel que esté realmente interesado en la programación. Uno debe conocer la historia de las ideas, para realmente entender la situación actual tanto de ideas, como de tecnologías, y para tener un &amp;quot;grasp&amp;quot; de lo que podría venir.&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.modumobile.com/#/modu_story/" target="_blank"&gt;Modu&lt;/a&gt;: gracias al twitter de &lt;a href="http://twitter.com/parancibia" target="_blank"&gt;@parancibia&lt;/a&gt;, vean este mobile modular. Muy interesante el concepto.&lt;/p&gt; &lt;p&gt;De vez en cuando, &lt;a href="http://www.directionsonmicrosoft.com/" target="_blank"&gt;Microsoft Directions&lt;/a&gt; publica un artículo público. Lean &lt;a href="http://www.directionsonmicrosoft.com/sample/DOMIS/update/2008/07jul/0708spsad.htm" target="_blank"&gt;Software Plus Services and Developers&lt;/a&gt;. ¿The next big thing?&lt;/p&gt; &lt;p&gt;Dentro del proyecto NHContrib, de herramientas para NHibernate, existe NHibernate.LINQ, que permite usar LINQ sobre NHibernate. Vean ahora lo que se hizo con Silverligh en &lt;a href="http://wildermuth.com/2008/07/20/Silverlight_2_NHibernate_LINQ_==_Sweet"&gt;Silverlight 2 + NHibernate.LINQ == Sweet&lt;/a&gt;&amp;nbsp;y el ejemplo de &lt;a title="nhibernat" href="http://www.silverlightdata.com/simple/nhibernate.aspx"&gt;nhibernate con Northwind&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Para aprender NHibernate &lt;a title="NHibernate - Relational Persistence for Idiomatic .NET" href="http://www.hibernate.org/hib_docs/nhibernate/1.2/reference/en/html/"&gt;NHibernate - Relational Persistence for Idiomatic .NET&lt;/a&gt;. Si quieren contribuir al proyecto &lt;a title="hibernate.org - Getting Started with the NHibernate Source Code" href="http://www.hibernate.org/428.html"&gt;hibernate.org - Getting Started with the NHibernate Source Code&lt;/a&gt;. Si tienen dudas, ver &lt;a href="http://groups.google.com/group/NHibernate-Hispano" target="_blank"&gt;la lista de NHibernate Hispano&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Siguiendo con LINQ, leo cómo usar un DataContext en memoria, esta vez desde ASP.NET MVC, en &lt;a href="http://weblogs.asp.net/stephenwalther/archive/2008/07/19/asp-net-mvc-tip-21-fake-the-data-context.aspx" target="_blank"&gt;ASP.NET MVC Tip #21 – Fake the Data Context&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Las aventuras de &lt;a href="http://www.hanselman.com/" target="_blank"&gt;Scott Hanselman&lt;/a&gt; para agregar un OpenSearch en sus páginas: &lt;a title="Adding OpenSearch to your website and getting in the Browser&amp;#39;s Search Box" href="http://www.hanselman.com/blog/AddingOpenSearchToYourWebsiteAndGettingInTheBrowsersSearchBox.aspx"&gt;Adding OpenSearch to your website and getting in the Browser&amp;#39;s Search Box&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://blogs.msdn.com/stevecla01/" target="_blank"&gt;Steve Clayton&lt;/a&gt; está en Software + Services en Microsoft. Lean &lt;a href="http://blogs.msdn.com/stevecla01/archive/2008/07/21/my-us-tour-closes-out-with-ozzie.aspx" target="_blank"&gt;su encuentro con Ray Ozzie&lt;/a&gt;, no puede decir todo, pero S+S se viene cada vez más. El tiempo dirá qué será eso.&lt;/p&gt; &lt;p&gt;No llegué a tiempo para anunciarla. Diego Jancic realizó una encuesta en línea sobre cómo programamos. &lt;a href="http://blog.darioquintana.com.ar/2008/07/18/resultado-de-encuesta-como-programamos/" target="_blank"&gt;Vean los resultados&lt;/a&gt; en &lt;a href="http://blog.darioquintana.com.ar" target="_blank"&gt;el blog de Darío Quintana&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;El Composite Application Guidance para WPF tiene &lt;a href="http://msdn.microsoft.com/en-us/library/cc707819.aspx" target="_blank"&gt;su nueva página en MSDN&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.codinghorror.com/blog/" target="_blank"&gt;Jeff Atwood&lt;/a&gt; tiene algunas ideas interesantes y discutibles sobre &lt;a href="http://www.codinghorror.com/blog/archives/001152.html" target="_blank"&gt;no normalizar base de datos&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.hanselman.com/blog/LearningOpportunityNETTerrariumIsBack.aspx" target="_blank"&gt;.NET Terrarium está de vuelta&lt;/a&gt;!&lt;/p&gt; &lt;p&gt;Me interesó el &lt;a href="http://jackrabbit.apache.org/jackrabbit-architecture.html" target="_blank"&gt;proyecto Jackrabbit&lt;/a&gt;, tengo que estudiar más en detalle la especificación Content Repository API de la &lt;a href="http://jcp.org/aboutJava/communityprocess/final/jsr170/index.html" target="_blank"&gt;JSR-170&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;&lt;a href="http://blog.twitter.com/2008/07/finding-perfect-match.html" target="_blank"&gt;Twitter adquiriendo a Summize&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Y hay que visitar y usar&amp;nbsp;&lt;a href="http://www.emergingtechs.com/posts/15-online-tools-you-will-come-love-tech" target="_blank"&gt;10 herramientas para un tech&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Nuevo &lt;a href="http://blogs.msdn.com/gardel/" target="_blank"&gt;Blog de la comunidad MSDN en español&lt;/a&gt;. Gracias a &lt;a href="http://blogs.msdn.com/masaez/" target="_blank"&gt;Miguel Angel Saez&lt;/a&gt; por el aviso.&lt;/p&gt; &lt;p&gt;Si alguien necesita acá está: &lt;a href="http://www.theserverside.com/tt/articles/article.tss?l=FiniteStateMachinesPhyshunandSpring" target="_blank"&gt;Implementing Finite State Machines with Physhun and Spring&lt;/a&gt; (en Java)&lt;/p&gt; &lt;p&gt;Cada vez más lenguajes dinámicos sobre máquinas virtuales, ver &lt;a href="http://www.alittlemadness.com/2008/07/15/java-6-using-python-via-the-new-scripting-engine/" target="_blank"&gt;Java 6: Using Python via the new Scripting Engine&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Interesante código y artículo, sobre un tema que se necesita conocer: &lt;a href="http://www.codeproject.com/KB/aspnet/SingleSignon.aspx" target="_blank"&gt;Single Sign-on in ASP.NET and Other Platforms&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Para entender la historia de MVC: &lt;a href="http://heim.ifi.uio.no/trygver/2003/javazone-jaoo/MVC_pattern.pdf" target="_blank"&gt;The Model-View-Controller, Its past and present&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Más sobre Model-View-Controller, Model-View-Presenter, y Presentation-Abstraction-Control en &lt;a href="http://ctrl-shift-b.blogspot.com/2007/08/interactive-application-architecture.html" target="_blank"&gt;Interactive Application Architecture Patterns&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;MVC en ASP.NET en &lt;a title="ASP.NET MVC - The Official Microsoft ASP.NET Site" href="http://www.asp.net/mvc/"&gt;ASP.NET MVC - The Official Microsoft ASP.NET Site&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Una interesante comparación de David Hayden&amp;nbsp;&lt;a href="http://www.pnpguidance.net/Post/ASPNETMVCFrameworkComparedWebClientSoftwareFactoryWCSF.aspx" target="_blank"&gt;ASP.NET MVC Framework Compared To Web Client Software Factory ( WCSF )&lt;/a&gt;&lt;/p&gt; &lt;p&gt;¿Necesitan un manejar un proyecto de software? No lo uso, vería el open source Trac Project, via web en Java (gracias a J. Franco, por este enlace). Al parecer, trabaja con &lt;a href="http://subversion.tigris.org/" target="_blank"&gt;Subversion&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;¿Necesitan open source en Java? De todo en &lt;a title="http://java-source.net/" href="http://java-source.net/"&gt;http://java-source.net/&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Off topic total: mi mejor post hasta ahora del 2008, con gráfica incluida, en &lt;a title="Posmopolitan" href="http://ajlopez.zoomblog.com/archivo/2008/07/08/posmopolitan.html"&gt;Posmopolitan&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;br /&gt;&lt;a href="http://twitter.com/ajlopez"&gt;http://twitter.com/ajlopez&lt;/a&gt;&lt;br /&gt;&lt;a title="http://friendfeed.com/ajlopez" href="http://friendfeed.com/ajlopez"&gt;http://friendfeed.com/ajlopez&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1641989" 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/Smalltalk/default.aspx">Smalltalk</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Desarrollo+de+Software/default.aspx">Desarrollo de Software</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/NHibernate/default.aspx">NHibernate</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Enlaces+y+Noticias/default.aspx">Enlaces y Noticias</category></item><item><title>Presentando Visual Studio 2008</title><link>http://msmvps.com/blogs/lopez/archive/2008/06/04/presentando-visual-studio-2008.aspx</link><pubDate>Wed, 04 Jun 2008 17:55:30 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1631278</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=1631278</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2008/06/04/presentando-visual-studio-2008.aspx#comments</comments><description>&lt;p&gt;Ayer tuve el gusto de presentar algunas características de la nueva versión, Visual Studio 2008, en Rosario, provincia de Santa Fé, gracias a la organización del Microsoft User Group de Argentina. Mi charla fue al final de una serie de charlas que ocuparon toda la tarde, desde las 14hs hasta entrada la noche, cerca de las 22hs.&lt;/p&gt; &lt;p&gt;Pueden ver el detalle en&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.mug.org.ar/Eventos/3017.aspx" target="_blank"&gt;Rosario - Jornada de Actualización Profesional Microsoft 2008&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Quisiera exponer en este post, los enlaces y recursos que utilicé. En principio, la presentación fue &amp;quot;inspirada&amp;quot; (un eufemismo por &amp;quot;robada&amp;quot;... ;-) del&lt;/p&gt; &lt;p&gt;&lt;a title="Download details- Visual Studio 2008 Training Kit" href="http://www.microsoft.com/downloads/details.aspx?familyid=8BDAA836-0BBA-4393-94DB-6C3C4A0C98A1&amp;amp;displaylang=en"&gt;Download details- Visual Studio 2008 Training Kit&lt;/a&gt;&lt;/p&gt; &lt;p&gt;que contiene información, &amp;quot;hand-ons labs&amp;quot; (algunos&amp;nbsp;los escribimos en equipo de &lt;a href="http://www.southworks.net" target="_blank"&gt;Southworks&lt;/a&gt; el año pasado), y presentaciones con notas adicionales.&lt;/p&gt; &lt;p&gt;Para una introducción general a lo nuevo de VS 2008 y .NET 3.5, pueden ver&lt;/p&gt; &lt;p&gt;&lt;a title="Pro VB 2008 and the .NET 3.5 Platform" href="http://www.apress.com/book/view/1590598229"&gt;Pro VB 2008 and the .NET 3.5 Platform&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;img style="margin:0px 20px 20px 0px;" src="http://www.apress.com/resource/bookcover/9781590598221?size=medium" align="left" alt="" /&gt; Be the first to put .NET 3.5 and VB 2008 to work, with expert tuition and guidance from esteemed author, &lt;strong&gt;Andrew Troelsen&lt;/strong&gt;. In &lt;em&gt;Pro VB 2008 and the .NET 3.5 Platform&lt;/em&gt;, you’ll find complete coverage of .NET 3.5, including WPF, WCF, and WF, guided by a deep understanding of the .NET platform and appreciation of the subtleties of VB that could only come from this award-winning author’s invaluable experience.&lt;/p&gt; &lt;p&gt;&lt;a title="Source Code" href="http://www.apress.com/book/downloadfile/3958"&gt;Source Code&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Para el tema de Windows Presentation Foundation, me basé en concepto de:&lt;/p&gt; &lt;p&gt;&lt;a title="Pro WPF with VB 2008- Windows Presentation Foundation with .NET 3.5" href="http://www.apress.com/book/view/1590599624"&gt;Pro WPF with VB 2008- Windows Presentation Foundation with .NET 3.5&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;img style="margin:0px 20px 20px 0px;" src="http://www.apress.com/resource/bookcover/9781590599624?size=medium" align="left" alt="" /&gt; Find out how WPF really works with .NET expert and author &lt;strong&gt;Matthew MacDonald&lt;/strong&gt;. No–nonsense, practical advice will get you building high–quality WPF applications quickly and easily, while a thorough investigation of the more advanced aspects of WPF, and its relation to other elements of the WinFX stack and the .NET Framework 3.5, will complete your understanding of WPF and VB 2008.&lt;/p&gt; &lt;p&gt;&lt;a title="Source Code" href="http://apress.com/book/downloadfile/3977"&gt;Source Code&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Aunque usé como ejemplos los de C# del mismo autor:&lt;/p&gt; &lt;p&gt;&lt;a href="http://apress.com/book/view/1590599551" target="_blank"&gt;Pro WPF in C# 2008: Windows Presentation Foundation with .NET 3.5, Second Edition&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;img style="margin:0px 20px 20px 0px;" src="http://apress.com/resource/bookcover/9781590599556?size=medium" align="left" alt="" /&gt; &lt;/p&gt; &lt;ul&gt; &lt;li&gt;WPF basics: XAML, layout, control essentials, and data flow  &lt;li&gt;WPF applications: Navigation, commands, localization, and deployment  &lt;li&gt;Advanced controls: Custom controls, menus, toolbars, and trees  &lt;li&gt;WPF documents: Text layout, printing, and document packaging  &lt;li&gt;Graphics and multimedia: Drawing shapes, sound and video, animation, geometric transformations, and imaging.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;a title="Source Code" href="http://apress.com/book/downloadfile/3941"&gt;Source Code&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;No llegué a usarlo, pero me pareció interesante:&lt;/p&gt; &lt;p&gt;&lt;a href="http://apress.com/book/view/1590598652" target="_blank"&gt;Pro ASP.NET 3.5 Server Controls and AJAX Components&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;img style="margin:0px 20px 20px 0px;" src="http://apress.com/resource/bookcover/9781590598658?size=medium" align="left" alt="" /&gt; &lt;/p&gt; &lt;ul&gt; &lt;li&gt;Covers the new features in ASP.NET 3.5 and ASP.NET AJAX technology  &lt;li&gt;Describes the ASP.NET server control architecture in Visual Studio 2008/ASP.NET 3.5 covering state management, events, rendering, cross-platform support, control life cycle, localization, and deployment.  &lt;li&gt;Demonstrates how to integrate client–side development technologies such as DHTML and JavaScript with server control technology to create powerful interactive controls&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;a title="Table of Contents" href="http://apress.com/book/downloadfile/3937"&gt;Table of Contents&lt;/a&gt;&lt;br /&gt;&lt;a title="Source Code" href="http://apress.com/book/downloadfile/3954"&gt;Source Code&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Sobre el tema de Linq, utilicé el libro de Scott Klein&lt;/p&gt; &lt;p&gt;&lt;img style="margin:0px 20px 20px 0px;" src="http://media.wiley.com/product_data/coverImage/11/04700418/0470041811.jpg" align="left" alt="" /&gt; &lt;a href="http://www.wrox.com/WileyCDA/WroxTitle/productCd-0470041811.html" target="_blank"&gt;Professional Linq&lt;/a&gt;&lt;br /&gt;&lt;a title="Download Code" href="http://www.wrox.com/WileyCDA/WroxTitle/productCd-0470041811,descCd-DOWNLOAD.html"&gt;Download Code&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Professional LINQ introduces experienced programmers and database developers to LINQ database queries in their native VB and C# languages. Some of the topics covered include:  &lt;ul&gt; &lt;li&gt;LINQ Queries  &lt;li&gt;LINQ and the Standard Query Operators  &lt;li&gt;Programming with XLinq  &lt;li&gt;Querying XML with XLinq  &lt;li&gt;Mixing XML and other data models  &lt;li&gt;DLinq and Queries  &lt;li&gt;LINQ over datasets  &lt;li&gt;Interoperating with ADO.NET  &lt;li&gt;LINQ and ASP.NET&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Hacia el final de la charla, presenté algún ejemplo que usa Linq/VS 2008, generado desde dos modelos de proyectos (AjFirstExample y AjTest) con &lt;a href="http://apress.com/book/downloadfile/3941" target="_blank"&gt;AjGenesis&lt;/a&gt;. Tengo que pulir los templates y publicarlos en breve.&lt;/p&gt; &lt;p&gt;Enlaces sobre estos temas, los mantengo en:&lt;/p&gt; &lt;p&gt;&lt;a href="http://del.icio.us/ajlopez/vs2008"&gt;http://del.icio.us/ajlopez/vs2008&lt;/a&gt;&lt;br /&gt;&lt;a href="http://del.icio.us/ajlopez/linq"&gt;http://del.icio.us/ajlopez/linq&lt;/a&gt;&lt;br /&gt;&lt;a href="http://del.icio.us/ajlopez/wpf"&gt;http://del.icio.us/ajlopez/wpf&lt;/a&gt;&lt;br /&gt;&lt;a href="http://del.icio.us/ajlopez/wwf"&gt;http://del.icio.us/ajlopez/wwf&lt;/a&gt;&lt;br /&gt;&lt;a href="http://del.icio.us/ajlopez/wcf"&gt;http://del.icio.us/ajlopez/wcf&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Agradezco desde acá a la gente del MUG, a Oscar Turquets en especial, por haberme facilitado todo para que pudiera participar del evento, y la gente de Rosario, que me trató muy bien, terminando en una cena en el mítico &lt;a href="http://www.barelcairo.com/" target="_blank"&gt;El Cairo&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=1631278" 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/Windows+Presentation+Foundation/default.aspx">Windows Presentation Foundation</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/ASP.NET/default.aspx">ASP.NET</category></item><item><title>Chat en vivo sobre ASP.NET, AJAX, desarrollo web</title><link>http://msmvps.com/blogs/lopez/archive/2008/03/11/chat-en-vivo-sobre-asp-net-ajax-desarrollo-web.aspx</link><pubDate>Tue, 11 Mar 2008 11:25:34 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1539932</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=1539932</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2008/03/11/chat-en-vivo-sobre-asp-net-ajax-desarrollo-web.aspx#comments</comments><description>&lt;p&gt;El jueves que viene, 13 de Marzo, a las 16hs (Buenos Aires), estaré participando de un evento en línea, con preguntas y respuestas, ejemplos y conceptos, sobre &lt;a href="http://msmvps.com/blogs/lopez/archive/tags/ASP.NET/default.aspx" target="_blank"&gt;ASP.NET&lt;/a&gt;. El evento se realizará vía LiveMeeting, y está pensado para los que quieren programar en ASP.NET haciendo aplicaciones web, pero están comenzando con esa tecnología, o vienen de otras, como PHP. En el anuncio, hay preguntas tipo:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;¿Dónde debo poner el string de conexión a mi Base de Datos? ¿Cómo puedo ordenar y paginar una grilla? ¿Cómo puedo hacer aplicaciones AJAX con ASP.NET? ¿Para qué sirve el PostBack? ¿Necesito IIS para correr mi aplicación?&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Más información e inscripción en&lt;/p&gt; &lt;p&gt;&lt;a title="http://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?EventID=1032372622&amp;amp;EventCategory=4&amp;amp;culture=es-AR&amp;amp;CountryCode=AR" href="http://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?EventID=1032372622&amp;amp;EventCategory=4&amp;amp;culture=es-AR&amp;amp;CountryCode=AR"&gt;http://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?EventID=1032372622&amp;amp;EventCategory=4&amp;amp;culture=es-AR&amp;amp;CountryCode=AR&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Es parte de la iniciativa &lt;a href="http://msmvps.com/blogs/lopez/archive/2007/12/12/misi-243-n-geminis-48hs.aspx" target="_blank"&gt;Misión Géminis 48hs&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Me parece que la interfaz web, para un aplicación simple o compleja, hoy es casi indispensable. Por más que se comente sobre cliente rico, y otras tecnologías que han ido apareciendo, la ubicuidad y flexibilidad de un browser combinado con la programación en el servidor, es una dupla interesantísima de explorar, usar, y explotar. Vean lo que ha hecho Internet por nosotros en los últimos años, esa influencia y alcance irá aumentando con la aparición de más aplicaciones en línea (&lt;a href="http://www.salesforce.com/" target="_blank"&gt;SalesForce&lt;/a&gt; y &lt;a href="http://www.sugarcrm.com/" target="_blank"&gt;SugarCRM&lt;/a&gt; como ejemplos). &lt;a href="http://msmvps.com/blogs/lopez/archive/tags/Software+as+a+Service/default.aspx" target="_blank"&gt;Software as a Service&lt;/a&gt; está gestándose (muchos conceptos todavía están por asentarse), pero es una tendencia natural tener aplicaciones accesibles por la web.&lt;/p&gt; &lt;p&gt;Espero poder ayudar en este evento, a descubrir y entender el poder de la tecnología ASP.NET para conseguir desarrollar ese tipo de aplicaciones.&lt;/p&gt; &lt;p&gt;Gracias a &lt;a href="http://blogs.msdn.com/masaez/default.aspx" target="_blank"&gt;Miguel Angel Saez&lt;/a&gt; por invitarme a participar de este evento, ex southie, ahora en Microsoft de Argentina. &lt;strong&gt;Powerful you have become, the dark side I sense in you....&lt;/strong&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=1539932" 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/Ajax/default.aspx">Ajax</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/ASP.NET/default.aspx">ASP.NET</category></item><item><title>Guidance Share: de todo sobre seguridad, rendimiento y más</title><link>http://msmvps.com/blogs/lopez/archive/2008/02/03/guidance-share-de-todo-sobre-seguridad-rendimiento-y-m-225-s.aspx</link><pubDate>Sun, 03 Feb 2008 14:13:07 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1494023</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=1494023</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2008/02/03/guidance-share-de-todo-sobre-seguridad-rendimiento-y-m-225-s.aspx#comments</comments><description>&lt;p&gt;El bueno de J.D. Meier, Program Manager en Pattern &amp;amp; Practices de Microsoft, ha armado un sitio estupendo, un wiki, para compartir su conocimiento y el de otros, sobre Ingenería de Software, orientada a tecnologías Microsoft, aunque creo que pueden ser de utilidad para otros ambientes y tecnologías.&lt;/p&gt; &lt;p&gt;Pueden visitar&lt;/p&gt; &lt;p align="center"&gt;&lt;a href="http://www.guidanceshare.com/wiki/Main_Page" target="_blank"&gt;Software Guidance Share&lt;/a&gt;&lt;/p&gt; &lt;p align="center"&gt;&lt;img src="http://www.ajlopez.com/images/articles/guidanceshare.png" alt="" /&gt; &lt;/p&gt; &lt;p&gt;Ahí encontrarán:&lt;/p&gt; &lt;p&gt;&lt;a&gt;&lt;/a&gt; &lt;h5&gt;&lt;a href="http://www.guidanceshare.com/wiki/Technology_Index"&gt;Tech Centers&lt;/a&gt;&lt;/h5&gt; &lt;ul&gt; &lt;li&gt;&lt;a href="http://www.guidanceshare.com/wiki/Category:.NET_Framework_2.0"&gt;.NET Framework 2.0&lt;/a&gt; &amp;nbsp;– &lt;a href="http://www.guidanceshare.com/wiki/Category:ADO.NET_2.0"&gt;ADO.NET 2.0&lt;/a&gt; &amp;nbsp;–&lt;a href="http://www.guidanceshare.com/wiki/Category:ASP.NET_2.0"&gt; ASP.NET 2.0&lt;/a&gt; &lt;li&gt;&lt;a href="http://www.guidanceshare.com/wiki/Category:.NET_Framework_1.1"&gt;.NET Framework 1.1&lt;/a&gt; &amp;nbsp;– &lt;a href="http://www.guidanceshare.com/wiki/Category:ADO.NET_1.1"&gt;ADO.NET 1.1&lt;/a&gt; &amp;nbsp;–&lt;a href="http://www.guidanceshare.com/wiki/Category:ASP.NET_1.1"&gt; ASP.NET 1.1&lt;/a&gt; &amp;nbsp;– &lt;a href="http://www.guidanceshare.com/wiki/Category:Code_Access_Security_%28.NET_1.1%29"&gt;Code Access Security (.NET 1.1)&lt;/a&gt; &amp;nbsp;– &lt;a href="http://www.guidanceshare.com/wiki/Category:Enterprise_Services_%28.NET_1.1%29"&gt;Enterprise Services (.NET 1.1)&lt;/a&gt; &amp;nbsp;–&lt;a href="http://www.guidanceshare.com/wiki/Category:Interop_%28.NET_1.1%29"&gt; Interop (.NET 1.1)&lt;/a&gt; &amp;nbsp;– &lt;a href="http://www.guidanceshare.com/wiki/Category:Remoting_%28.NET_1.1%29"&gt;Remoting (.NET 1.1)&lt;/a&gt; &amp;nbsp;– &lt;a href="http://www.guidanceshare.com/wiki/Category:Web_Services_%28ASMX_1.1%29"&gt;Web Services (ASMX 1.1)&lt;/a&gt; &amp;nbsp;– &lt;a href="http://www.guidanceshare.com/wiki/Category:XML_%28.NET_1.1%29"&gt;XML (.NET 1.1)&lt;/a&gt; &lt;li&gt;&lt;a href="http://www.guidanceshare.com/wiki/Category:SQL_Server_2000"&gt;SQL Server 2000&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;a&gt;&lt;/a&gt; &lt;h5&gt;&lt;a href="http://www.guidanceshare.com/wiki/Performance"&gt;Performance&lt;/a&gt;&lt;/h5&gt; &lt;ul&gt; &lt;li&gt;&lt;a href="http://www.guidanceshare.com/wiki/Performance_Engineering"&gt;Performance Engineering&lt;/a&gt; &amp;nbsp;– &lt;a href="http://www.guidanceshare.com/wiki/Performance_Inspections"&gt;Performance Inspections&lt;/a&gt; &amp;nbsp;– &lt;a href="http://www.guidanceshare.com/wiki/Performance_Modeling"&gt;Performance Modeling&lt;/a&gt; &lt;li&gt;&lt;a href="http://www.guidanceshare.com/wiki/Performance_At_a_Glance"&gt;At a Glance&lt;/a&gt; &amp;nbsp;– &lt;a href="http://www.guidanceshare.com/wiki/Performance_Cheat_Sheets"&gt;Cheat Sheets&lt;/a&gt; &amp;nbsp;– &lt;a href="http://www.guidanceshare.com/wiki/Performance_Checklists"&gt;Checklists&lt;/a&gt; &amp;nbsp;– &lt;a href="http://www.guidanceshare.com/wiki/Performance_Explained"&gt;Explained&lt;/a&gt; &amp;nbsp;– &lt;a href="http://www.guidanceshare.com/wiki/Performance_Guidelines"&gt;Guidelines&lt;/a&gt; &amp;nbsp;– &lt;a href="http://www.guidanceshare.com/wiki/Performance_How_Tos"&gt;How Tos&lt;/a&gt; &amp;nbsp;– &lt;a href="http://www.guidanceshare.com/wiki/Performance_Inspection_Questions"&gt;Inspection Questions&lt;/a&gt; &amp;nbsp;– &lt;a href="http://www.guidanceshare.com/wiki/Performance_Methodologies"&gt;Methodologies&lt;/a&gt; &amp;nbsp;– &lt;a href="http://www.guidanceshare.com/wiki/Performance_Practices"&gt;Practices&lt;/a&gt; &amp;nbsp;– &lt;a href="http://www.guidanceshare.com/wiki/Performance_Principles"&gt;Principles&lt;/a&gt; &amp;nbsp;– &lt;a href="http://www.guidanceshare.com/wiki/Performance_Techniques"&gt;Techniques&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;a&gt;&lt;/a&gt; &lt;h5&gt;&lt;a href="http://www.guidanceshare.com/wiki/Security"&gt;Security&lt;/a&gt;&lt;/h5&gt; &lt;ul&gt; &lt;li&gt;&lt;a href="http://www.guidanceshare.com/wiki/Security_Engineering"&gt;Security Engineering&lt;/a&gt; &amp;nbsp;– &lt;a href="http://www.guidanceshare.com/wiki/Security_Inspections"&gt;Security Inspections&lt;/a&gt; &amp;nbsp;– &lt;a href="http://www.guidanceshare.com/wiki/Threat_Modeling"&gt;Threat Modeling&lt;/a&gt; &lt;li&gt;&lt;a href="http://www.guidanceshare.com/wiki/Threats_and_Countermeasures"&gt;Threats and Countermeasures&lt;/a&gt; &amp;nbsp;– &lt;a href="http://www.guidanceshare.com/wiki/Threats"&gt;Threats&lt;/a&gt; &amp;nbsp;– &lt;a href="http://www.guidanceshare.com/wiki/Attacks"&gt;Attacks&lt;/a&gt; &amp;nbsp;– &lt;a href="http://www.guidanceshare.com/wiki/Vulnerabilities"&gt;Vulnerabilities&lt;/a&gt; &amp;nbsp;– &lt;a href="http://www.guidanceshare.com/wiki/Countermeasures"&gt;Countermeasures&lt;/a&gt; &lt;li&gt;&lt;a href="http://www.guidanceshare.com/wiki/Attack_Patterns"&gt;Attack Patterns&lt;/a&gt;&amp;nbsp;– &lt;a href="http://www.guidanceshare.com/wiki/Vulnerability_Patterns"&gt;Vulnerability Patterns&lt;/a&gt;&amp;nbsp;– &lt;a href="http://www.guidanceshare.com/wiki/Security_Design_Patterns"&gt;Security Design Patterns&lt;/a&gt; &amp;nbsp;– &lt;a href="http://www.guidanceshare.com/wiki/Security_Implementation_Patterns"&gt;Security Implementation Patterns&lt;/a&gt; &lt;li&gt;&lt;a href="http://www.guidanceshare.com/wiki/Security_Application_Scenarios"&gt;Application Scenarios&lt;/a&gt; &amp;nbsp;– &lt;a href="http://www.guidanceshare.com/wiki/Security_At_a_Glances"&gt;At a Glance&lt;/a&gt; &amp;nbsp;–&lt;a href="http://www.guidanceshare.com/wiki/Security_Cheat_Sheets"&gt; Cheat Sheets&lt;/a&gt; &amp;nbsp;– &lt;a href="http://www.guidanceshare.com/wiki/Security_Checklists"&gt;Checklists&lt;/a&gt; &amp;nbsp;– &lt;a href="http://www.guidanceshare.com/wiki/Security_Explained"&gt;Explained&lt;/a&gt; &amp;nbsp;– &lt;a href="http://www.guidanceshare.com/wiki/Security_Guidelines"&gt;Guidelines&lt;/a&gt; &amp;nbsp;– &lt;a href="http://www.guidanceshare.com/wiki/Security_How_Tos"&gt;How Tos&lt;/a&gt; &amp;nbsp;– &lt;a href="http://www.guidanceshare.com/wiki/Security_Inspection_Questions"&gt;Inspection Questions&lt;/a&gt; &amp;nbsp;– &lt;a href="http://www.guidanceshare.com/wiki/Security_Methodologies"&gt;Methodologies&lt;/a&gt; &amp;nbsp;– &lt;a href="http://www.guidanceshare.com/wiki/Security_Practices"&gt;Practices&lt;/a&gt; &amp;nbsp;– &lt;a href="http://www.guidanceshare.com/wiki/Security_Principles"&gt;Principles&lt;/a&gt; &amp;nbsp;– &lt;a href="http://www.guidanceshare.com/wiki/Security_Questions_and_Answers"&gt;Questions and Answers&lt;/a&gt; &amp;nbsp;–&lt;a href="http://www.guidanceshare.com/wiki/Security_Techniques"&gt; Techniques&lt;/a&gt; &amp;nbsp;– &lt;a href="http://www.guidanceshare.com/wiki/Security_Templates"&gt;Templates&lt;/a&gt; &amp;nbsp;–&lt;a href="http://www.guidanceshare.com/wiki/Security_Walkthroughs"&gt; Walkthroughs&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Excelente, Meier, cumpliendo con el &amp;quot;mindset&amp;quot; Don&amp;#39;t be a canuto.&lt;/p&gt; &lt;p&gt;Gracias al &lt;a href="http://staff.southworks.net/blogs/matiaswoloski" target="_blank"&gt;&amp;quot;Pibe Woloski&amp;quot;&lt;/a&gt;, gran comedor de cangrejos, por aportar este enlace.&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=1494023" 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/Cursos/default.aspx">Cursos</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Ingenier_26002300_237_3B00_a+de+Software/default.aspx">Ingenier&amp;#237;a de Software</category></item><item><title>Controlando la cantidad de usuarios en una aplicación web</title><link>http://msmvps.com/blogs/lopez/archive/2008/01/30/controlando-la-cantidad-de-usuarios-en-una-aplicaci-243-n-web.aspx</link><pubDate>Wed, 30 Jan 2008 08:48:08 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1486623</guid><dc:creator>lopez</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/lopez/rsscomments.aspx?PostID=1486623</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2008/01/30/controlando-la-cantidad-de-usuarios-en-una-aplicaci-243-n-web.aspx#comments</comments><description>&lt;p&gt;Supongamos que que necesitemos controlar la cantidad de usuarios que puedan estar usando nuestra aplicación web, ya sea en Java/JSP/JSF, ASP.NET, PHP y variantes.&amp;nbsp;Por ejemplo, por una cuestión de licencias, no queremos que haya más de N usuarios logueados.&lt;/p&gt; &lt;p&gt;Propongo acá una posible solución, algo así implementé alguna vez, pero no ha sido probada exhaustivamente.&lt;/p&gt; &lt;p&gt;Antes, alguna discusión de otras soluciones:&lt;/p&gt; &lt;p&gt;- Se puede tener control de la cantidad de usuarios logueados, si incrementamos un contador en el proceso de login, decrementamos el contador en el proceso de logout, o controlamos el fin de la sesión.&lt;/p&gt; &lt;p&gt;Hay algunos problemas a resolver:&lt;/p&gt; &lt;p&gt;- Puede que no tengamos un evento de fin de sesión, como pasa en PHP&lt;/p&gt; &lt;p&gt;- Puede que no tengamos un evento de fin de sesión, porque estamos en una granja de servidores, y nuestra tecnología (p.ej., ASP.NET) no registra&amp;nbsp;el evento de fin de sesión de una forma adecuada en ese escenario&lt;/p&gt; &lt;p&gt;Alguien podría sugerir que pongamos algo en el browser cliente, un código javascript (o el más &amp;quot;cool&amp;quot;, una llamada Ajax), para que cada página envíe un &amp;quot;ping&amp;quot; al servidor, diciendo &amp;quot;Estoy aquí, el usuario está vivo....&amp;quot;. Pero eso implica colocar ese código en cada página, confiar en que el cliente tenga javascript habilitado, y quizás exija que algunos planetas esten dispuestos en línea.&lt;/p&gt; &lt;p&gt;Entonces, ¿qué hacemos? ¿nos entregamos a la desesperación? ¿dejamos la programación y nos dedicamos a manejar gente? o peor aún&amp;nbsp;¿nos ponemos a dibujar UML?&amp;nbsp;¡¡No!! ;-)&lt;/p&gt; &lt;p&gt;Podemos implementar lo siguiente:&lt;/p&gt; &lt;p&gt;El control debe hacerse en el login de usuario. Ahí lo dejamos pasar al usuario o no, dependiendo de un cálculo de usuarios activos que hacemos.&amp;nbsp;¿Cómo?&lt;/p&gt; &lt;p&gt;Para conocer los usuarios activos, en memoria (si es una aplicación corriendo en un solo servidor) o en una base de datos central (en caso de estar en una granja web), grabamos, por cada actividad de usuario (pedir una página, por ejemplo), un registro donde&amp;nbsp;grabamos:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;- Usuario&lt;br /&gt;- Workstation&amp;nbsp;(como podamos, número de IP, etc...)&lt;br /&gt;- Fecha/Hora del&amp;nbsp;último evento&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Noten que no es un registro por evento: es un registro por Usuario+Workstation, se actualiza siempre ahi&amp;nbsp;la fecha/hora de&amp;nbsp;último evento. No hace falta mantener la historia de los eventos.&amp;nbsp;Si el usuario pepe desde workstation1 esta pidiendo algo al sistema, actualizamos el registro que le corresponde, o lo creamos si no existe. Registros viejos, de más de una hora,&amp;nbsp;o un día, se pueden borrar, periódicamente (ejecutando un store, por ejemplo, 1 de cada M actualizaciones de evento).&lt;/p&gt; &lt;p&gt;En el caso de ASP.NET, este registro se puede hacer en un HttpModule, sin necesidad de tocar otras partes de la aplicación. Sino, un lugar potable es colocar ese código en algún control, include o parecido, que se ejecute en el render de cada página (es muy común hoy en día, tener un componente así).&lt;/p&gt; &lt;p&gt;En caso de desloguearse un usuario, se borra el registro correspondiente.&lt;/p&gt; &lt;p&gt;Supongamos que T es el tiempo de duración de una sesión, y N la cantidad máxima de licencias. Entonces, cuando un usuario se loguea, se controla que:&lt;/p&gt; &lt;p&gt;- Si existe un registro para su Usuario/Workstation con fecha/hora &amp;gt;= hora actual - T, se lo deja pasar. Seguramente, no registramos su logout (por ejemplo, se cortó la luz) y ahora quiere entrar de nuevo.&lt;/p&gt; &lt;p&gt;sino&lt;/p&gt; &lt;p&gt;- Si existen más de N registros con fecha/hora &amp;gt;= hora actual - T, no se lo deja pasar&lt;/p&gt; &lt;p&gt;Debe haber otras soluciones, pero me parece ésta interesante, relativamente sencilla, y adoptable por distintas tecnologías. Algo similar se puede adoptar para aplicaciones en el cliente (no browser, sino una aplicación de formularios, ventanas, cliente rico).&lt;/p&gt; &lt;p&gt;Problemas: Hay que evaluar el impacto de tener que acceder a la base, si se decide almacenar esos registros en forma centralizada.&lt;/p&gt; &lt;p&gt;¿Comentarios?&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=1486623" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/Java/default.aspx">Java</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/PHP/default.aspx">PHP</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/ASP.NET/default.aspx">ASP.NET</category></item><item><title>Introducción a ASP.NET MVC</title><link>http://msmvps.com/blogs/lopez/archive/2008/01/12/introducci-243-n-a-asp-net-mvc.aspx</link><pubDate>Sat, 12 Jan 2008 10:06:23 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1457909</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=1457909</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2008/01/12/introducci-243-n-a-asp-net-mvc.aspx#comments</comments><description>&lt;p&gt;El viernes próximo, 18 de Enero, en Microsoft de Argentina, aquí en Buenos Aires, &lt;a href="http://blogs.msdn.com/masaez/default.aspx" target="_blank"&gt;Miguel Angel Saez&lt;/a&gt; y Edgardo Rosetto darán una charla sobre el nuevo framework MVC (Model View Controller) incluído en las extensiones de ASP.NET 3.5.&lt;/p&gt; &lt;p&gt;Veremos cómo ahora hay URLs que se definen mediantes Routes, que pueden ser definidas programáticamente. Es interesante que cada parte del framework (el ruteador por ejemplo), puede ser accedido por código. Creo que hay varias posibilidades interesantes, especialemente para Sofware as a Service, y sitios dinámicos de contenidos, para tomar provecho de &amp;quot;generar en el aire&amp;quot; nuevas URLs, que se traten por el ruteador de MVC.&lt;/p&gt; &lt;p&gt;Edgardo nos promete mostrar una aplicación paso a paso, usando cada característica del framework.&lt;/p&gt; &lt;p&gt;La información de inscripción en:&lt;/p&gt; &lt;p&gt;&lt;a href="http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032364952&amp;amp;Culture=es-AR" target="_blank"&gt;TechNight: Introducción a ASP.NET MVC&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Espero que se cumple la tradición de los TechNights: al final, cerveza y papas fritas! :-)&lt;/p&gt; &lt;p&gt;Más información sobre ASP.NET MVC en:&lt;/p&gt; &lt;p&gt;&lt;a title="http://weblogs.asp.net/scottgu/archive/2007/10/14/asp-net-mvc-framework.aspx" href="http://weblogs.asp.net/scottgu/archive/2007/10/14/asp-net-mvc-framework.aspx"&gt;http://weblogs.asp.net/scottgu/archive/2007/10/14/asp-net-mvc-framework.aspx&lt;/a&gt;&lt;/p&gt; &lt;p&gt;y por supuesto, para ir viendo todo lo que viene en ASP.NET 3.5, visitar los blogs de los buenos de Scott Guthrie, Scott Hanselman, y David Hayden entre otros:&lt;/p&gt; &lt;p&gt;&lt;a title="http://weblogs.asp.net/scottgu/" href="http://weblogs.asp.net/scottgu/"&gt;http://weblogs.asp.net/scottgu/&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a title="http://www.hanselman.com/blog/" href="http://www.hanselman.com/blog/"&gt;http://www.hanselman.com/blog/&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a title="http://codebetter.com/blogs/david.hayden/" href="http://codebetter.com/blogs/david.hayden/"&gt;http://codebetter.com/blogs/david.hayden/&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Yo ya había posteado algo sobre el tema en:&lt;/p&gt; &lt;p&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2007/10/26/mvc-en-asp-net.aspx" target="_blank"&gt;MVC en ASP.NET&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2007/10/11/model-view-controller-en-asp-net-a-la-microsoft.aspx" target="_blank"&gt;Model View Controller en ASP.NET, a la Microsoft&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=1457909" 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/ASP.NET/default.aspx">ASP.NET</category></item><item><title>Misión Geminis 48hs</title><link>http://msmvps.com/blogs/lopez/archive/2007/12/12/misi-243-n-geminis-48hs.aspx</link><pubDate>Wed, 12 Dec 2007 10:09:16 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1393527</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=1393527</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2007/12/12/misi-243-n-geminis-48hs.aspx#comments</comments><description>&lt;p&gt;El bueno de &lt;a href="http://blogs.msdn.com/masaez" target="_blank"&gt;Miguel Angel Saez&lt;/a&gt; (ahora en Microsoft de Argentina) nos avisa en su post&lt;/p&gt; &lt;p&gt;&lt;a href="http://blogs.msdn.com/masaez/archive/2007/12/10/1-concurso-48-horas.aspx" target="_blank"&gt;1 concurso - 48 hs&lt;/a&gt;&lt;/p&gt; &lt;p&gt;del concurso:&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.mslatam.com/latam/msdn/es/geminis48/"&gt;Misión Geminis 48 hs&lt;/a&gt;&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;Para participar de la Misión Géminis 48 hs., sólo tienes que ser un desarrollador que te gusten los desafíos. La idea es que compitas con tus pares para demostrar en 2 etapas qué tanto sabes acerca de .Net y PHP. Durante la primera etapa deberás responder una serie de preguntas de selección múltiple sobre estos lenguajes de programación. Los participantes que contesten correctamente todo el cuestionario, con la posibilidad de múltiples intentos, podrán pasar a la segunda etapa – La Misión. Allí deberás estar preparado para el reto de desarrollar una aplicación web funcional, un sistema de Control Epidemiológico basado en PHP, y migrarla a ASP.NET. Tendrás sólo 48 horas para hacerlo, y los primeros 48 que lo hagan estarán participando por increíbles premios. Los 3 ganadores designados por especialistas calificados recibirán U$D 1.000, U$D 800 y U$D 400, respectivamente. Muchos éxitos para tu misión… &lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Hay &lt;a href="http://www.mslatam.com/latam/msdn/es/geminis48/prize.aspx"&gt;interesantes premios&lt;/a&gt;. Si conoces PHP, puede ser una interesante forma de aprender ASP.NET. Más información sobre esta tecnología en:&lt;/p&gt; &lt;p&gt;&lt;a title="http://www.aprenderasp.net/" href="http://www.aprenderasp.net/"&gt;http://www.aprenderasp.net/&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.asp.net/"&gt;http://www.asp.net/&lt;/a&gt;&lt;/p&gt; &lt;p&gt;No es que el concurso comienza ahora. Hay tiempo para aprender (revisar en el sitio, creo que quedan 2 meses para comenzar el concurso).&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=1393527" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/PHP/default.aspx">PHP</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/ASP.NET/default.aspx">ASP.NET</category></item><item><title>MVC en ASP.NET</title><link>http://msmvps.com/blogs/lopez/archive/2007/10/26/mvc-en-asp-net.aspx</link><pubDate>Fri, 26 Oct 2007 10:40:11 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1265156</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=1265156</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2007/10/26/mvc-en-asp-net.aspx#comments</comments><description>&lt;p&gt;Hace unos días, Scott Guthrie dió más detalles sobre la implementación que se viene de MVC para ASP.NET de la mano de Microsoft:&lt;/p&gt; &lt;p&gt;&lt;a href="http://weblogs.asp.net/scottgu/archive/2007/10/14/asp-net-mvc-framework.aspx"&gt;ASP.NET MVC Framework&lt;/a&gt;&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;One of the things that many people have asked for over the years with ASP.NET is built-in support for developing web applications using a model-view-controller (MVC) based architecture. &lt;p&gt;Last weekend at the Alt.NET conference in Austin I gave&amp;nbsp;the first public demonstration of a new ASP.NET MVC framework that my team has been working on.&amp;nbsp; You can watch a video of my presentation about it on Scott Hanselman&amp;#39;s blog&amp;nbsp;&lt;a href="http://www.hanselman.com/blog/ScottGuMVCPresentationAndScottHaScreencastFromALTNETConference.aspx"&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Algunos comentarios de Scott: &lt;h3&gt;Qué es un framework MVC?&lt;/h3&gt; &lt;p&gt;MVC divide la implementación de una aplicación en tres roles: modelos, vistas y controladores. &lt;ul&gt; &lt;li&gt;&amp;quot;Modelos&amp;quot; en una aplicación MVC son los componentes de la aplicación responsables de mantener el estado. Frecuentemente este estado es persistido en una base de datos (por ejemplo: podemos tener una clase Producto que es usada para reprensentar datos de una tabla Productos en un SQL).&lt;/li&gt; &lt;li&gt;&amp;quot;Vistas&amp;quot; son los componentes responsables de presentar la interfaz de usuario. Típicamente esta UI es creada desde los datos del modelo (por ejemplo: podemos crear una vista &amp;quot;Editar&amp;quot; de producto que coloque cajas de textos, listas desplegables y checkbos, basados en el estado actual del objeto Producto).&lt;/li&gt; &lt;li&gt;&amp;quot;Controladores&amp;quot; son los componentes encargados de manejar la interacción con el usuario final, manipulando el modelo, y finalmente elegir la vista para mostrar la UI. En una aplicación MVC la vista es sólo para exhibir información: es el controlador el que maneja y responde a la entrada del usuario y su interacción.&lt;/li&gt;&lt;/ul&gt; &lt;h3&gt;Detalles de implementación&lt;/h3&gt; &lt;p&gt;Sigue Scott:&lt;/p&gt; &lt;p&gt;Uno de los beneficios de usar una metodología MVC es que ayuda a reforzar una clara separación de las responsabilidades entre el modelo, vistas y controladores de una aplicación. Mantener esa clara separación hace que la prueba de la aplicación sea más fácil, ya que el contracto entre los diferentes componentes está más claramente definido y articulado.&lt;/p&gt; &lt;p&gt;Algunos detalles que describe de la implementación de Microsoft:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Permite la separación de responsabilidades, testeo y uso de TDD. Todos los contratos principales del framework MVC son interfaces que pueden ser simulados (ahora hay interfaces para IHttpRequest-IHttpResponse). Se puede usar el framework de testeo que uno quiera (incluyendo NUnit, NBUnit, MS Test, etc).&lt;/li&gt; &lt;li&gt;Es altamente extensible y admite plugins. Todo en el framework MVC de Microsoft está diseñado para que pueda ser fácilmente reemplazado o adaptado (por ejemplo, uno puede opcionalmente agregar su propia maquinaria de vista, política de ruteo, serialización de parámetros, etc.). También soporta el uso de inyección de dependencias y modelos de contenedores IOC (Windsor, Sprint.NET, NHibernate, etc..).&lt;/li&gt; &lt;li&gt;Incluye un muy poderoso mapeador de URL que nos permite armar aplicaciones con URLs limpias. Las URL no necesitan tener extensiones, y están diseñadas para soportar fácilmente patrones de nombres para SEO (Search Engine Optimization) y REST. Por ejemplo, uno puede fácilmente mapear /products/edit/4 a la acción del botón &amp;quot;Editar&amp;quot; en un controlador de productos, o mapear /Blogs/scottgu/10-10-2007/SomeTopic/ a la acción &amp;quot;DisplayPost&amp;quot; de una clase BlogEngineController.&lt;/li&gt; &lt;li&gt;El framework MVC soporta el uso de los archivos ASP.NET ya existentes, como .aspx, .ascx, .master, como &amp;quot;plantillas de vista&amp;quot; (siginfica que uno puede usar las capacidades de ASP.NET como master pages anidades, código &amp;lt;% %&amp;gt;, controles del servidor, plantillas, enlace a datos, localización). No usa, sin embargo, el modelo postback de interacción con el servidor. En cambio, uno rutea toda la interacción del usuario a una clase Controller, lo que ayuda a separar una clara separación de responsabilidades y testeo (eso implica que no hay viewstate o ciclo de vida de página en las vistas MVC).&lt;/li&gt; &lt;li&gt;El framework ASP.NET MVC soporta totalmente las características de ASP.NET como autenticación Forms o Windows, autorización por URL, membresía y roles, caché de datos y salida, manejo de perfiles y session, monitoreo de salud, sistema de configuración, la arquitectura de providers, etc.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Bueno, es una parva de novedades. Veremos cuándo queda disponible para que podamos evaluarla y usarla.&lt;/p&gt; &lt;p&gt;Vean los comentarios en el post de Scott: tienen mayores detalles muy interesantes.&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=1265156" 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/ASP.NET/default.aspx">ASP.NET</category></item><item><title>Model View Controller en ASP.NET, a la Microsoft</title><link>http://msmvps.com/blogs/lopez/archive/2007/10/11/model-view-controller-en-asp-net-a-la-microsoft.aspx</link><pubDate>Thu, 11 Oct 2007 10:50:55 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1243320</guid><dc:creator>lopez</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/lopez/rsscomments.aspx?PostID=1243320</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2007/10/11/model-view-controller-en-asp-net-a-la-microsoft.aspx#comments</comments><description>&lt;p&gt;En la &lt;a href="http://www.altnetconf.com/" target="_blank"&gt;Altnetconf&lt;/a&gt;, &lt;a href="http://weblogs.asp.net/scottgu/" target="_blank"&gt;Scott Guthrie&lt;/a&gt; ha revelado la implementación de Microsoft de un &lt;a href="http://msdn2.microsoft.com/en-us/library/ms978748.aspx" target="_blank"&gt;MVC&lt;/a&gt; para ASP.NET.&lt;/p&gt; &lt;p&gt;Leemos en&lt;/p&gt; &lt;p&gt;&lt;a href="http://codebetter.com/blogs/jeffrey.palermo/archive/2007/10/05/altnetconf-scott-guthrie-announces-asp-net-mvc-framework-at-alt-net-conf.aspx" target="_blank"&gt;altnetconf - Scott Guthrie announces ASP.NET MVC framework at Alt.Net Conf&lt;/a&gt;&lt;/p&gt; &lt;p&gt;que el nuevo framework será soportado dentro del propio framework de .NET, y tendremos:&lt;/p&gt; &lt;li&gt;Natively support TDD model for controllers.  &lt;li&gt;Provide ASPX (without viewstate or postbacks) as a view engine  &lt;li&gt;Provide a hook for other view engines from MonoRail, etc.  &lt;li&gt;Support IoC containers for controller creation and DI on the controllers  &lt;li&gt;Provide complete control over URLs and navigation  &lt;li&gt;Be pluggable throughout  &lt;li&gt;Separation of concerns  &lt;li&gt;Integrate nicely within ASP.NET  &lt;li&gt;Support static as well as dynamic languages&lt;/li&gt; &lt;p&gt;Tanto los web forms como el nuevo modelo son soportados dentro de la misma aplicación.&lt;/p&gt; &lt;p&gt;Ahora, una URL puede tener la forma&lt;/p&gt; &lt;p&gt;/&amp;lt;Ruta&amp;gt;/&amp;lt;Acción&amp;gt;/&amp;lt;Parámetro1&amp;gt;/&amp;lt;Parámetro2&amp;gt;&lt;/p&gt; &lt;p&gt;donde la ruta se mapea a un controlador. Múltiplas rutas pueden ser mapeadas al mismo controlador.&lt;/p&gt; &lt;p&gt;Pienso que esto puede ser aplicado a aplicaciones SaaS. La Ruta puede representar a un Tenant+Sistema. Espero que el mapeo pueda ser dinámico, es decir, que pueda ser especificado en ejecución. Al parecer, como en otras tecnologías de .NET, podremos tener la capacidad de configurar distintas partes, como el ruteador de la entrada, factoría de controladores y demás.&lt;/p&gt; &lt;p&gt;Veamos algunas características citadas en ese artículo:&lt;/p&gt; &lt;h3&gt;Controladores&lt;/h3&gt; &lt;p&gt;Pueden heredar de cualquier clase, implementan una interfaz IController, o pueden heredar de una clase base de controladores. Las acciones y parámetros, de la URL, nos llegan en un DTO llamado RouteData. Y hasta aparece un IHttpContext, una interfaz a lo que era el HttpContext clásico.&lt;/p&gt; &lt;h3&gt;Vistas&lt;/h3&gt; &lt;p&gt;Lo novedoso es que la tecnología de vistas puede ser tanto ASP.NET, como otras &amp;quot;engines&amp;quot; como NVelocity. En el caso de ASP.NET, las páginas heredan de ViewPage, en lugar de Page (supongo que será parecido a lo que hace Spring MVC). Se le pasa un modelo, en un DTO, que en vez de ser un &amp;quot;bag&amp;quot;, es tipado.&lt;/p&gt; &lt;p&gt;Más información en&lt;/p&gt; &lt;p&gt;&lt;a title="ScottGu MVC Presentation and ScottHa Screencast from ALT.NET Conference" href="http://www.hanselman.com/blog/ScottGuMVCPresentationAndScottHaScreencastFromALTNETConference.aspx"&gt;ScottGu MVC Presentation and ScottHa Screencast from ALT.NET Conference&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a title="Chris Holmes- ALT.NET Conference- Brave New World" href="http://www.chrisholmesonline.com/2007/10/06/altnet-conference-brave-new-world/"&gt;Chris Holmes- ALT.NET Conference- Brave New World&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a title="Nima Dilmaghani - Microsoft announces new MVC architecture for Web Apps" href="http://nimad.wordpress.com/2007/10/07/microsoft-announces-its-new-mvc-architecture-for-web-apps/"&gt;Nima Dilmaghani - Microsoft announces new MVC architecture for Web Apps&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a title="Gary Sherman - Microsoft is changing the world - at least part of my world - for the better" href="http://blogs.dovetailsoftware.com/blogs/gsherman/archive/2007/10/08/microsoft-is-changing-the-world-at-least-part-of-my-world-for-the-better.aspx"&gt;Gary Sherman - Microsoft is changing the world - at least part of my world - for the better&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a title="MVC Framework" href="http://blogs.dovetailsoftware.com/blogs/gsherman/archive/2007/10/08/asp-net-mvc-framework.aspx"&gt;MVC Framework&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a title="Rod Paddock - AltNetConf Day2 - Agile and MVC Goodness" href="http://codebetter.com/blogs/rodpaddock/archive/2007/10/07/altnetconf-day2-agile-and-mvc-goodness.aspx"&gt;Rod Paddock - AltNetConf Day2 - Agile and MVC Goodness&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Dos videos sobre la presentación de ScottGu&lt;/p&gt; &lt;p&gt;&lt;a title="ScottGu on MVC at ALT.NET Conference" href="http://www.hanselman.com/silverlight/ScottGuAtAltNetConf"&gt;ScottGu on MVC at ALT.NET Conference&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a title="ScottHa on MVC+DLR=Love at ALT.NET Conference" href="http://www.hanselman.com/silverlight/ScottHaAtAltNetConf"&gt;ScottHa on MVC+DLR=Love at ALT.NET Conference&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=1243320" 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/ASP.NET/default.aspx">ASP.NET</category></item></channel></rss>