<?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 : VB.NET</title><link>http://msmvps.com/blogs/lopez/archive/tags/VB.NET/default.aspx</link><description>Tags: VB.NET</description><dc:language>en</dc:language><generator>CommunityServer 2008.5 SP2 (Build: 40407.4157)</generator><item><title>Twitter para todo: TweetMyPC (y TweetMyMac también)</title><link>http://msmvps.com/blogs/lopez/archive/2009/09/01/twitter-para-todo-tweetmypc-y-tweetmymac-tambi-233-n.aspx</link><pubDate>Tue, 01 Sep 2009 09:55:34 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1719840</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=1719840</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2009/09/01/twitter-para-todo-tweetmypc-y-tweetmymac-tambi-233-n.aspx#comments</comments><description>&lt;p&gt;Una idea que quería explorar es crear un pequeño estándar de &lt;strong&gt;cómo usar mensajes cortos para enviar comandos y recibir respuestas de una aplicación cualquiera&lt;/strong&gt;. Un paso hacia eso, muy ingenioso, es la de TweetMyPc (&lt;a title="http://tweetmypc.codeplex.com/" href="http://tweetmypc.codeplex.com/"&gt;http://tweetmypc.codeplex.com/&lt;/a&gt;). El autor principal es &lt;a href="http://stackoverflow.com/users/12178/shoban" target="_blank"&gt;Shoban&lt;/a&gt;, Microsoft MVP de la India.&lt;/p&gt;  &lt;p&gt;La aplicación es chica, y cuando la ejecutamos en nuestra máquina, ingresamos los datos de nuestra cuenta de Twitter:&lt;/p&gt;  &lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/TweetMyPCImage.jpg" alt="" /&gt; &lt;/p&gt;  &lt;p&gt;Una vez que arranca la aplicación, comienza a leer nuestros tweets cada 1 minuto. Es conveniente usar una cuenta para cada PC. Desde esa cuenta, desde cualquier otro lugar, podemos enviar comandos como: Shutdown, Hibernate, Lock, y hasta Download, que comienza a bajar un archivo. Una lista parcial de comandos la pueden ver en:&lt;/p&gt;  &lt;p&gt;&lt;a title="http://www.codegeeks.net/tweetmypc-what-next" href="http://www.codegeeks.net/tweetmypc-what-next"&gt;http://www.codegeeks.net/tweetmypc-what-next&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Si uno saca un Screenshot remoto, la aplicación responde enviando un comando con una URL de la imagen tomada. Este es el tipo de respuesta que tenía en mente en el primer párrafo de este post: &lt;strong&gt;una forma de enviar algo más grande que un mensaje, es mediante una URL&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;La aplicación está escrita en .NET. No vi el código todavía, pero está originalmente &lt;a href="http://tweetmypc.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=28234#DownloadId=70382" target="_blank"&gt;escrita en VB.Net&lt;/a&gt; y hay &lt;a href="http://tweetmypc.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=28235#DownloadId=70383" target="_blank"&gt;versión en C#&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Tienen también aplicación para &lt;/p&gt;  &lt;p&gt;Otra aplicación del mismo autor:&lt;/p&gt;  &lt;p&gt;&lt;a title="http://www.codeplex.com/jata" href="http://www.codeplex.com/jata"&gt;http://www.codeplex.com/jata&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Jata is a Google Talk like Twitter Application which was developed using VB.net and Twiteroo Twitter API framework.     &lt;br /&gt;jata automatically checks for new messages periodically. You can post your status right from jata post message screen.      &lt;br /&gt;You can also reply to tweets using jata.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p dir="ltr" style="margin-right:0px;"&gt;Habría que seguir explorando la idea de manejar aplicaciones con mensajes cortos, desde Twitter u otros.&lt;/p&gt;  &lt;p dir="ltr" style="margin-right:0px;"&gt;Nos leemos!&lt;/p&gt;  &lt;p dir="ltr" style="margin-right:0px;"&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=1719840" 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/Twitter/default.aspx">Twitter</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>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>Test-driven development en acción, usando Visual Studio</title><link>http://msmvps.com/blogs/lopez/archive/2009/03/18/test-driven-development-en-acci-243-n-usando-visual-studio.aspx</link><pubDate>Wed, 18 Mar 2009 09:09:42 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1678959</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=1678959</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2009/03/18/test-driven-development-en-acci-243-n-usando-visual-studio.aspx#comments</comments><description>&lt;p&gt;Estoy preparando una charla para el jueves de la semana que viene, 26 de Marzo, en el &lt;a href="http://www.mug.org.ar/"&gt;Microsoft User Group&lt;/a&gt; de Argentina. Pueden inscribirse en:&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.mug.org.ar/Eventos/3234.aspx" target="_blank"&gt;MEDIA JORNADA &amp;quot;Test-driven development en acción, usando Visual Studio&amp;quot;&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/mugtdd.png" alt="" /&gt; &lt;/p&gt; &lt;p&gt;El horario es de 18:30 a 21:30. La idea es ir armando ejemplos usando los principios de TDD, con código que muestre:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Documentar el código con tests, en vez de en papel  &lt;li&gt;Usar listas de test para generar requerimientos explícitos  &lt;li&gt;Refactorear y mejorar el diseño del código  &lt;li&gt;Test bajo una UI delgada  &lt;li&gt;Test para cambios incrementales, minimizando la depuración  &lt;li&gt;Entregar software que sea verificable y robusto&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Lo que veremos estará basado en .NET y Visual Studio, pero se puede aplicar a otros entornos, lenguajes y tecnologías. Las ideas de base son las mismas.&lt;/p&gt; &lt;p&gt;Como siempre, preparar una charla sirve para aclarar los puntos que uno va aplicando en el día a día. Explicar algo, nos permite entenderlo mejor.&lt;/p&gt; &lt;p&gt;Es gratis PARA LOS SOCIOS DEL MUG. Los demás, ¿qué esperan para asociarse? ;-)&lt;/p&gt; &lt;p&gt;Como en otras ocasiones, publicaré en mi sitio el material que utilice en el curso, y probablemente, aparecerán posts por este blog, explicando algunos puntos.&lt;/p&gt; &lt;p&gt;¿Sugerencias a incluir en el temario? ¿Otros temas interesantes para armar una charla-serie de posts?&lt;/p&gt; &lt;p&gt;(Gracias a la gente del MUG, en especial a Gustavo Bachrach, que me han pedido un post para publicar en la revista que entregan a los socios).&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=1678959" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Cursos/default.aspx">Cursos</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/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/VB.NET/default.aspx">VB.NET</category></item><item><title>Libro Foundation of Programming, listo para bajar</title><link>http://msmvps.com/blogs/lopez/archive/2008/06/25/libro-foundation-of-programming-listo-para-bajar.aspx</link><pubDate>Wed, 25 Jun 2008 15:48:54 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1637596</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=1637596</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2008/06/25/libro-foundation-of-programming-listo-para-bajar.aspx#comments</comments><description>&lt;p&gt;Gracias a Cladio M.E. Bastos Iorio de &lt;a href="http://www.blumer.com.ar"&gt;http://www.blumer.com.ar&lt;/a&gt; me entero de la aparición de este libro. Claudio posteó la información en una lista pública del MUG de Argentina (&lt;a href="http://www.mug.org.ar/"&gt;http://www.mug.org.ar/&lt;/a&gt; ):&lt;/p&gt; &lt;p&gt;&lt;a title="Foundations of Programming Ebook" href="http://codebetter.com/blogs/karlseguin/archive/2008/06/24/foundations-of-programming-ebook.aspx"&gt;Foundations of Programming Ebook&lt;/a&gt;&lt;/p&gt; &lt;h6&gt;&amp;nbsp;&lt;/h6&gt; &lt;blockquote&gt; &lt;p&gt;I&amp;#39;m excitted to finally release the official, and completely free, Foundations of Programming EBook. This essentially contains all 9 Foundation parts including a conclusion and some typical book fluff (table of content, acknowledgement and so on). A number of spelling errors were corrected, along with some small technical changes and clarifications - largely based on feedback, so thanks for everyone who provided it! Otherwise it&amp;#39;s exactly the same as what&amp;#39;s been posted here over the past several months. &lt;p&gt;Download it from &lt;a href="http://codebetter.com/files/folders/codebetter_downloads/entry179694.aspx"&gt;http://codebetter.com/files/folders/codebetter_downloads/entry179694.aspx&lt;/a&gt; &lt;p&gt;&lt;img src="http://www.openmymind.net/cover.jpg" alt="" /&gt;  &lt;p&gt;If the above link fails, you can also get it from &lt;a href="http://www.openmymind.net/FoundationsOfProgramming.pdf"&gt;http://www.openmymind.net/FoundationsOfProgramming.pdf&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Acabo de leer el índice, y de leer algunos capítulos rápidamente. Es muy interesante los temas que toca, y parece bien encarados. El bueno de Karl Seguin ha hecho un magnífico trabajo, colocando en un solo libro temas que nos tocan en el desarrollo de software de todos los días. Si bien está algo orientado a .NET, es totalmente aprovechable en otras tecnologías, como Java. El texto había ido apareciendo en los últimos meses, en forma de posts, y revisado por colegas, en general dentro del movimiento ALT.NET, así que el trabajo de Seguin se ha enriquecido con los comentarios de la comunidad de desarrollo. &lt;p&gt;Sobre el autor &lt;blockquote&gt; &lt;p&gt;Karl Seguin is a developer at Fuel Industries, a former Microsoft MVP, a member of the influential CodeBetter.com community and an editor for DotNetSlackers. He has written numerous articles and is an active member of various Microsoft public newsgroups. He lives in Ottawa, Ontario Canada.  &lt;p&gt;His personal webpage is: &lt;a href="http://www.openmymind.net/"&gt;http://www.openmymind.net/&lt;/a&gt;  &lt;p&gt;His blog, along with that of a number of distinguished professionals, is located at: &lt;a href="http://www.codebetter.com/"&gt;http://www.codebetter.com/&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Enumero algunos temas tratados: &lt;p&gt;- El movimiento ALT.NET, enumerando y desarrollando sus pilares, algo confrontados con la visión MSDN &lt;p&gt;- Domain-Driven Design, explicando los términos, y justamente, explicando cuándo usarlo&amp;nbsp;y cuándo no, cuál es el contraste con una aproximación Data-Centric. &lt;p&gt;- Persistencia, algo con lo que lidiamos en prácticamente cada proyecto. &lt;p&gt;- Dependency Injection, una de las mejores técnicas inventadas, desde que alguien dijo que el pan tenía que venir en rebanadas. &lt;p&gt;- Unit Testing, indispensable en el bolso de la desarrolladora y en el bolsillo del caballero desarrollador. Hay días en los que pienso que hasta el Hello World de Kernighan y Ritchie debería tener su Unit Test. &lt;p&gt;- Object Relational Mappers, todo un capítulo explicando la idea y algunas implementaciones, usando NHibernate. &lt;p&gt;- Manejo de memoria, un back to basics que veo necesario, como comento en mis cursos. &lt;p&gt;- Excepciones, otro back to basics que se debe explicar. &lt;p&gt;- Proxy, tengo que ver en detalle este capítulo, para ver hasta dónde llega la idea del autor. &lt;p&gt;El libro también viene acompañado de código, con ejemplos de los temas tratados, por ejemplo, las formas de usar NHibernate, documentando sus características. Lo pueden bajar desde: &lt;p&gt;&lt;a href="http://openmymind.net/CodeBetter.Foundations.zip"&gt;http://openmymind.net/CodeBetter.Foundations.zip&lt;/a&gt; &lt;p&gt;Nos leemos! &lt;p&gt;Angel &amp;quot;Java&amp;quot; Lopez&lt;br /&gt;&lt;a href="http://www.ajlopez.com/"&gt;http://www.ajlopez.com/&lt;/a&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1637596" 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/Libros/default.aspx">Libros</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Desarrollo+de+Software/default.aspx">Desarrollo de Software</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/NHibernate/default.aspx">NHibernate</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/C+Sharp/default.aspx">C Sharp</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/VB.NET/default.aspx">VB.NET</category></item><item><title>"Ver la luz" con generación de código y AjGenesis</title><link>http://msmvps.com/blogs/lopez/archive/2008/06/10/quot-ver-la-luz-quot-con-generaci-243-n-de-c-243-digo-y-ajgenesis.aspx</link><pubDate>Tue, 10 Jun 2008 14:02:59 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1633619</guid><dc:creator>lopez</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/lopez/rsscomments.aspx?PostID=1633619</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2008/06/10/quot-ver-la-luz-quot-con-generaci-243-n-de-c-243-digo-y-ajgenesis.aspx#comments</comments><description>&lt;p&gt;Ayer dí una charla gratuita sobre generación de código, usando &lt;a href="http://www.ajlopez.com/ajgenesis" target="_blank"&gt;AjGenesis&lt;/a&gt;. Espero haber transmitido la idea de que es más que generación de código, y que va más allá de la tecnología actual.&lt;/p&gt; &lt;p&gt;Quisiera enumerar algunos posts relacionados con el tema, y comentarlos, así como enumerar enlaces y recursos.&lt;/p&gt; &lt;h3&gt;Posts sobre generación de código&lt;/h3&gt; &lt;p&gt;&lt;a title="Sobre la generaci&amp;oacute;n de c&amp;oacute;digo" href="http://msmvps.com/blogs/lopez/archive/2007/08/02/sobre-la-generaci-243-n-de-c-243-digo.aspx"&gt;Sobre la generación de código&lt;/a&gt;&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;Este es el primer post a leer. Vemos ahí que el cambio de tecnología es una constante en la historia de desarrollo de software, y que no se ve en el horizonte una unificación de nada, ni de lenguajes ni de plataformas. Cada año que pasa, sabemos más de hacer sistemas, pero curiosamente, cada sistema nuevo necesita más codigo que el anterior, en general. Aún usando tecnologías que nos alivian el trabajo, por ejemplo, algún ORM (Object Relational Mapper), si la tecnología triunfa, el propio mercado nos lleva a hacer sistemas más complejos y grandes, y lo que ahorramos en código a escribir, luego lo perdemos en la mayor complejidad de lo sistemas que tenemos a nuestro alcance construir.&lt;/p&gt; &lt;p&gt;También se enumeran otras alternativas a la generación de código, y sus problemas. Las herramientas CASE son muy rígidas, o generales o abarcativas, así como UML y otras iniciativas. Lo que necesitamos son modelos específicos de nuestro dominio, y poder generar lo que querramos, de la forma que nos convenga. De ahí la necesidad de contar con un generador de código que no esté orientado a una tecnología a generar en particular, que sea de código abierto, y que genere lo que nosotros le indicamos, no lo que los autores de la herramienta quieren o pensaron inicialmente.&lt;/p&gt; &lt;p&gt;El usar frameworks propietarios, quedarse en una sola tecnología, tratar de generar todo en runtime apelando a metadata, o generar código desde XML aplicando transformaciones XSLT, son alternativas que creo que son inferiores o más complejas, como se explica en ese post.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;a title="Generando C&amp;oacute;digo- Hello World con AjGenesis" href="http://msmvps.com/blogs/lopez/archive/2006/11/19/generando-c-digo-hello-world-con-ajgenesis.aspx"&gt;Generando Código- Hello World con AjGenesis&lt;/a&gt;&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;Esta es la &amp;quot;prueba ácida&amp;quot; de todo generador de código. Si una herramienta de ese tipo no nos ayuda a crear programas &amp;quot;Hola mundo&amp;quot;, con variantes, en distintas tecnologías, entonces no es lo bastante flexible. AjGenesis hace hincapié en la flexibilidad, la adaptibilidad a lo que Uds quieran producir, sin atarlos a una forma o metadata en particular.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;a title="Generando aplicaciones con AjGenesis" href="http://msmvps.com/blogs/lopez/archive/2007/06/25/generando-aplicaciones-con-ajgenesis.aspx"&gt;Generando aplicaciones con AjGenesis&lt;/a&gt;&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;Un post algo viejo, pero que muestra cómo se pueden generar aplicaciones no triviales con esta herramienta.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;a title="AjGenesis- Modelo generado desde los assemblies" href="http://msmvps.com/blogs/lopez/archive/2007/11/27/ajgenesis-modelo-generado-desde-los-assemblies.aspx"&gt;AjGenesis- Modelo generado desde los assemblies&lt;/a&gt;&lt;br /&gt;&lt;a title="AjGenesis- Modelo desde la Base de Datos" href="http://msmvps.com/blogs/lopez/archive/2007/11/25/ajgenesis-modelo-desde-la-base-de-datos.aspx"&gt;AjGenesis- Modelo desde la Base de Datos&lt;/a&gt;&lt;br /&gt;&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;Posts sobre cómo el modelo puede partir de otras fuentes, cualquiera que Uds. vean que sea conveniente. Luego, la propia herramienta puede mejorar, completar el modelo, hacer inferencias, o Uds. mismos completarlos, por ejemplo, si el modelo de base de datos no es lo bastante rico para darnos algo de semántica sobre el sistema que tenemos entre manos.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;a title="Generando c&amp;oacute;digo para NHibernate (Parte 3)" href="http://msmvps.com/blogs/lopez/archive/2007/10/29/generando-c-243-digo-para-nhibernate-parte-3.aspx"&gt;Generando código para NHibernate (Parte 3)&lt;/a&gt;&lt;br /&gt;&lt;a title="Generando c&amp;oacute;digo para NHibernate (Parte 2)" href="http://msmvps.com/blogs/lopez/archive/2007/09/25/generando-c-243-digo-para-nhibernate-parte-2.aspx"&gt;Generando código para NHibernate (Parte 2)&lt;/a&gt;&lt;br /&gt;&lt;a title="Generando c&amp;oacute;digo para NHibernate (Parte 1)" href="http://msmvps.com/blogs/lopez/archive/2007/08/05/generando-c-243-digo-para-nhibernate-parte-1.aspx"&gt;Generando código para NHibernate (Parte 1)&lt;/a&gt;&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;Para ver que pueden usar AjGenesis para facilitar el desarrollo usando alguna librería reconocida por la comunidad, pueden leer esta serie de enlaces, donde gracias a una idea de Omar&amp;nbsp;del valle Rodríguez, se desarrollaron templates para usar NHibernate, y generar hasta una capa de presentación web para probar lo generado.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;a title="Hacia el AjGenesis Recipes" href="http://msmvps.com/blogs/lopez/archive/2007/11/20/hacia-el-ajgenesis-recipes.aspx"&gt;Hacia el AjGenesis Recipes&lt;/a&gt;&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;Es un trabajo en progreso, para incorporar interacción con el usuario durante el proceso de generación de código.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;a title="Usando AjGenesis y NAnt" href="http://msmvps.com/blogs/lopez/archive/2007/11/01/usando-ajgenesis-y-nant.aspx"&gt;Usando AjGenesis y NAnt&lt;/a&gt;&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;Explicación y enlaces para usar AjGenesis desde NAnt. Si alguien necesita una interfaz gráfica NAnt-GUI, pueden bajarla desde &lt;a title="NAnt-GUI" href="http://groups.google.com/group/codegeneration/t/2aef426f02370d1"&gt;NAnt-GUI&lt;/a&gt;&amp;nbsp;(preparado por Carlos Marcelo Santos, del &lt;a href="http://groups.google.com/group/codegeneration" target="_blank"&gt;grupo de generación de código&lt;/a&gt;)&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;a title="Genesis Studio- una IDE para AjGenesis" href="http://msmvps.com/blogs/lopez/archive/2007/12/24/genesis-studio-una-ide-para-ajgenesis.aspx"&gt;Genesis Studio- una IDE para AjGenesis&lt;/a&gt;&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;No todo lo tienen que hacer desde la línea de comando, o desde el NAnt/NAnt-GUI. El bueno de Jonathan Cisneros desarrolló esta herramienta WinForm, con sintaxis de color y muchas mejoras en la experiencia de usuario, que pueden bajar desde:&lt;/p&gt; &lt;p&gt;&lt;a title="http://www.codeplex.com/ajgenesisstudio" href="http://www.codeplex.com/ajgenesisstudio"&gt;http://www.codeplex.com/ajgenesisstudio&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;a title="Preservando c&amp;oacute;digo en AjGenesis" href="http://msmvps.com/blogs/lopez/archive/2007/11/11/preservando-c-243-digo-en-ajgenesis.aspx"&gt;Preservando código en AjGenesis&lt;/a&gt;&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;Si necesitan generar código, pero luego modificarlo, pueden usar algunas capacidades de AjGenesis para delimitar qué parte regenerar y cuales conservan.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;a title="Code Generation as a Service" href="http://msmvps.com/blogs/lopez/archive/2008/04/03/code-generation-as-a-service.aspx"&gt;Code Generation as a Service&lt;/a&gt;&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;La última adición al AjGenesis: ahora pueden generar código usando una interfaz web. Esto permite que&amp;nbsp;ya sea en Internet, o desde la intranet de su empresa, puedan generar código controlado, que cumpla con los estándares que se hayan adoptado.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Más posts sobre AjGenesis en&lt;/p&gt; &lt;p&gt;&lt;a title="AjGenesis" href="http://msmvps.com/blogs/lopez/archive/tags/AjGenesis/default.aspx"&gt;AjGenesis&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Si necesitan pasarle información a alguien que no maneja el español, pueden probar con mis artículos en &amp;quot;Anglish&amp;quot; (Angel&amp;#39;s English):&lt;/p&gt; &lt;p&gt;&lt;a title="http://ajlopez.wordpress.com/category/ajgenesis" href="http://ajlopez.wordpress.com/category/ajgenesis"&gt;http://ajlopez.wordpress.com/category/ajgenesis&lt;/a&gt;&lt;/p&gt; &lt;h3&gt;Enlaces&lt;/h3&gt; &lt;p&gt;EL sitio sobre generación de código es&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.codegeneration.net"&gt;http://www.codegeneration.net&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Ahí encontraran comentarios, herramientas, preguntas frecuentes sobre generación de código en general. Tienen una base de datos de herramientas publicadas. Hay enlaces sobre generación de código para distintas tecnologías, como Java, .NET, PHP y también temas de MDA (Model-Driven Architecture).&lt;/p&gt; &lt;p&gt;Otros enlaces que tratamos en las charlas son:&lt;/p&gt; &lt;p&gt;&lt;a title="CodeSmith Tools - The best .NET template based source code" href="http://www.codesmithtools.com/"&gt;CodeSmith Tools&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a title="MyGeneration Software" href="http://www.mygenerationsoftware.com/"&gt;MyGeneration Software&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a title="AndroMDA.org - Home" href="http://www.andromda.org/"&gt;AndroMDA.org - Home&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Mantengo todo tipo de enlaces relativos a generación de código en&lt;/p&gt; &lt;p&gt;&lt;a href="http://del.icio.us/ajlopez/codegeneration"&gt;http://del.icio.us/ajlopez/codegeneration&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;h3&gt;Lista de correo sobre generación de código&lt;/h3&gt; &lt;p&gt;Existe un Google Group que se puede consultar por email, en español, dedicado a la generación de código. Ahí, además de otros temas, se trata de generación de código con AjGenesis, la generación de templates. En los archivos del grupo se publican ejemplos armados por los miembros.&lt;/p&gt; &lt;p&gt;Pueden ver los mensajes y suscribirse, en:&lt;/p&gt; &lt;p&gt;&lt;a title="http://groups.google.com/group/codegeneration" href="http://groups.google.com/group/codegeneration"&gt;http://groups.google.com/group/codegeneration&lt;/a&gt;&lt;/p&gt; &lt;h3&gt;Conclusión&lt;/h3&gt; &lt;p&gt;Espero que quede claro que lo importante es usar generación de código como solución pragmática, pero basado en la abstracción de un modelo. Hacer el ejercicio de abstracción de generar un modelo adecuado para lo que necesitemos, es un &amp;quot;must&amp;quot; que me parece el primer paso para separarnos de los problemas de cambios en las tecnologías, herramientas y plataformas.&lt;/p&gt; &lt;p&gt;Luego, el modelo debe ser de libre definición. Y el texto o código generado, también: debe ser el tipo de texto o código que hubiéramos generado nosotros mismos. Finalmente, la herramienta de generación de código tiene que estar disponible en código totalmente abierto, para que se pueda extender, entender o usar de la forma que querramos.&lt;/p&gt; &lt;p&gt;Tengo que escribir más sobre la importancia del modelo, y que pueden hacer el suyo propio: no hay modelo fijo, pueden partir desde la base de datos, desde los archivos XML de los ejemplos, o desde donde quieran. También tengo que escribir sobre la posibilidad de hacer modelos que se deriven de otros modelos. Y escribir haciendo énfasis en que lo que construimos, en realidad, es un sistema experto. De ahí, que desde el principio, incorporé un lenguaje de programación que puede tomar decisiones, completar y modificar el modelo.&lt;/p&gt; &lt;p&gt;Como ven, con AjGenesis, ¡sky is the limit! :-)&lt;/p&gt; &lt;p&gt;Nos leemos!&lt;/p&gt; &lt;p&gt;Angel &amp;quot;Java&amp;quot; Lopez&lt;br /&gt;&lt;a href="http://www.ajlopez.com/"&gt;http://www.ajlopez.com/&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1633619" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/PHP/default.aspx">PHP</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Arquitectura/default.aspx">Arquitectura</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Generaci_26002300_243_3B00_n+de+C_26002300_243_3B00_digo/default.aspx">Generaci&amp;#243;n de C&amp;#243;digo</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Desarrollo+de+Software/default.aspx">Desarrollo de Software</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/NHibernate/default.aspx">NHibernate</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/C_26002300_243_3B00_digo+Abierto/default.aspx">C&amp;#243;digo Abierto</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/C+Sharp/default.aspx">C Sharp</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/VB.NET/default.aspx">VB.NET</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/AjGenesis/default.aspx">AjGenesis</category></item><item><title>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>Generando código para NHibernate (Parte 3)</title><link>http://msmvps.com/blogs/lopez/archive/2007/10/29/generando-c-243-digo-para-nhibernate-parte-3.aspx</link><pubDate>Mon, 29 Oct 2007 09:17:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1273179</guid><dc:creator>lopez</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/lopez/rsscomments.aspx?PostID=1273179</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2007/10/29/generando-c-243-digo-para-nhibernate-parte-3.aspx#comments</comments><description>&lt;p&gt;Siguiendo con la serie&lt;/p&gt;
&lt;p&gt;&lt;a title="Generando código para NHibernate (Parte 1)" href="http://msmvps.com/blogs/lopez/archive/2007/08/05/generando-c-243-digo-para-nhibernate-parte-1.aspx"&gt;Generando código para NHibernate (Parte 1)&lt;/a&gt;&lt;br /&gt;&lt;a title="Generando código para NHibernate (Parte 2)" href="http://msmvps.com/blogs/lopez/archive/2007/09/25/generando-c-243-digo-para-nhibernate-parte-2.aspx"&gt;Generando código para NHibernate (Parte 2)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;del ejemplo de Omar del valle Rodriguez, tengo una nueva versión del ejemplo, que genera aplicaciones con &lt;a href="http://www.ajlopez.com/ajgenesis"&gt;AjGenesis&lt;/a&gt;. Gracias desde acá, a las sugerencias de Omar, y de Fabio Maulo. He incorporado algunas características, como:&lt;/p&gt;
&lt;p&gt;- Uso de NHibernate 1.2&lt;/p&gt;
&lt;p&gt;- Manejo de mapeo de subclases en .hbm por separado&lt;/p&gt;
&lt;p&gt;- Propiedades virtuales en las entidades&lt;/p&gt;
&lt;p&gt;- Dos nuevas aplicaciones generadas&lt;/p&gt;
&lt;p&gt;Pueden bajar el ejemplo AjOmar Versión&amp;nbsp;1.1 (es el archivo&amp;nbsp;&lt;strong&gt;AjOmar-v1.1.zip&lt;/strong&gt;) desde la &lt;a href="http://www.codeplex.com/ajgenesis/Release/ProjectReleases.aspx?ReleaseId=7261" target="_blank"&gt;página de ejemplos de AjGenesis&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;El modelo&lt;/h3&gt;
&lt;p&gt;Como siempre, la idea de AjGenesis es basarse en un modelo libre, donde uno especifica lo que le interesa modelar. En el caso de este ejemplo, se modelan entidades, y a partir de esa información se generan aplicaciones completas. El modelo prácticamente no cambió desde la anterior versión (ver &lt;a href="http://msmvps.com/blogs/lopez/archive/2007/09/25/generando-c-243-digo-para-nhibernate-parte-2.aspx"&gt;Parte 2&lt;/a&gt;), en el archivo &lt;strong&gt;Projects/AjOmar/Project.xml&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:59fb84c3-4ef7-4027-9ace-346977021a44" style="PADDING-RIGHT:0px;DISPLAY:inline;PADDING-LEFT:0px;FLOAT:none;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;&lt;pre style="BACKGROUND-COLOR:white;WORD-WRAP:break-word;"&gt;&lt;div&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;Project&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;
    &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;Name&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;AjOmar&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;Name&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;
    &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;Description&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;Example AjOmar for (N)Hibernate&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;Description&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;
    &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;Prefix&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;AjOm&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;Prefix&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;
    &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;Domain&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;com.ajomar&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;Domain&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;
    &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;CompanyName&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;ajomar&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;CompanyName&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;
    &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;Model&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;
        &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;Entities&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;
            &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;Entity &lt;/span&gt;&lt;span style="COLOR:#ff0000;"&gt;Source&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;=&amp;quot;Entities/Client.xml&amp;quot;&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;
            &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;Entity &lt;/span&gt;&lt;span style="COLOR:#ff0000;"&gt;Source&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;=&amp;quot;Entities/Company.xml&amp;quot;&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;
            &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;Entity &lt;/span&gt;&lt;span style="COLOR:#ff0000;"&gt;Source&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;=&amp;quot;Entities/User.xml&amp;quot;&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;
        &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;Entities&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;
    &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;Model&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;
&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;Project&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Como había pedido Omar, &lt;strong&gt;Company&lt;/strong&gt; y &lt;strong&gt;User&lt;/strong&gt; heredan de &lt;strong&gt;Client&lt;/strong&gt;. En la base de datos se usan tres tablas, y el NHibernate hace la magia del mapeo en este dominio con entidades relacionadas por herencia.&lt;/p&gt;
&lt;p&gt;Como antes, también se especifican los elementos de tecnología, como la base de datos a usar, el usuario y contraseña a usar en los strings de conección, y otros detalles. Esto permite cambiar la tecnología, sin cambiar el modelo de arriba. Un ejemplo en el archivo &lt;strong&gt;Projects/AjOmar/Technologies/VbNet2Nh.xml&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:f6340adb-111d-42cc-93c6-c007a80600ac" style="PADDING-RIGHT:0px;DISPLAY:inline;PADDING-LEFT:0px;FLOAT:none;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;&lt;pre style="BACKGROUND-COLOR:white;WORD-WRAP:break-word;"&gt;&lt;div&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;Technology&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;
    &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;Programming&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;
        &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;Dialect&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;VbNet2Nh&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;Dialect&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;
    &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;Programming&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;
    &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;Database&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;
        &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;Dialect&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;MsSql&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;Dialect&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;
        &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;Name&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;AjOmar&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;Name&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;
        &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;Username&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;sa&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;Username&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;
        &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;Prefix&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;ajom_&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;Prefix&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;
        &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;Host&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;(local)&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;Host&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;
    &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;Database&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;
    &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;NHibernate&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;
        &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;Dialect&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;NHibernate.Dialect.MsSql2000Dialect&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;Dialect&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;
    &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;NHibernate&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;
&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;Technology&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Deberá adaptar este archivo si necesita ajustar esos datos.&lt;/p&gt;
&lt;p&gt;Siguiendo algunas recomendaciones de Fabio Maulo, ahora hay un .hbm por entidad. Ejemplo generado en &lt;strong&gt;Build/AjOmar/VbNet2Nh/Src/AjOmar.Data/Company.hbm.xml&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:15dfc089-ece1-4b66-a5bf-9017d3ab2a93" style="PADDING-RIGHT:0px;DISPLAY:inline;PADDING-LEFT:0px;FLOAT:none;PADDING-BOTTOM:0px;MARGIN:0px;PADDING-TOP:0px;"&gt;&lt;pre style="BACKGROUND-COLOR:white;WORD-WRAP:break-word;"&gt;&lt;div&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="COLOR:#ff00ff;"&gt;xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot; &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;?&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt; 
&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;hibernate-mapping &lt;/span&gt;&lt;span style="COLOR:#ff0000;"&gt;xmlns&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;=&amp;quot;urn:nhibernate-mapping-2.2&amp;quot;&lt;/span&gt;&lt;span style="COLOR:#ff0000;"&gt;
    assembly&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;=&amp;quot;AjOmar.Entities&amp;quot;&lt;/span&gt;&lt;span style="COLOR:#ff0000;"&gt;
    namespace&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;=&amp;quot;AjOmar.Entities&amp;quot;&lt;/span&gt;&lt;span style="COLOR:#ff0000;"&gt;
    &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;
    &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;joined-subclass &lt;/span&gt;&lt;span style="COLOR:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;=&amp;quot;Company&amp;quot;&lt;/span&gt;&lt;span style="COLOR:#ff0000;"&gt; table&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;=&amp;quot;ajom_companies&amp;quot;&lt;/span&gt;&lt;span style="COLOR:#ff0000;"&gt; extends&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;=&amp;quot;Client&amp;quot;&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;
        &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;key &lt;/span&gt;&lt;span style="COLOR:#ff0000;"&gt;column&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;=&amp;quot;Id&amp;quot;&lt;/span&gt;&lt;span style="COLOR:#ff0000;"&gt; &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;
        &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;property &lt;/span&gt;&lt;span style="COLOR:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;=&amp;quot;CompanyName&amp;quot;&lt;/span&gt;&lt;span style="COLOR:#ff0000;"&gt; type&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;=&amp;quot;String&amp;quot;&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;
        &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;property &lt;/span&gt;&lt;span style="COLOR:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;=&amp;quot;ContactName&amp;quot;&lt;/span&gt;&lt;span style="COLOR:#ff0000;"&gt; type&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;=&amp;quot;String&amp;quot;&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;
    &lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;joined-subclass&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;
&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR:#800000;"&gt;hibernate-mapping&lt;/span&gt;&lt;span style="COLOR:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR:#000000;"&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;Las aplicaciones&lt;/h3&gt;
&lt;p&gt;Se pueden generar aplicaciones completas, con proyectos y solución web.&amp;nbsp;La generación se invoca con comando de línea, como se explica en la &lt;a href="http://msmvps.com/blogs/lopez/archive/2007/09/25/generando-c-243-digo-para-nhibernate-parte-2.aspx"&gt;Parte 2&lt;/a&gt;. Hay que agregar el directorio bin del AjGenesis en el path de ejecución para que funcionen.&lt;/p&gt;
&lt;p&gt;Ahora están habilitados cuatro generaciones de soluciones:&lt;/p&gt;
&lt;p&gt;&lt;font face="Consolas"&gt;GenerateProject AjOmar VbNet2Nh&lt;br /&gt;GenerateProject AjOmar CSharp2Nh&lt;br /&gt;GenerateProject AjOmar VbNet2DDDNh&lt;br /&gt;GenerateProject AjOmar CSharp2DDDNh&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;Los dos primeros generan aplicaciones VB.NET y C Sharp, con ASP.NET 2.x, y acceso a datos usando DAOs que usan NHibernate.&lt;/p&gt;
&lt;p&gt;Los dos nuevos comandos generan aplicaciones con VB.NET y C Sharp, que utilizan algunas ideas de Domain-Driven Design.&lt;/p&gt;
&lt;h3&gt;Generando DDD&lt;/h3&gt;
&lt;p&gt;Las nuevas soluciones generadas, tienen&amp;nbsp;varios proyectos de librerías de clases:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;AjNHibernate&lt;/strong&gt;: contiene las clases para el manejo de las llamadas al NHibernate, como configuración, factoría y obtención de sesiones. 
&lt;li&gt;&lt;strong&gt;AjOmar.Domain&lt;/strong&gt;: contiene las Entities, Services, y Repositories, a la Evans. No hay conceptos de Value Objects, o Aggregates. Los servicios se llaman Manager, para distinguirlos de la fachada de servicio que uso en Application. 
&lt;li&gt;&lt;strong&gt;AjOmar.Application&lt;/strong&gt;: la capa que coordina las llamadas al Dominio, desde la presentación. &lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;img src="http://www.ajlopez.net/images/articles/ajomar07.jpg" alt="" /&gt; &lt;/p&gt;
&lt;p&gt;Y como antes, hay una aplicación web &lt;strong&gt;AjOmar.WebClient&lt;/strong&gt;. &lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.ajlopez.net/images/articles/ajomar08.jpg" alt="" /&gt; &lt;/p&gt;
&lt;h3&gt;Próximos pasos&lt;/h3&gt;
&lt;p&gt;Tengo que generar aplicaciones similares para Hibernate, Java, y MySql. La idea es que sirva como prueba de concepto: desde un mismo modelo, se pueden generar aplicaciones implementadas con distintas tecnologías.&lt;/p&gt;
&lt;p&gt;Habrá que estudiar e implementar el manejo de nulos, restricciones por tamaño de campo, y mejorar la apariencia de las aplicaciones generadas.&lt;/p&gt;
&lt;p&gt;Hay que mejorar (y probar) el manejo de relaciones uno a varios, o varios a uno. Lo tengo implementado en los ejemplos &lt;a href="http://www.codeplex.com/ajgenesis/Release/ProjectReleases.aspx?ReleaseId=7261" target="_blank"&gt;AjGenesisExamples3&lt;/a&gt;, pero debería pasar ese código de plantillas y adaptarlo para este ejemplo.&lt;/p&gt;
&lt;p&gt;Nos leemos!&lt;/p&gt;
&lt;p&gt;Angel &amp;quot;Java&amp;quot; Lopez&lt;br /&gt;&lt;a href="http://www.ajlopez.com/"&gt;http://www.ajlopez.com/&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1273179" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Generaci_26002300_243_3B00_n+de+C_26002300_243_3B00_digo/default.aspx">Generaci&amp;#243;n de C&amp;#243;digo</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Domain-Driven+Design/default.aspx">Domain-Driven Design</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/NHibernate/default.aspx">NHibernate</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/C+Sharp/default.aspx">C Sharp</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/VB.NET/default.aspx">VB.NET</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/AjGenesis/default.aspx">AjGenesis</category></item><item><title>Lo nuevo en Visual Basic.NET (Parte 2)</title><link>http://msmvps.com/blogs/lopez/archive/2007/09/29/lo-nuevo-en-visual-basic-net-parte-2.aspx</link><pubDate>Sat, 29 Sep 2007 12:11:39 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1222028</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=1222028</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2007/09/29/lo-nuevo-en-visual-basic-net-parte-2.aspx#comments</comments><description>&lt;p&gt;Ya visité algunas características nuevas de VB.NET 9, que viene integrado en el Visual Studio 2008. Estoy usando una beta 2. El artículo anterior es:&lt;/p&gt; &lt;p&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2007/09/27/lo-nuevo-en-visual-basic-net-parte-1.aspx"&gt;Lo nuevo en Visual Basic.NET (Parte 1)&lt;/a&gt;&lt;/p&gt; &lt;p&gt;El ejemplo de hoy está para descargarse en &lt;a href="http://www.ajlopez.com/downloads/DotNet/VbNetNew2.zip"&gt;VbNetNew2.zip&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Usa la misma clase Supplier. Investiguemos dos nuevos métodos del tipo extension methods:&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:60020d26-d19f-4e3d-9ab8-fe74f331813a" 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;Imports&lt;/span&gt;&lt;span style="color:#000000;"&gt; System.Runtime.CompilerServices

&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Module&lt;/span&gt;&lt;span style="color:#000000;"&gt; Extensions

    &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Extension()&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&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;Function&lt;/span&gt;&lt;span style="color:#000000;"&gt; Append(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Of&lt;/span&gt;&lt;span style="color:#000000;"&gt; T)(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;ByVal&lt;/span&gt;&lt;span style="color:#000000;"&gt; a &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;As&lt;/span&gt;&lt;span style="color:#000000;"&gt; T(), &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;ByVal&lt;/span&gt;&lt;span style="color:#000000;"&gt; b &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;As&lt;/span&gt;&lt;span style="color:#000000;"&gt; T()) &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;As&lt;/span&gt;&lt;span style="color:#000000;"&gt; List(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Of&lt;/span&gt;&lt;span style="color:#000000;"&gt; T)
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Dim&lt;/span&gt;&lt;span style="color:#000000;"&gt; result &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;New&lt;/span&gt;&lt;span style="color:#000000;"&gt; List(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Of&lt;/span&gt;&lt;span style="color:#000000;"&gt; T)(a)

        result.AddRange(b)

        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Return&lt;/span&gt;&lt;span style="color:#000000;"&gt; result
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;End Function&lt;/span&gt;&lt;span style="color:#000000;"&gt;

    &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Extension()&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&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;Sub&lt;/span&gt;&lt;span style="color:#000000;"&gt; Show(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;ByVal&lt;/span&gt;&lt;span style="color:#000000;"&gt; suppliers &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;As&lt;/span&gt;&lt;span style="color:#000000;"&gt; IEnumerable(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Of&lt;/span&gt;&lt;span style="color:#000000;"&gt; Supplier))
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;For&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Each&lt;/span&gt;&lt;span style="color:#000000;"&gt; supplier &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;As&lt;/span&gt;&lt;span style="color:#000000;"&gt; Supplier &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;In&lt;/span&gt;&lt;span style="color:#000000;"&gt; suppliers
            Console.WriteLine(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Supplier {0} {1} ({2})&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, supplier.SupplierId, supplier.Name, supplier.City)
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Next&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;End Sub&lt;/span&gt;&lt;span style="color:#000000;"&gt;

&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;End Module&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&gt;Recordemos: los extension methods son métodos que se pueden adosar a instancias de clases ya existentes, justamente, extendiendo su funcionalidad.&lt;/p&gt;
&lt;p&gt;En VB.NET, se escriben como métodos de un módulo, marcados con el atributo &lt;strong&gt;&amp;lt;Extension()&amp;gt; &lt;/strong&gt;. El primer parámetro indica la clase a la cual adosarle este método.&lt;/p&gt;
&lt;p&gt;En el método &lt;strong&gt;Append&lt;/strong&gt; de arriba, lo nuevo es que se puede usar generics. Es un método que se aplica a todo arreglo, de cualquier tipo &lt;strong&gt;T&lt;/strong&gt;. Y devuelve una lista tipada del mismo &lt;strong&gt;T&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;El método &lt;strong&gt;Show&lt;/strong&gt;, se usa adosa a todo &lt;strong&gt;IEnumerable&lt;/strong&gt; de &lt;strong&gt;Supplier&lt;/strong&gt;s, no importa la clase concreta que implemente esa interfaz.&lt;/p&gt;
&lt;p&gt;Esto demuestra la flexibilidad del concepto de extension methods.&lt;/p&gt;
&lt;p&gt;En el &lt;strong&gt;Main&lt;/strong&gt;, se usa tanto el &lt;strong&gt;Append&lt;/strong&gt;, para unir dos listas, como el &lt;strong&gt;Show&lt;/strong&gt;, para mostrar una lista de proveedores:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:2384a3a9-b921-44d0-bb12-cf28cd384729" 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:#008080;"&gt; 1&lt;/span&gt; &lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Sub&lt;/span&gt;&lt;span style="color:#000000;"&gt; Main()
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 2&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Dim&lt;/span&gt;&lt;span style="color:#000000;"&gt; suppliers() &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;As&lt;/span&gt;&lt;span style="color:#000000;"&gt; Supplier &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;New&lt;/span&gt;&lt;span style="color:#000000;"&gt; Supplier() { _
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 3&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;New&lt;/span&gt;&lt;span style="color:#000000;"&gt; Supplier(&lt;/span&gt;&lt;span style="color:#000000;"&gt;1&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; {.Name &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;John Madison&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, .City &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;Washington&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;}, _
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 4&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;New&lt;/span&gt;&lt;span style="color:#000000;"&gt; Supplier(&lt;/span&gt;&lt;span style="color:#000000;"&gt;2&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; {.Name &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;Ann Arbor&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, .City &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;Ohio&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;}, _
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 5&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;New&lt;/span&gt;&lt;span style="color:#000000;"&gt; Supplier(&lt;/span&gt;&lt;span style="color:#000000;"&gt;3&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; {.Name &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;Don Johnson&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, .City &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;Miami&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;}, _
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 6&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;New&lt;/span&gt;&lt;span style="color:#000000;"&gt; Supplier(&lt;/span&gt;&lt;span style="color:#000000;"&gt;4&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; {.Name &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;Bill Clinton&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, .City &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;Washington&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;} _
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 7&lt;/span&gt; &lt;span style="color:#000000;"&gt;        }
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 8&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 9&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Dim&lt;/span&gt;&lt;span style="color:#000000;"&gt; suppliers2() &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;As&lt;/span&gt;&lt;span style="color:#000000;"&gt; Supplier &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;New&lt;/span&gt;&lt;span style="color:#000000;"&gt; Supplier() { _
&lt;/span&gt;&lt;span style="color:#008080;"&gt;10&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;New&lt;/span&gt;&lt;span style="color:#000000;"&gt; Supplier(&lt;/span&gt;&lt;span style="color:#000000;"&gt;5&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; {.Name &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;John Smith&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, .City &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;New Jersey&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;}, _
&lt;/span&gt;&lt;span style="color:#008080;"&gt;11&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;New&lt;/span&gt;&lt;span style="color:#000000;"&gt; Supplier(&lt;/span&gt;&lt;span style="color:#000000;"&gt;6&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; {.Name &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;Mary Dupinsky&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, .City &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;Los Angeles&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;}, _
&lt;/span&gt;&lt;span style="color:#008080;"&gt;12&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;New&lt;/span&gt;&lt;span style="color:#000000;"&gt; Supplier(&lt;/span&gt;&lt;span style="color:#000000;"&gt;7&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; {.Name &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;Ronald Reagan&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, .City &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;Washington&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;}, _
&lt;/span&gt;&lt;span style="color:#008080;"&gt;13&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;New&lt;/span&gt;&lt;span style="color:#000000;"&gt; Supplier(&lt;/span&gt;&lt;span style="color:#000000;"&gt;8&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; {.Name &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;Brad Shapiro&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, .City &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;Dallas&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;} _
&lt;/span&gt;&lt;span style="color:#008080;"&gt;14&lt;/span&gt; &lt;span style="color:#000000;"&gt;        }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;15&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;16&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Dim&lt;/span&gt;&lt;span style="color:#000000;"&gt; allsuppliers &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; suppliers.Append(suppliers2)
&lt;/span&gt;&lt;span style="color:#008080;"&gt;17&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;18&lt;/span&gt; &lt;span style="color:#000000;"&gt;        Console.WriteLine(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;All Suppliers&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
&lt;/span&gt;&lt;span style="color:#008080;"&gt;19&lt;/span&gt; &lt;span style="color:#000000;"&gt;        allsuppliers.Show()
&lt;/span&gt;&lt;span style="color:#008080;"&gt;20&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;21&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Dim&lt;/span&gt;&lt;span style="color:#000000;"&gt; suppliers3 &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; allsuppliers.FindAll(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Function&lt;/span&gt;&lt;span style="color:#000000;"&gt;(s) s.City &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;Washington&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
&lt;/span&gt;&lt;span style="color:#008080;"&gt;22&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;23&lt;/span&gt; &lt;span style="color:#000000;"&gt;        Console.WriteLine()
&lt;/span&gt;&lt;span style="color:#008080;"&gt;24&lt;/span&gt; &lt;span style="color:#000000;"&gt;        Console.WriteLine(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Suppliers In Washington&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
&lt;/span&gt;&lt;span style="color:#008080;"&gt;25&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;26&lt;/span&gt; &lt;span style="color:#000000;"&gt;        suppliers3.Show()
&lt;/span&gt;&lt;span style="color:#008080;"&gt;27&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;28&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Dim&lt;/span&gt;&lt;span style="color:#000000;"&gt; suppliers4 &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; From s &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;In&lt;/span&gt;&lt;span style="color:#000000;"&gt; suppliers _
&lt;/span&gt;&lt;span style="color:#008080;"&gt;29&lt;/span&gt; &lt;span style="color:#000000;"&gt;                             Where s.City &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;Washington&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; _
&lt;/span&gt;&lt;span style="color:#008080;"&gt;30&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; s
&lt;/span&gt;&lt;span style="color:#008080;"&gt;31&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;32&lt;/span&gt; &lt;span style="color:#000000;"&gt;        Console.WriteLine()
&lt;/span&gt;&lt;span style="color:#008080;"&gt;33&lt;/span&gt; &lt;span style="color:#000000;"&gt;        Console.WriteLine(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Suppliers In Washington&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
&lt;/span&gt;&lt;span style="color:#008080;"&gt;34&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;35&lt;/span&gt; &lt;span style="color:#000000;"&gt;        suppliers4.Show()
&lt;/span&gt;&lt;span style="color:#008080;"&gt;36&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;37&lt;/span&gt; &lt;span style="color:#000000;"&gt;        Console.ReadLine()
&lt;/span&gt;&lt;span style="color:#008080;"&gt;38&lt;/span&gt; &lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;End Sub&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;39&lt;/span&gt; &lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;En la línea 21, se aplica un método de extensión ya definido en LINQ, para aplicar ubicar todos los elementos de una lista que cumplan con un predicado. Aparece el nuevo &lt;strong&gt;Function&lt;/strong&gt; para especificar un predicado ahí mismo.&lt;/p&gt;
&lt;p&gt;En la línea 28, se ve que podemos usar también LINQ directamente en el lenguaje. Como en el caso examinado en otro post con C Sharp, el &lt;strong&gt;from&lt;/strong&gt; va primero, y al final, el &lt;strong&gt;select&lt;/strong&gt;. Esto le facilita a la IDE que pueda determinar qué tido de datos puede seleccionar, habiéndole primero indicado cuál es el tipo que se recupera.&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=1222028" 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></item><item><title>Lo nuevo en Visual Basic .NET (Parte 1)</title><link>http://msmvps.com/blogs/lopez/archive/2007/09/27/lo-nuevo-en-visual-basic-net-parte-1.aspx</link><pubDate>Thu, 27 Sep 2007 12:30:58 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1219299</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=1219299</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2007/09/27/lo-nuevo-en-visual-basic-net-parte-1.aspx#comments</comments><description>&lt;p&gt;En post anteriores:&lt;/p&gt; &lt;p&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2007/08/29/lo-nuevo-de-csharp-parte-1.aspx" target="_blank"&gt;Lo nuevo de CSharp (Parte 1)&lt;/a&gt;&lt;br /&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2007/09/13/lo-nuevo-de-c-sharp-parte-2.aspx" target="_blank"&gt;Lo nuevo de CSharp (Parte 2)&lt;/a&gt;&lt;/p&gt; &lt;p&gt;había escrito sobre algunas características nuevas que aparecen en el CSharp 3, que vendrá integrado en el Visual Studio 2008, y que estoy probando en la beta 2 de esta IDE.&lt;/p&gt; &lt;p&gt;Veamos ahora un ejemplo en VB.NET 9 (como se lo llama), disponible en &lt;a href="http://www.ajlopez.com/downloads/DotNet/VbNetNew1.zip"&gt;VbNetNew1.zip&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Es un simple programa de consola, que utiliza una clase &lt;strong&gt;Supplier&lt;/strong&gt;:&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:8261d92c-1af0-4a26-82b0-6567cb78fba5" 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;Public&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; Supplier
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Private&lt;/span&gt;&lt;span style="color:#000000;"&gt; mSupplierId &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;As&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Integer&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Private&lt;/span&gt;&lt;span style="color:#000000;"&gt; mName &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;As&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;String&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Private&lt;/span&gt;&lt;span style="color:#000000;"&gt; mCity &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;As&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;String&lt;/span&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;Sub&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;New&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;ByVal&lt;/span&gt;&lt;span style="color:#000000;"&gt; id &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;As&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Integer&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
        mSupplierId &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; id
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;End Sub&lt;/span&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;Property&lt;/span&gt;&lt;span style="color:#000000;"&gt; SupplierId() &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;As&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Integer&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Get&lt;/span&gt;&lt;span style="color:#000000;"&gt;
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Return&lt;/span&gt;&lt;span style="color:#000000;"&gt; mSupplierId
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;End&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Get&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Set&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;ByVal&lt;/span&gt;&lt;span style="color:#000000;"&gt; value &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;As&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Integer&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
            mSupplierId &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; value
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;End&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Set&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;End Property&lt;/span&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;Property&lt;/span&gt;&lt;span style="color:#000000;"&gt; Name() &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;As&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;String&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Get&lt;/span&gt;&lt;span style="color:#000000;"&gt;
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Return&lt;/span&gt;&lt;span style="color:#000000;"&gt; mName
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;End&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Get&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Set&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;ByVal&lt;/span&gt;&lt;span style="color:#000000;"&gt; value &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;As&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;String&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
            mName &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; value
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;End&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Set&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;End Property&lt;/span&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;Property&lt;/span&gt;&lt;span style="color:#000000;"&gt; City() &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;As&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;String&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Get&lt;/span&gt;&lt;span style="color:#000000;"&gt;
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Return&lt;/span&gt;&lt;span style="color:#000000;"&gt; mCity
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;End&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Get&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Set&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;ByVal&lt;/span&gt;&lt;span style="color:#000000;"&gt; value &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;As&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;String&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
            mCity &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; value
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;End&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Set&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;End Property&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;End Class&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;No encontré que el nuevo VB.NET tuviera propiedades automáticas, como en el nuevo CSharp. Así que en este ejemplo, el código de la clase no muestra nada nuevo.&lt;/p&gt;
&lt;p&gt;En la rutina &lt;strong&gt;Main&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:b9e450fa-bb46-455d-8062-980ab9576036" 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:#008080;"&gt; 1&lt;/span&gt; &lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Sub&lt;/span&gt;&lt;span style="color:#000000;"&gt; Main()
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 2&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Dim&lt;/span&gt;&lt;span style="color:#000000;"&gt; suppliers() &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;As&lt;/span&gt;&lt;span style="color:#000000;"&gt; Supplier &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;New&lt;/span&gt;&lt;span style="color:#000000;"&gt; Supplier() { _
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 3&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;New&lt;/span&gt;&lt;span style="color:#000000;"&gt; Supplier(&lt;/span&gt;&lt;span style="color:#000000;"&gt;1&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; {.Name &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;John Madison&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, .City &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;Washington&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;}, _
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 4&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;New&lt;/span&gt;&lt;span style="color:#000000;"&gt; Supplier(&lt;/span&gt;&lt;span style="color:#000000;"&gt;2&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; {.Name &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;Ann Arbor&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, .City &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;Ohio&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;}, _
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 5&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;New&lt;/span&gt;&lt;span style="color:#000000;"&gt; Supplier(&lt;/span&gt;&lt;span style="color:#000000;"&gt;3&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; {.Name &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;Don Johnson&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, .City &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;Miami&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;} _
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 6&lt;/span&gt; &lt;span style="color:#000000;"&gt;        }
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 7&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 8&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;For&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Each&lt;/span&gt;&lt;span style="color:#000000;"&gt; supplier &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;As&lt;/span&gt;&lt;span style="color:#000000;"&gt; Supplier &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;In&lt;/span&gt;&lt;span style="color:#000000;"&gt; suppliers
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 9&lt;/span&gt; &lt;span style="color:#000000;"&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;{0} {1}&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, supplier.SupplierId, supplier.Name)
&lt;/span&gt;&lt;span style="color:#008080;"&gt;10&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Next&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;11&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;12&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Dim&lt;/span&gt;&lt;span style="color:#000000;"&gt; c &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;New&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;With&lt;/span&gt;&lt;span style="color:#000000;"&gt; {.Name &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;John Doe&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, .City &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;Everywhere&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;}
&lt;/span&gt;&lt;span style="color:#008080;"&gt;13&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;14&lt;/span&gt; &lt;span style="color:#000000;"&gt;        Console.WriteLine(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;{0} lives in {1}&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, c.Name, c.City)
&lt;/span&gt;&lt;span style="color:#008080;"&gt;15&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;16&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;For&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Each&lt;/span&gt;&lt;span style="color:#000000;"&gt; supplier &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;As&lt;/span&gt;&lt;span style="color:#000000;"&gt; Supplier &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;In&lt;/span&gt;&lt;span style="color:#000000;"&gt; suppliers
&lt;/span&gt;&lt;span style="color:#008080;"&gt;17&lt;/span&gt; &lt;span style="color:#000000;"&gt;            supplier.Print()
&lt;/span&gt;&lt;span style="color:#008080;"&gt;18&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Next&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;19&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;20&lt;/span&gt; &lt;span style="color:#000000;"&gt;        Console.ReadLine()
&lt;/span&gt;&lt;span style="color:#008080;"&gt;21&lt;/span&gt; &lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;End Sub&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;22&lt;/span&gt; &lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;comienza a aparecer algunas características nuevas. En la línea 2, vemos la creación e inicialización de un arreglo, con el uso de llaves. En la línea 3, 4 y 5, aparece la creación de objetos con uso de &lt;strong&gt;With&lt;/strong&gt;. Esto permite, llamar a un constructor, como &lt;strong&gt;Supplier(1)&lt;/strong&gt;, y luego completar las propiedades, con punto más el nombre de la propiedad.&lt;/p&gt;
&lt;p&gt;En la línea 12, podemos crear una variable con un tipo implícito. Vemos que el &lt;strong&gt;new&lt;/strong&gt; no refiere a ninguna clase en particular, pero en el &lt;strong&gt;with&lt;/strong&gt; se colocan las propiedades que va a tener ese objeto.&lt;/p&gt;
&lt;p&gt;Automáticamente, el IDE &amp;quot;arma&amp;quot; el tipo de la variable &lt;strong&gt;c&lt;/strong&gt;, y me permite usar &lt;strong&gt;c.Name&lt;/strong&gt; y &lt;strong&gt;c.City&lt;/strong&gt; en la línea 14. La IDE hace inferencia de tipo.&lt;/p&gt;
&lt;p&gt;En la línea 17, &lt;strong&gt;Print&lt;/strong&gt; no es un método de la clase &lt;strong&gt;Supplier&lt;/strong&gt;. Está definido en otra &amp;quot;clase&amp;quot;:&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:9c2d3764-ff8a-4784-91b8-c47514963de2" 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;Imports&lt;/span&gt;&lt;span style="color:#000000;"&gt; System.Runtime.CompilerServices

&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Module&lt;/span&gt;&lt;span style="color:#000000;"&gt; Extensions

    &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Extension()&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&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;Sub&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Print&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;ByVal&lt;/span&gt;&lt;span style="color:#000000;"&gt; supplier &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;As&lt;/span&gt;&lt;span style="color:#000000;"&gt; Supplier)
        Console.WriteLine(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Supplier {0} {1}&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, supplier.SupplierId, supplier.Name)
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;End Sub&lt;/span&gt;&lt;span style="color:#000000;"&gt;

&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;End Module&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Es un extension method: un método que se puede definir para las instancias de una clase, fuera de la misma definición de la clase. En CSharp, vimos que se usaban clases estáticas. Acá se utilizan módulos. Para que el método fuera de extensión, en CSharp se colocaba un this adornando al primer parámetro. Acá se usa el atributo &lt;strong&gt;&amp;lt;Extension()&amp;gt;&lt;/strong&gt; al método, un atributo que está en el namespace &lt;strong&gt;System.Runtime.CompilerServices&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Ya vendrá otro post con otras características.&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=1219299" 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></item></channel></rss>