<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-3367264543642289030</id><updated>2015-02-05T15:03:54.579-08:00</updated><category term="ASP"/><category term="Model"/><category term="Interfaces"/><category term="Arquitectura"/><category term="Entity Framework"/><category term="Controller"/><category term="LINQ"/><category term="MVC"/><category term="Patrones"/><category term="View"/><category term="ViewModels"/><category term=".NET"/><category term="n-Capas"/><category term="Generics"/><category term="Patron"/><category term="Patron Repositorio"/><category term="Capas"/><category term="DRY"/><category term="EF"/><category term="HTTP"/><category term="Web Forms"/><category term="C#"/><category term="CRUD"/><category term="HTML"/><category term="IEnumerable"/><category term="Repositorio"/><category term="Yield"/><category term="API"/><category term="Clase Abstracta"/><category term="Cohesion"/><category term="DataAnnotations"/><category term="Dependency Injection"/><category term="Empresiones Lambda"/><category term="JavaScript"/><category term="MVC 3"/><category term="Martin Fowler"/><category term="Partial View"/><category term="SoC"/><category term="Buddy Class"/><category term="Builder Pattern"/><category term="Domain Model"/><category term="Factory Pattern"/><category term="Iterator"/><category term="JQuery"/><category term="LAMBDA"/><category term="List"/><category term="Membership"/><category term="Microsoft"/><category term="Patron Unidad de trabajo"/><category term="Reflection"/><category term="SQL"/><category term="Scott Guthrie"/><category term="Singleton"/><category term="VB"/><category term="ViewEngine"/><category term="XML"/><category term="ASP.NET_SessionId"/><category term="Acoplamiento"/><category term="ActionResult"/><category term="Automatic Binding"/><category term="CSS"/><category term="DataBase-Driven"/><category term="Diseño"/><category term="EntityConnection"/><category term="Enum"/><category term="Facade Pattern"/><category term="Helpers"/><category term="HttpContext"/><category term="ICloneable"/><category term="JSON"/><category term="KISS"/><category term="LINQ2SQL"/><category term="Metodos de extension"/><category term="Model-Driven"/><category term="NBuilder"/><category term="NHibernate"/><category term="Ninject"/><category term="NuGet"/><category term="Partial"/><category term="Partial Class"/><category term="Reglas de Negocio"/><category term="Reglas de Validación"/><category term="Ruby on rails"/><category term="Rutas"/><category term="Silverlight"/><category term="Tipos anonimos"/><category term="Using"/><category term="Visual Studio"/><category term="anti-pattern"/><category term="2013"/><category term="ADO"/><category term="ASPXAUTH"/><category term="ActionInvoker"/><category term="Attribute"/><category term="AuthorizationFilter"/><category term="AuthorizeAttribute"/><category term="Bibliotecas"/><category term="CSRF"/><category term="Command Pattern"/><category term="Comments"/><category term="Compilar"/><category term="Composite Pattern"/><category term="Content"/><category term="Create"/><category term="DAAB"/><category term="DI"/><category term="DTO"/><category term="Data Access Application Block"/><category term="Delete"/><category term="Details"/><category term="Dictionary"/><category term="Django"/><category term="DropDownList"/><category term="EDM"/><category term="Edit"/><category term="EntityModelCodeGenerator"/><category term="Estandares"/><category term="Fiddler"/><category term="Fragilidad"/><category term="Friend"/><category term="GET"/><category term="Herencia"/><category term="HtmlHelpers"/><category term="Http Handler"/><category term="IComparable"/><category term="Implicit"/><category term="Index"/><category term="Informix"/><category term="Ingenuidad"/><category term="Internal"/><category term="Inyeccion de Dependencia"/><category term="Logger Pattern"/><category term="MSDN"/><category term="MVP"/><category term="MemberwiseClone"/><category term="Merb"/><category term="Meta Data Class"/><category term="ModelSate"/><category term="Modelbinder"/><category term="MonoRail"/><category term="MustInherits"/><category term="MySql"/><category term="NameSpace"/><category term="Nerd Dinner"/><category term="OOP"/><category term="OWASP"/><category term="Opaco"/><category term="Oracle"/><category term="POCO"/><category term="POO"/><category term="POST"/><category term="Paquetes"/><category term="PostBack"/><category term="Private"/><category term="Progress"/><category term="Prototype Pattern"/><category term="Public"/><category term="RAZOR"/><category term="Random"/><category term="Refactorizar"/><category term="RefreshMode"/><category term="Repeticion"/><category term="ResultFilter"/><category term="Rigidez"/><category term="Route"/><category term="Scaffolding"/><category term="Scripts"/><category term="Sealed"/><category term="Seguridad"/><category term="Service Locator"/><category term="Shadows"/><category term="Shared"/><category term="Sniffer"/><category term="Software"/><category term="Sort"/><category term="Spaghetti Code"/><category term="State Pattern"/><category term="Store Procedures"/><category term="Strategy Pattern"/><category term="Struts"/><category term="T4MVC"/><category term="Throw New Exception"/><category term="Try...Catch"/><category term="UX"/><category term="Unidades de testeo"/><category term="User Experince"/><category term="VAR"/><category term="ValidationAttribute"/><category term="ValidationSummary"/><category term="ViewData"/><category term="ViewState"/><category term="Vistas Parciales"/><category term="Workflow"/><category term="XSFR"/><category term="YAGNI"/><category term="fluent"/><category term="servicios"/><title type='text'>Arquitectura de software en ASP.NET  WebForms y MVC</title><subtitle type='html'>El poder del código solo es completo, si tenemos el conocimiento de como usarlo.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://msaspnetmvc2.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3367264543642289030/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://msaspnetmvc2.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/3367264543642289030/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>jose ojeda</name><uri>https://plus.google.com/101071729884870810170</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/--xIfvUuN_Vg/AAAAAAAAAAI/AAAAAAAAmFs/5nf-iRGa4Vg/s512-c/photo.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>101</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3367264543642289030.post-5229840905192346187</id><published>2015-02-05T15:03:00.001-08:00</published><updated>2015-02-05T15:03:54.589-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="fluent"/><category scheme="http://www.blogger.com/atom/ns#" term="MVC"/><category scheme="http://www.blogger.com/atom/ns#" term="NHibernate"/><category scheme="http://www.blogger.com/atom/ns#" term="NuGet"/><category scheme="http://www.blogger.com/atom/ns#" term="Patron"/><category scheme="http://www.blogger.com/atom/ns#" term="Patron Unidad de trabajo"/><category scheme="http://www.blogger.com/atom/ns#" term="Patrones"/><category scheme="http://www.blogger.com/atom/ns#" term="Repositorio"/><category scheme="http://www.blogger.com/atom/ns#" term="servicios"/><category scheme="http://www.blogger.com/atom/ns#" term="XML"/><title type='text'>nHibernate y MVC.</title><content type='html'>&lt;p align=&quot;justify&quot;&gt;En este momento no recuerdo cuanto tiempo ha pasado desde que deje de usar los Stored Procedures con el ADO como mecanismo de persistencia, solo sé que al descubrir el EF mi mundo cambio. Con el EF podía usar los SP pero ya no era la única forma de acceder a los datos. &lt;p align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh6.ggpht.com/-MVHvkthQPzg/VNP2wv68MBI/AAAAAAAAoaA/jnLsfn8jmvc/s1600-h/image%25255B3%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh4.ggpht.com/-ikwm9BAKp3E/VNP2xgtiidI/AAAAAAAAoaI/F-AyiAiD1Bk/image_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;658&quot; height=&quot;361&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;Desde que empecé a trabajar con MVC descubrí el nHibernate, pero me resistía a cambiar nuevamente. Recientemente al incursionar en la versión 5 del MVC decidí darle la oportunidad y ver que podía ofrecerme… &lt;p align=&quot;justify&quot;&gt;&amp;nbsp; &lt;h4 align=&quot;justify&quot;&gt;&lt;/h4&gt; &lt;div align=&quot;justify&quot;&gt; &lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;/div&gt; &lt;h4 align=&quot;justify&quot;&gt;Que es nHibernate?&lt;/h4&gt; &lt;p align=&quot;justify&quot;&gt;Es un ORM o mapeador relacional de objetos, (con sus siglas en ingles). Nos ofrece un mecanismo sencillo de mapear entidades de dominio (objetos) con tablas en una base de datos, donde cada registro representa una entidad. El objetivo principal de esta biblioteca es liberarnos de la carga de codificar una y otra vez líneas para lograr la persistencia de los datos que contienen los objetos de nuestra aplicación. &lt;p align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh5.ggpht.com/-Bem2oNX3NH4/VNP2yVd05pI/AAAAAAAAoaQ/p56USHwHUwE/s1600-h/image%25255B7%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh5.ggpht.com/-xRwPvgS2Bms/VNP2zHIV8gI/AAAAAAAAoaY/gV15em_Dl3w/image_thumb%25255B3%25255D.png?imgmax=800&quot; width=&quot;663&quot; height=&quot;215&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;Desde luego además del mapeo, obtenemos mecanismos de consulta que en combinación con los mecanismos de persistencia, hacen que nHibernate sea una muy versátil y robusta solución para trabajar con datos, disminuyendo el margen de errores de codificación. &lt;p align=&quot;justify&quot;&gt;&amp;nbsp; &lt;h4 align=&quot;justify&quot;&gt;Arquitectura.&lt;/h4&gt; &lt;p align=&quot;justify&quot;&gt;Lo primero que llamo mi atención fue su arquitectura, ya que promueve la separación de partes (SOC) favorece el uso de patrones como el de la unidad de trabajo y el de Factory. Además emplea las mejores prácticas para aspectos como la configuración, el mapeo, la carga de datos y el cache de los mismos. &lt;p align=&quot;justify&quot;&gt;Si lo comparamos con el EF podemos decir que el objeto principal contiene el modelo, la configuración y además es la unidad de trabajo; por lo tanto no resulta tan liviano a la hora de usarlo como su contra parte nHibernate. &lt;p align=&quot;justify&quot;&gt;&amp;nbsp; &lt;h4 align=&quot;justify&quot;&gt;La solución a nuestros problemas.&lt;/h4&gt; &lt;p align=&quot;justify&quot;&gt;Una vez que empecé a usar este Framework, pude confirmar que es la solución para la terrible carga de escribir el código de persistencia de datos en cada proyecto, que además podría incluso llegar a representar un cuarto o un tercio del tiempo de programación de todo el proyecto, pero sobre todo este código requiere depuración y testeo cada vez que hacemos algún cambio; con nHibernate esta parte ha sido superada casi en su totalidad. &lt;p align=&quot;justify&quot;&gt;Lo más impresionante es la rapidez con la que podemos hacer modificaciones en la base de datos que con algunas líneas queda completamente adaptado, con un mínimo o nada de testeo. &lt;p align=&quot;justify&quot;&gt;&amp;nbsp; &lt;h4 align=&quot;justify&quot;&gt;Como trabaja?&lt;/h4&gt; &lt;p align=&quot;justify&quot;&gt;Se trata de un motor de persistencia y consultas; o sea se encarga de crear, actualizar y eliminar registros, así como de hacer consultas y mantener en cache los más recientes datos leídos de la base de datos. &lt;p align=&quot;justify&quot;&gt;Esto significa que al escribir nuestro código, usaremos propiedades sin tener que preocuparnos de hacer las traducciones en ambos sentidos, nHibernate envía o recupera la información, logrando que resulte muy sencillo y seguro para nosotros. &lt;p align=&quot;justify&quot;&gt;&amp;nbsp; &lt;h4 align=&quot;justify&quot;&gt;El modelo.&lt;/h4&gt; &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;&lt;i&gt;nHibernate&lt;/i&gt;&lt;/b&gt; nos ofrece dos enfoques para trabajar con él: &lt;ul&gt; &lt;li&gt; &lt;div align=&quot;justify&quot;&gt;Centrado en datos: empieza con el modelo desde la base de datos y crea los objetos.&lt;/div&gt;&lt;/li&gt; &lt;li&gt; &lt;div align=&quot;justify&quot;&gt;Centrado en objetos: empieza con el modelo desde las clases y crea las tablas.&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p align=&quot;justify&quot;&gt;Como ya debemos saber, el modelo de datos, no siempre coincide con el modelo de clases y viceversa. Cada enfoque presentara ciertos detalles que requerirán de nuestra intervención para lograra que se acoplen uno sobre el otro. &lt;p align=&quot;justify&quot;&gt;Yo prefiero el modelo centrado en los datos, o sea empiezo por diseñar la base de datos y a partir de esta creo los objetos y la descripción del mapeo que se requerirá. &lt;p align=&quot;justify&quot;&gt;&amp;nbsp; &lt;h4 align=&quot;justify&quot;&gt;Integración con MVC.&lt;/h4&gt; &lt;p align=&quot;justify&quot;&gt;&lt;b&gt;&lt;i&gt;nHibernate&lt;/i&gt;&lt;/b&gt; encuentra una arquitectura ideal cuando se trata de MVC; su presencia se limitara al ámbito del Model. La configuración se realiza una sola vez en el proceso de carga de la aplicación; la conexión se abrirá al momento de recibir una solicitud y se cierra cuando el controller responde y la solicitud termina. &lt;p align=&quot;justify&quot;&gt;En la arquitectura de mis aplicaciones empleo las siguientes clases dentro del Model: &lt;ul&gt; &lt;li&gt; &lt;div align=&quot;justify&quot;&gt;&lt;b&gt;Servicios&lt;/b&gt;: Estas clases se encargan de recibir las instrucciones del Controller y a su vez se comunican con los repositorios.&lt;/div&gt;&lt;/li&gt; &lt;li&gt; &lt;div align=&quot;justify&quot;&gt;&lt;b&gt;Repositorios&lt;/b&gt;: Estas clases son las que interactúan con &lt;b&gt;&lt;i&gt;nHibernate&lt;/i&gt;&lt;/b&gt; y se encargan de la persistencia y las consultas.&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p align=&quot;justify&quot;&gt;La unidad de trabajo (la transacción) se crea a nivel de los servicios, esto me permite propagar una transacción entre varios repositorios, con una sola instrucción final. La comunicación entre las clases de las diferentes capas es limpia y muy fácil de implementar. Tal vez la única parte que podría parecernos complicada sea la configuración inicial, ya que el mecanismo original se realiza con XML. &lt;p align=&quot;justify&quot;&gt;&amp;nbsp; &lt;h4 align=&quot;justify&quot;&gt;XML o Fluent?.&lt;/h4&gt; &lt;p align=&quot;justify&quot;&gt;El mapeo más estable y robusto del nHibernate es el que se hace usando XML, pero resulta muy complicado y no es validado por el compilador; en cambio si usamos el mecanismo Fluent podemos realizar declaraciones fuertemente tipificadas que son muy fáciles de entender y que además el compilador puede verificar; sin embargo este mecanismo aun no cubre todos los aspectos de asociación y de mapeo que podemos realizar usando el XML. &lt;p align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh4.ggpht.com/-iWmIcqVYsSY/VNP2zzuJ8gI/AAAAAAAAoag/POPUpVsfsFs/s1600-h/image%25255B11%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh4.ggpht.com/-lgWjX5_mJi8/VNP20llGLMI/AAAAAAAAoao/7jS4B-Hj5_M/image_thumb%25255B5%25255D.png?imgmax=800&quot; width=&quot;646&quot; height=&quot;296&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;Sin embargo la buena noticia es que se encuentra en vías de desarrollo, por lo que pronto resultara ser el complemento perfecto para esta tecnología. &lt;p align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh3.ggpht.com/-H3m1SOxDGIw/VNP21WC6ZfI/AAAAAAAAoaw/Dvll3G7Nk6E/s1600-h/image%25255B15%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh5.ggpht.com/-mKSHvU4Gngw/VNP22DB18lI/AAAAAAAAoa4/xOofqFKAQbU/image_thumb%25255B7%25255D.png?imgmax=800&quot; width=&quot;645&quot; height=&quot;202&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;La biblioteca Fluent-nHibernate nos ofrece una alternativa a la manera standard usando XML. Nuestro código resultara más fácil al momento de refactorizar, mas fácil de leer y mucho mas conciso que si usamos el XML. &lt;p align=&quot;justify&quot;&gt;&amp;nbsp; &lt;h4 align=&quot;justify&quot;&gt;Como la podemos obtener?&lt;/h4&gt; &lt;p align=&quot;justify&quot;&gt;Para usar este método, será necesario instalar además del nHibernate la biblioteca fluent-nHibernate, esto resulta muy fácil a través de &lt;a href=&quot;http://msaspnetmvc2.blogspot.mx/2015/02/que-es-nuget.html&quot; target=&quot;_blank&quot;&gt;NuGet&lt;/a&gt;.. &lt;p align=&quot;justify&quot;&gt;Después será necesario realizar dos pasos: &lt;ol&gt; &lt;li&gt; &lt;div align=&quot;justify&quot;&gt;Debemos hacer es añadir la palabra &lt;b&gt;&lt;i&gt;virtual&lt;/i&gt;&lt;/b&gt; a las propiedades que definen nuestras entidades, con esto permitimos que estas propiedades puedan ser sobre escritas en una clase derivada.&lt;/div&gt;&lt;/li&gt; &lt;li&gt; &lt;div align=&quot;justify&quot;&gt;Debemos crear una clase que reciba el mismo nombre que nuestra entidad, pero que termine con la palabra MAP, esta clase debe heredar de la clase ClassMap&amp;lt;T&amp;gt; donde T es el tipo de nuestra entidad.&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt; &lt;p align=&quot;justify&quot;&gt;En futuros artículos les explicare con ejemplos como codificarlo, en este momento lo importante es que comprendan los conceptos relacionados.&lt;/p&gt; &lt;h4 align=&quot;justify&quot;&gt;Comentario final.&lt;/h4&gt; &lt;p align=&quot;justify&quot;&gt;He cambiado el EF por el nHibernate y siento que mi programación es más rápida, mi código es más estable, los cambios al nivel de la base de datos, no son problema y suelen hacerse con tres líneas de código por cada campo que añadamos. &lt;p align=&quot;justify&quot;&gt;Con nHibernate (y un generador de código que cree para esta arquitectura) solo debo enfocarme en el código de negocios que es el más importante, ya que la persistencia es muy tediosa. &lt;p&gt;Suerte.      </content><link rel='replies' type='application/atom+xml' href='http://msaspnetmvc2.blogspot.com/feeds/5229840905192346187/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://msaspnetmvc2.blogspot.com/2015/02/nhibernate-y-mvc.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3367264543642289030/posts/default/5229840905192346187'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3367264543642289030/posts/default/5229840905192346187'/><link rel='alternate' type='text/html' href='http://msaspnetmvc2.blogspot.com/2015/02/nhibernate-y-mvc.html' title='nHibernate y MVC.'/><author><name>jose ojeda</name><uri>https://plus.google.com/101071729884870810170</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/--xIfvUuN_Vg/AAAAAAAAAAI/AAAAAAAAmFs/5nf-iRGa4Vg/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/-ikwm9BAKp3E/VNP2xgtiidI/AAAAAAAAoaI/F-AyiAiD1Bk/s72-c/image_thumb%25255B1%25255D.png?imgmax=800" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3367264543642289030.post-8238203434210699203</id><published>2015-02-04T10:35:00.001-08:00</published><updated>2015-02-04T10:35:09.471-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="2013"/><category scheme="http://www.blogger.com/atom/ns#" term="Bibliotecas"/><category scheme="http://www.blogger.com/atom/ns#" term="NuGet"/><category scheme="http://www.blogger.com/atom/ns#" term="Paquetes"/><category scheme="http://www.blogger.com/atom/ns#" term="Visual Studio"/><title type='text'>Que es NuGet?</title><content type='html'>&lt;p&gt;Es una plataforma que surgió como un mecanismo para que los usuarios de Visual Studio pudieran actualizarse y obtener paquetes de código de rápida y fácil integración. &lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/-IAUwdVoUMVU/VNJmAzSS1bI/AAAAAAAAoX4/tR5S0w2HxkQ/s1600-h/image%25255B3%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.ggpht.com/-QwVfevusMdY/VNJmDd3nPWI/AAAAAAAAoYA/ExvaNJ8PBUk/image_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;659&quot; height=&quot;498&quot;&gt;&lt;/a&gt; &lt;p&gt;La primera versión surgió para el VS 2010, para la versión 2012 de VS se ofrecía como una extensión pre instalada, en la versión 2013 se incluyo como parte del producto con soporte. Hoy vamos a descubrir que nos puede ofrecer… &lt;p&gt;&amp;nbsp; &lt;h4&gt;&lt;/h4&gt; &lt;a name=&#39;more&#39;&gt;&lt;/a&gt; &lt;h4&gt;Entonces que es NuGet?&lt;/h4&gt; &lt;p&gt;De tras de esta plataforma podemos encontrar toda una comunidad de programadores que comparten sus bibliotecas para enriquecer nuestra experiencia de desarrollo con .NET y Visual Studio. Nos ofrece una interface de administración y una ventana de consola de comandos. &lt;p&gt;Cuando creamos un proyecto por ejemplo en MVC podemos acceder a la herramienta y actualizar todos los scripts y bibliotecas que hayan sido actualizados después de que se libero el software; con lo cual tendremos una aplicación menos propensa a presentar errores. En escancia podemos obtener nuevas bibliotecas en línea y/o podemos actualizar las que ya tenemos instaladas para tener la versión más reciente. Interesante verdad? &lt;p&gt;&amp;nbsp; &lt;h4&gt;Cuidado.&lt;/h4&gt; &lt;p&gt;Pero no todo es bueno con respecto a la posibilidad de tener siempre la versión más actual. Por ejemplo: supongan que han desarrollado una biblioteca para uno de sus proyectos y que esta biblioteca tiene referencias a bibliotecas que descargaron de NuGet. &lt;p&gt;Esto quiere decir que tu código tiene referencia a una versión determinada de dicha biblioteca programada por un tercero y que cualquier proyecto donde desees emplear tu biblioteca, debe tener las misma versión de esa biblioteca o de lo contrario se presentaran problemas a la hora de compilar/ejecutar tu programa. &lt;p&gt;Además las nuevas versión pueden tener modificaciones que eliminen un método o mecanismo que la versión que referenciamos para uso de nuestra biblioteca emplea, lo que ocasionaría que nuestra biblioteca ya no funcionaria con esta nueva versión y tendríamos que volver a la etapa de codificación, para asegurarnos que todo funcione adecuadamente. &lt;p&gt;&amp;nbsp; &lt;h4&gt;Código descontinuado.&lt;/h4&gt; &lt;p&gt;Con esta plataforma sucede lo mismo que sucede con el Visual Studio. Conforme se actualizan las versiones del Framework, todos estos paquetes y bibliotecas se van actualizando para que puedan ser empleadas en las nuevas versiones del VS. &lt;blockquote&gt; &lt;p&gt;Esto inevitablemente mueve a todos hacia las nuevas versiones, lo que ocasiona que la plataforma en algún momento considere obsoleto nuestro código, si no nos hemos actualizado con cada nueva versión del VS. En este momento la versión 3 del Nuget, ya no soporta el código de la versión 2010 del VS. &lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;A pesar que por el momento podemos usar la versión 2.8 de la plataforma, lo cierto es que algunas nuevas funcionalidades que ofrece la versión 3.0 no serán accesibles para quienes usen la versión anterior. &lt;p&gt;&amp;nbsp; &lt;h4&gt;Configuración de NuGet en VS 2013.&lt;/h4&gt; &lt;p&gt;Para la versión 2013 de VS, Microsoft ha incluido una sección dentro de las opciones de configuración en Herramientas/Opciones y de ahí a Administrador de paquetes. &lt;p&gt;&lt;a href=&quot;http://lh3.ggpht.com/-TOkAX9wYOPo/VNJmF0g12WI/AAAAAAAAoYI/TpQPLIcmHUU/s1600-h/image%25255B35%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.ggpht.com/-oA37c7kF4k0/VNJmHdHzTgI/AAAAAAAAoYQ/0gL8kCfoSRM/image_thumb%25255B16%25255D.png?imgmax=800&quot; width=&quot;639&quot; height=&quot;356&quot;&gt;&lt;/a&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.ggpht.com/-bryINpWdcQQ/VNJmMbw36pI/AAAAAAAAoYY/SD_Ei0Q3DNU/s1600-h/image%25255B7%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh6.ggpht.com/-p9oVoTxsMaQ/VNJmNdhWIUI/AAAAAAAAoYc/LT2aUbiFd44/image_thumb%25255B3%25255D.png?imgmax=800&quot; width=&quot;634&quot; height=&quot;424&quot;&gt;&lt;/a&gt; &lt;p&gt;Para acceder a la herramienta deben ir al menú Herramientas/ Administrador de paquetes NuGet y ahí se abrirá un sub menú con varias opciones. &lt;p&gt;&lt;a href=&quot;http://lh6.ggpht.com/-fE9GmEW2LqI/VNJmOHN3r_I/AAAAAAAAoYo/WqvxCozr3Aw/s1600-h/image%25255B11%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh4.ggpht.com/-VS_IWl3mTQU/VNJmPIZRicI/AAAAAAAAoYs/FOP86E_apOA/image_thumb%25255B5%25255D.png?imgmax=800&quot; width=&quot;648&quot; height=&quot;334&quot;&gt;&lt;/a&gt; &lt;ol&gt; &lt;li&gt;&lt;b&gt;Package Manager Console&lt;/b&gt;: Abre una ventana con una interface tipo consola, por medio de la cual podemos interactuar usando comandos.&lt;/li&gt; &lt;li&gt;&lt;b&gt;Manage NuGet Package for Solution&lt;/b&gt;: Abre una ventana para instalar o desinstalar paquetes a nivel de la solución. &lt;/li&gt; &lt;li&gt;&lt;b&gt;Package Visualizer&lt;/b&gt;: Abre una ventana donde podemos ver las relaciones de las bibliotecas de manera visual.&lt;/li&gt; &lt;li&gt;&lt;b&gt;Package manager Setting&lt;/b&gt;: Abre la misma ventana que abre Herramientas/Opciones.&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;&amp;nbsp; &lt;h4&gt;Como Administrar los paquetes en un proyecto.&lt;/h4&gt; &lt;p&gt;&lt;b&gt;Actualizar.&lt;/b&gt; &lt;p&gt;Inmediatamente después de crear el proyecto usando una plantilla de VS, deben hacer clic con el botón derecho sobre el nodo de Referencias y acceder a la opción Manage NuGet Packages… &lt;p&gt;&lt;a href=&quot;http://lh3.ggpht.com/-vETr-zoTjFs/VNJmP6oV0_I/AAAAAAAAoY4/Wlnhn_UY_XM/s1600-h/image%25255B19%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh5.ggpht.com/-V0G3KAg9O-U/VNJmRaJF1UI/AAAAAAAAoY8/YV4yAigvIsE/image_thumb%25255B8%25255D.png?imgmax=800&quot; width=&quot;652&quot; height=&quot;325&quot;&gt;&lt;/a&gt; &lt;p&gt;Cuando se abra la ventana localicen el nodo Updates y se presentaran todas las actualizaciones que podan descargar.  &lt;p&gt;&lt;a href=&quot;http://lh3.ggpht.com/-ryb-dMIwwrc/VNJmR5WdHKI/AAAAAAAAoZI/sMdHHaz7klw/s1600-h/image%25255B23%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh6.ggpht.com/-MmyAB9ts3-s/VNJmSus9KZI/AAAAAAAAoZQ/E58Orn0BZog/image_thumb%25255B10%25255D.png?imgmax=800&quot; width=&quot;650&quot; height=&quot;435&quot;&gt;&lt;/a&gt; &lt;p&gt;&lt;b&gt;Instalar.&lt;/b&gt; &lt;p&gt;Clic con el botón derecho sobre el nodo de Referencias y acceder a la opción Manage NuGet Packages… &lt;p&gt;Cuando se abra la ventana localicen el nodo OnLine y se presentaran todas las bibliotecas que podan descargar.  &lt;p&gt;&lt;a href=&quot;http://lh5.ggpht.com/-Gk3jAZkTZOE/VNJmTZExgnI/AAAAAAAAoZY/Sdb6Wdma1Vo/s1600-h/image%25255B27%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.ggpht.com/-KOwUVAv9cDI/VNJmUl_-T9I/AAAAAAAAoZg/oS8_amypjxE/image_thumb%25255B12%25255D.png?imgmax=800&quot; width=&quot;659&quot; height=&quot;441&quot;&gt;&lt;/a&gt; &lt;p&gt;&lt;b&gt;Desinstalar.&lt;/b&gt; &lt;p&gt;Clic con el botón derecho sobre el nodo de Referencias y acceder a la opción Manage NuGet Packages… &lt;p&gt;Cuando se abra la ventana localicen el nodo Installed Packages y se presentaran todas las bibliotecas que podan desinstalar.  &lt;p&gt;&lt;a href=&quot;http://lh5.ggpht.com/-6Ruo48d_uhA/VNJmV3zPwNI/AAAAAAAAoZo/g5eU5ojSK8A/s1600-h/image%25255B31%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh5.ggpht.com/-6ibb0hJFkHM/VNJmW4JToZI/AAAAAAAAoZw/NIw7ECCPIvY/image_thumb%25255B14%25255D.png?imgmax=800&quot; width=&quot;650&quot; height=&quot;435&quot;&gt;&lt;/a&gt; &lt;p&gt;&amp;nbsp; &lt;h4&gt;Como tener éxito.&lt;/h4&gt; &lt;p&gt;No se si sea posible de otra forma, aquí les voy a comentar sobre mi experiencia usando esta plataforma y como logro aprovechar sus beneficios sin resultar afectado con las actualizaciones. &lt;ol&gt; &lt;li&gt;Cuando crea un nuevo proyecto, actualizo las versiones que trae la plantilla de Visual Studio antes de empezar a codificar y no las vuelvo a actualizar para este proyecto, a menos que sea necesario.&lt;/li&gt; &lt;li&gt;Si creó una biblioteca para mis proyectos y decido incluir algún paquete descargado de NuGet, creó una carpeta donde conservo las versiones que he usado y me aseguro que los proyectos que usen mi biblioteca, referencien estas bibliotecas en vez de descargar la versión más reciente.&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;&amp;nbsp; &lt;h4&gt;Comentario Final.&lt;/h4&gt; &lt;p&gt;Espero que este artículo les sea de utilidad, es el primero de esta nueva etapa, ya que en futuros artículos usaremos bibliotecas descargadas de esta plataforma.  &lt;p&gt;Suerte.         </content><link rel='replies' type='application/atom+xml' href='http://msaspnetmvc2.blogspot.com/feeds/8238203434210699203/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://msaspnetmvc2.blogspot.com/2015/02/que-es-nuget.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3367264543642289030/posts/default/8238203434210699203'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3367264543642289030/posts/default/8238203434210699203'/><link rel='alternate' type='text/html' href='http://msaspnetmvc2.blogspot.com/2015/02/que-es-nuget.html' title='Que es NuGet?'/><author><name>jose ojeda</name><uri>https://plus.google.com/101071729884870810170</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/--xIfvUuN_Vg/AAAAAAAAAAI/AAAAAAAAmFs/5nf-iRGa4Vg/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/-QwVfevusMdY/VNJmDd3nPWI/AAAAAAAAoYA/ExvaNJ8PBUk/s72-c/image_thumb%25255B1%25255D.png?imgmax=800" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3367264543642289030.post-5136161747335475607</id><published>2013-02-01T09:39:00.001-08:00</published><updated>2013-02-01T09:39:44.259-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term=".NET"/><category scheme="http://www.blogger.com/atom/ns#" term="Arquitectura"/><category scheme="http://www.blogger.com/atom/ns#" term="ASP"/><category scheme="http://www.blogger.com/atom/ns#" term="HTML"/><category scheme="http://www.blogger.com/atom/ns#" term="HTTP"/><category scheme="http://www.blogger.com/atom/ns#" term="MVC 3"/><title type='text'>Por qué MVC?</title><content type='html'>&lt;p align=&quot;justify&quot;&gt;Tal vez aun sigan cuestionandose por que motivo vale la pena aprender MVC, asi que voy a tratar de darles algunos buenos motivos que les respondan a estas dudas. &lt;p align=&quot;justify&quot;&gt;Aun tal vez la razón mas importante sea que ante lo que ocurrió en el mundo exterior en todas las plataformas web que surgieron, las aplicaciones ASP.NET tradicionales lucen anticuadas y limitadas. &lt;p align=&quot;justify&quot;&gt;MVC surgió como respuesta a todas las críticas que recibió la plataforma ASP.NET y para poder ofrecernos a los antiguos clientes, forma de participar en las nuevas corrientes. &lt;p align=&quot;justify&quot;&gt;&amp;nbsp; &lt;div align=&quot;justify&quot;&gt; &lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;/div&gt; &lt;h4 align=&quot;justify&quot;&gt;Diferenciar MVC tradicional del Framework de Microsoft.&lt;/h4&gt; &lt;p align=&quot;justify&quot;&gt;El patrón MVC no es nuevo, fue creado en los laboratorios de Xerox en 1978, con un lenguaje denominado SmallTalk. &lt;p align=&quot;justify&quot;&gt;El patrón es muy simple: Se trata de un ciclo natural, el usuario solicita una acción y como respuesta la aplicación cambia su modelo de datos y actualiza una vista para el usuario. Desde luego si partimos de esta idea es muy fácil entender por qué se amolda perfectamente a un entorno web sobre HTTP. &lt;p align=&quot;justify&quot;&gt;Si lo vemos desde el punto de vista de una aplicación, esta necesitara la combinación de tecnologías como bases de datos, HTML, código ejecutable, recursos gráficos, etc. &lt;p align=&quot;justify&quot;&gt;El diseño del framework de MVC se llevo a cabo mediante la creación de componentes independientes, clases base abstractas, factorys. &lt;p align=&quot;justify&quot;&gt;Esto nos permite crear aplicaciones desde tres diferentes opciones: &lt;ol&gt; &lt;li&gt; &lt;div align=&quot;justify&quot;&gt;La implementación Default.&lt;/div&gt;&lt;/li&gt; &lt;li&gt; &lt;div align=&quot;justify&quot;&gt;Derivación de las clases mediante sub clases para tomar el control de algún comportamiento.&lt;/div&gt;&lt;/li&gt; &lt;li&gt; &lt;div align=&quot;justify&quot;&gt;Reemplazar por completo un componente, mediante una interface o clase abstracta.&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt; &lt;p align=&quot;justify&quot;&gt;&amp;nbsp; &lt;h4 align=&quot;justify&quot;&gt;Control sobre HTML y HTTP.&lt;/h4&gt; &lt;p align=&quot;justify&quot;&gt;ASP.NET MVC refuerza la creación de código limpio, que cumpla standards, por ese motivo los HTML Helpers nos ofrecen todo el control que se requiere. &lt;p align=&quot;justify&quot;&gt;Aquellos acostumbrados a los controles de ASP, extrañaran la presencia de objetos listos para ser usados, pero después de un breve lapso de adaptación podrán implementar y reutilizar bibliotecas como Jquery y si son mas aventurados podrán crear sus propias implementaciones usando JavaScript con una muy fácil integración con el modelo. &lt;p align=&quot;justify&quot;&gt;Al trabajar sobre HTTP MVC nos ofrece un completo control sobre las solicitudes, las respuestas y el paso de datos; AJAX se integra de forma natural a las aplicaciones MVC. &lt;p align=&quot;justify&quot;&gt;&amp;nbsp; &lt;h4 align=&quot;justify&quot;&gt;Ok, entonces quien debería usar ASP.NET MVC?&lt;/h4&gt; &lt;p align=&quot;justify&quot;&gt;Desde luego mi opinión podría parecer comprometida, sin embargo tratare de ser objetivo: &lt;p align=&quot;justify&quot;&gt;Si lo comparamos con ASP.NET web Froms, podemos repetir todo lo que previamente se ha dicho y de qué forma MVC los supera, pero creo que la mejor forma es dándole crédito a las palabras de los voceros de Microsoft que afirman que ASP.NET Web Forms no está muerto y que aun cumple con su objetivo en entornos más controlados y menos demandantes, como podrían ser aplicaciones de intranet. &lt;p align=&quot;justify&quot;&gt;Mientras que MVC nos ofrece un entorno moderno para desarrollar aplicaciones en Internet, con la suficiente fortaleza para responder a los requerimientos actuales de las diferentes plataformas. Puesto que su baja demanda del ancho de banda, su eficiente respuesta, su compatibilidad con más navegadores y dispositivos lo hacen ideal para proyectos en ese entorno. &lt;p align=&quot;justify&quot;&gt;&amp;nbsp; &lt;h4 align=&quot;justify&quot;&gt;Comentario Final.&lt;/h4&gt; &lt;p align=&quot;justify&quot;&gt;Después de tanto tiempo sin publicar creo que es importante retomar desde sus bases todo lo que hemos publicado, para hacer una especie de repaso, aun que en esta ocasión estoy profundizando un poco mas que al principio, para que valga la pena volver a leerlo si antes ya lo habían hecho. &lt;p align=&quot;justify&quot;&gt;Suerte.&lt;/p&gt;  </content><link rel='replies' type='application/atom+xml' href='http://msaspnetmvc2.blogspot.com/feeds/5136161747335475607/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://msaspnetmvc2.blogspot.com/2013/02/por-que-mvc.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3367264543642289030/posts/default/5136161747335475607'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3367264543642289030/posts/default/5136161747335475607'/><link rel='alternate' type='text/html' href='http://msaspnetmvc2.blogspot.com/2013/02/por-que-mvc.html' title='Por qué MVC?'/><author><name>jose ojeda</name><uri>https://plus.google.com/101071729884870810170</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/--xIfvUuN_Vg/AAAAAAAAAAI/AAAAAAAAmFs/5nf-iRGa4Vg/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3367264543642289030.post-3970027501993553169</id><published>2013-01-31T07:26:00.001-08:00</published><updated>2013-01-31T07:26:32.789-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Arquitectura"/><category scheme="http://www.blogger.com/atom/ns#" term="ASP"/><category scheme="http://www.blogger.com/atom/ns#" term="CSS"/><category scheme="http://www.blogger.com/atom/ns#" term="HTML"/><category scheme="http://www.blogger.com/atom/ns#" term="HTTP"/><category scheme="http://www.blogger.com/atom/ns#" term="JavaScript"/><category scheme="http://www.blogger.com/atom/ns#" term="JQuery"/><category scheme="http://www.blogger.com/atom/ns#" term="MVC 3"/><category scheme="http://www.blogger.com/atom/ns#" term="Silverlight"/><category scheme="http://www.blogger.com/atom/ns#" term="XML"/><title type='text'>Recapitulemos.</title><content type='html'>&lt;p align=&quot;justify&quot;&gt;Versiones van y versiones vienen, sin embargo el framework de MVC se ha superado en cada entrega, aun que actualmente se encuentra en la versión 4; (y ya estos jugando con ella) debo confesarles que aun estoy trabajando con la versión 3.&lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;Recientemente le impartí un curso a unos cliente, que han sido acérrimos seguidores del ASP y que como es natural se habían resistido a voltear la mirada. Por fin lo han hecho, este articulo es el tema de introducción que les presente el primer día…&lt;/p&gt; &lt;div align=&quot;justify&quot;&gt; &lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;/div&gt; &lt;h4 align=&quot;justify&quot;&gt;1.- Que es MVC de Microsoft?&lt;/h4&gt; &lt;p align=&quot;justify&quot;&gt;Es un framework que combina la efectividad de la arquitectura MVC y las mejores técnicas del desarrollo ágil. Es la mejor alternativa para las aplicaciones web de ASP. &lt;p align=&quot;justify&quot;&gt;&amp;nbsp; &lt;h4 align=&quot;justify&quot;&gt;2.- Evolución de la plataforma web de Microsoft.&lt;/h4&gt; &lt;p align=&quot;justify&quot;&gt;CGI: Un código simple pero que consumía grandes cantidades de recursos del sistema operativo. &lt;p align=&quot;justify&quot;&gt;IDG: Corría dentro del servidor web cuyo único beneficio consistía en simplificar las consultas SQL y las respuestas. &lt;p align=&quot;justify&quot;&gt;ASP: Surgen en 1996, fueron creadas para escribir código de propósito general, aun que su principal debilidad consistía en ser código interpretado al tiempo de ejecución, su peor cara consistía en la forma de escribir el código, ya que favorecía el código spaguetti. &lt;p align=&quot;justify&quot;&gt;ASP.NET Web Forms 1.0: Fue entre 2002 y 2003 que Microsoft presento una mejora a las paginas activas, mediante aplicaciones de código compilado, con interfaces con control de estado, con una infraestructura más amplia y que reforzaba la POO. Sin embargo en la operación diaria, resultaba en aplicaciones muy pesadas para anchos de banda pequeños, con código HTML poco elegante y que no podían ser testables. &lt;p align=&quot;justify&quot;&gt;Las mejoras se dieron a nivel del framework en 2005 con la versión 2.0 y en 2007 con la inclusión del AJAX, por último la versión 3.5 del framework en 2008. &lt;p align=&quot;justify&quot;&gt;Fue en 2009 que Microsoft publico la versión 1.0 de MVC, con una propuesta muy interesante pero que rompía todos los paradigmas de programación ASP conocidos hasta el momento; en 2010 se publico una segunda versión mucho mas solida para un avido grupo de entusuastas programadores que encontraron en MVC una forma fresca de escribir aplicaciones Web. En 2011 se publico la versión 3.0 del MVC con un completo conjunto de características, funcionalidades y técnicas para solucionar todas las carencias de las versiones anteriores. &lt;p align=&quot;justify&quot;&gt;En este momento ya se ha publicado la nueva versión 4.0 del MVC, sin embargo la versión 3.0 sigue siendo la más estable. &lt;p align=&quot;justify&quot;&gt;&amp;nbsp; &lt;h4 align=&quot;justify&quot;&gt;El paradigma ASP&lt;/h4&gt; &lt;p align=&quot;justify&quot;&gt;La idea detrás de la plataforma ASP consistía en ocultarle a los programadores el código HTML, asi como evitarle tener que aprender a lidiar con un protocolo (HTTP) que no permitía conservar un estado entre envíos de datos, mediante un sofisticado entramado que simulaba el ambiente de escritorio en aplicaciones web. &lt;p align=&quot;justify&quot;&gt;&amp;nbsp; &lt;h4 align=&quot;justify&quot;&gt;Que está mal en ASP?&lt;/h4&gt; &lt;p align=&quot;justify&quot;&gt;El peso del View State: Una cadena de bytes que se transfiere entre el cliente y el servidor, haciendo muy lenta la experiencia de los usuarios. &lt;p align=&quot;justify&quot;&gt;Extremadamente complicado ciclo de vida de una página: Para poder soportar la ilusión de estar conectado al servidor, el ciclo de creación y vida de una página web es muy complicado, lo que ocasiona misteriosos fallos en algunos eventos. &lt;p align=&quot;justify&quot;&gt;Modelo cohesivo: El archivo denominado code behind, crea una falsa sensación de separación de partes, con la única idea de poder tener en un archivo la parte HTML y en el otro el código que manipula los controles y la conexión de datos, lo que ocasiona un código monstruoso, frágil y en ocasiones ilegible. &lt;p align=&quot;justify&quot;&gt;Control limitado sobre el código HTML: Los controles de servidor se convierten a sí mismos en código HTML, aun que no es siempre el código que nosotros necesitamos, este código presenta problemas con los CSS, y todo tipo de estándares web. Incluso resulta muy complejo acceder a el código HTML generado usando Javascript. &lt;p align=&quot;justify&quot;&gt;&amp;nbsp; &lt;h4 align=&quot;justify&quot;&gt;Desarrollo web moderno.&lt;/h4&gt; &lt;p align=&quot;justify&quot;&gt;Para aquellos que no son seguidores de Microsoft el desarrollo web creció rápida y progresivamente y tomo múltiples y muy divergentes direcciones. &lt;p align=&quot;justify&quot;&gt;El reto más recurrente es la necesidad de escribir aplicaciones que puedan ser capaces de corren en diferentes navegadores e incluso diferentes dispositivos; con múltiples estándares que se deben cumplir para HTML, CSS, JavaScript, etc. &lt;p align=&quot;justify&quot;&gt;La arquitectura más frecuente que se emplea para soportar la interacción sobre HTTP, se denomina REST (Representational State Transfer), la cual dejo en las sombras la propuesta de Microsoft denominada SOAP, que se emplea para los servicios web. &lt;p align=&quot;justify&quot;&gt;Para REST la aplicación se describe en términos de recursos disponibles, como por ejemplo podemos PUT un nuevo producto o DELETE un cliente. &lt;p align=&quot;justify&quot;&gt;Los requerimientos de plataformas cruzadas, navegadores y dispositivos, obligan a las aplicaciones a servir los datos en diversos formatos como Json y XML, que pueden ser aprovechados por las tecnologías existentes, como AJAX, Silverlight, iOS, Android, etc.  &lt;p align=&quot;justify&quot;&gt;Estos nuevos escenarios no pueden ser atendidos de forma exitosa por las ASP.NET Web Forms. &lt;p align=&quot;justify&quot;&gt;Comentario Final. &lt;p align=&quot;justify&quot;&gt;Debo disculparme con todos los lectores de este Blog, puesto que los he tenido muy abandonados; el trabajo y mi pasatiempo (la fotografía) me han absorbido mucho desde el año pasado, sin embargo siempre veo que los seguidores aumentan en facebook y por ese motivo voy a hacer un esfuerzo por actualizarlo mas seguido. &lt;p align=&quot;justify&quot;&gt;Espero que les haya parecido interesante. &lt;p&gt;Suerte.&lt;/p&gt;  </content><link rel='replies' type='application/atom+xml' href='http://msaspnetmvc2.blogspot.com/feeds/3970027501993553169/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://msaspnetmvc2.blogspot.com/2013/01/recapitulemos.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3367264543642289030/posts/default/3970027501993553169'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3367264543642289030/posts/default/3970027501993553169'/><link rel='alternate' type='text/html' href='http://msaspnetmvc2.blogspot.com/2013/01/recapitulemos.html' title='Recapitulemos.'/><author><name>jose ojeda</name><uri>https://plus.google.com/101071729884870810170</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/--xIfvUuN_Vg/AAAAAAAAAAI/AAAAAAAAmFs/5nf-iRGa4Vg/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3367264543642289030.post-3987688251964438017</id><published>2012-10-05T14:13:00.001-07:00</published><updated>2012-10-05T14:14:38.383-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term=".NET"/><category scheme="http://www.blogger.com/atom/ns#" term="C#"/><category scheme="http://www.blogger.com/atom/ns#" term="MVC"/><category scheme="http://www.blogger.com/atom/ns#" term="Patrones"/><category scheme="http://www.blogger.com/atom/ns#" term="Silverlight"/><category scheme="http://www.blogger.com/atom/ns#" term="Web Forms"/><title type='text'>Análisis del Plan de capacitación para un equipo de desarrollo</title><content type='html'>&lt;h4&gt;Introducción.&lt;/h4&gt;&lt;div align=&quot;justify&quot;&gt;Cuando se habla de capacitación para un equipo de desarrollo, siempre surge la preocupación sobre si tendrá el impacto que queremos sobre las habilidades de nuestra gente. No es un secreto que los cursos de capacitación tienen el contenido necesario para poder sentar las bases y que a partir de ese nuevo conocimiento se pueda desarrollar un conjunto de habilidades necesarias para actualizarnos. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Sin embargo esto no es lo que necesitan la mayoría de las empresas, ya que el personal debe ausentarse de la oficina y atrasarse en sus proyectos, para poder participar en los cursos. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Los equipos de desarrollo necesitan actualizarse, esa es una realidad; pero necesitan una alternativa que les permita aprender al mismo tiempo que son productivos, desarrollando nuevas habilidades tecnológicas, que les permitan ser competitivos. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt; &lt;br /&gt;&lt;h4 align=&quot;justify&quot;&gt;Por que aprender C#?.&lt;/h4&gt;&lt;div align=&quot;justify&quot;&gt;Para poder atender las necesidades actuales del área de sistemas, se recomienda llevar a cabo un proceso de preparación en lenguaje C#. Al aprender a codificar en este lenguaje, podremos abrir la posibilidad de incursionar en nuevas tecnologías que les permitirán cubrir aspectos como: &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;1. Páginas Web con el patrón MVC. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;2. SilverLight. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;3. Desarrollo de aplicaciones para dispositivos como: &lt;/div&gt;&lt;blockquote&gt;&lt;div align=&quot;justify&quot;&gt;a. WP7&lt;/div&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;div align=&quot;justify&quot;&gt;b. Android&lt;/div&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;div align=&quot;justify&quot;&gt;c. iOS&lt;/div&gt;&lt;/blockquote&gt;&lt;div align=&quot;justify&quot;&gt;Aun que es posible codificar las dos primeras tecnologías empleando VB, no sucede lo mismo para poder incursionar en los dispositivos móviles multi plataforma. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;El debate que aun existe sobre si C# es mejor lenguaje que VB, fue uno de los motivos por los cuales tarde mucho tiempo en aprenderlo; sin embargo hoy en día, una vez que me he familiarizado con su sintaxis y forma de hacer las cosas, puedo decirles que me resulta más sencillo de codificar, además que he encontrado algunas características que no son tan sencillas de lograr usando el VB.  &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Pero el argumento más importante es que si aprenden C#, podrán desarrollar aplicaciones que puedan correr en diferentes plataformas, con muy pocos detalles particulares de cada una de estas.  &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&amp;nbsp; &lt;/div&gt;&lt;h4 align=&quot;justify&quot;&gt;Porque aprender MVC?&lt;/h4&gt;&lt;div align=&quot;justify&quot;&gt;Desde su aparición entre las plataformas de Microsoft hace algunos años, ha existido la duda entre quienes programan con el paradigma ASP, si deberían migrar al paradigma MVC. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;El modelo de WebForms de ASP.NET es una gran mentira. Nada de lo que se hace usando este modelo tiene algo que ver con el entorno Web. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Surgió en una idea equivocada, que pretendía que los programadores de computadora familiarizados con el estilo de programación de Microsoft en aplicaciones Windows, pudieran trasladar sus habilidades y conocimientos a la web, con muy poco esfuerzo de su parte. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;El internet trabaja mediante un protocolo denominado HTTP, y trabaja enviando paginas en HTML, es algo que debemos saber y aceptar, para poder incursionar en el verdadero desarrollo de aplicaciones web. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;MVC nos ofrece un completo control sobre la generación del HTML que será enviado a los clientes; nos permite extender las funcionalidades y establece los lineamientos para que hagamos nuestro trabajo dentro de estándares y patrones bien definidos y probados; MVC nos ofrece una arquitectura solida, que harán nuestro código más eficiente y fácil de mantener. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&amp;nbsp; &lt;/div&gt;&lt;h4 align=&quot;justify&quot;&gt;Por que aprender Silverlight?&lt;/h4&gt;&lt;div align=&quot;justify&quot;&gt;Aun que no existe un orden de precedencia con respecto a aprender MVC y después Silverlight, creo que si partimos del grado de complejidad y de innovaciones a las que se debe enfrentar un programador que incursiona por primera vez en estas tecnologías, entonces el segundo paso –después de aprender C#- seria aprender MVC y una vez que se sientan seguros avanzar hacia el Expression Studio. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Si dentro de nuestras metas se encuentra llegar a desarrollar aplicaciones para dispositivos móviles, que puedan ser desarrollas con la visión de reutilización desde el principio, entonces no podemos pasar por alto aprender este paradigma de desarrollo. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&amp;nbsp; &lt;/div&gt;&lt;h4 align=&quot;justify&quot;&gt;Y después que sigue?&lt;/h4&gt;&lt;div align=&quot;justify&quot;&gt;Una vez que hayan avanzado en estas tecnologías y se sientan a gusto con los nuevos conceptos que se deberán asimilar, estarán listos para dar el último paso: Desarrollo de aplicaciones Multi plataforma. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;A pesar que hasta el final aprenderemos a programar para diferentes plataformas, la idea del curso consiste en avanzar desde la capacitación en C#, para llevar al equipo de desarrollo al siguiente nivel, que consiste en consolidar los conocimientos que adquirieron. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Repasaremos y consolidaremos conceptos, patrones y modelos de desarrollo como: &lt;/div&gt;&lt;ul&gt;&lt;li&gt; &lt;div align=&quot;justify&quot;&gt;Entidades.&lt;/div&gt;&lt;/li&gt;&lt;li&gt; &lt;div align=&quot;justify&quot;&gt;Extensiones.&lt;/div&gt;&lt;/li&gt;&lt;li&gt; &lt;div align=&quot;justify&quot;&gt;ViewModels&lt;/div&gt;&lt;/li&gt;&lt;li&gt; &lt;div align=&quot;justify&quot;&gt;Repositorios.&lt;/div&gt;&lt;/li&gt;&lt;li&gt; &lt;div align=&quot;justify&quot;&gt;Servicios y APIs.&lt;/div&gt;&lt;/li&gt;&lt;li&gt; &lt;div align=&quot;justify&quot;&gt;Esquemas de seguridad.&lt;/div&gt;&lt;/li&gt;&lt;li&gt; &lt;div align=&quot;justify&quot;&gt;Reutilización de código.&lt;/div&gt;&lt;/li&gt;&lt;li&gt; &lt;div align=&quot;justify&quot;&gt;Helpers.&lt;/div&gt;&lt;/li&gt;&lt;li&gt; &lt;div align=&quot;justify&quot;&gt;Http web response.&lt;/div&gt;&lt;/li&gt;&lt;li&gt; &lt;div align=&quot;justify&quot;&gt;Entre muchos otros.&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div align=&quot;justify&quot;&gt;&amp;nbsp; &lt;/div&gt;&lt;h4 align=&quot;justify&quot;&gt;Proyecto de capacitación.&lt;/h4&gt;&lt;div align=&quot;justify&quot;&gt;Creo que si empezamos el plan de capacitación como parte del desarrollo de un proyecto real, que pueda irse construyendo poco a poco, sin la urgencia de tener una fecha límite, los participantes, podrán asimilar las tecnologías sin sentir la presión de un proyecto critico. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Independientemente del esquema que decidan aplicar para este proceso de capacitación, yo les recomiendo aprovechar el proceso para realizar el repaso de todas las etapas del desarrollo de un sistema, ya que de esta forma tendrían la oportunidad de opinar sobre aquello que sería mejor para el proyecto con una visión como la que hemos platicado en este articulo. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&amp;nbsp; &lt;/div&gt;&lt;h4 align=&quot;justify&quot;&gt;Cometario final.&lt;/h4&gt;&lt;div align=&quot;justify&quot;&gt;El área de sistemas de una empresa siempre se encuentra en el dilema de atender a sus clientes o sacrificar los resultados para poder mantenerse actualizado. Un sistema de capacitación que les permita crear algo útil para la empresa mientras se capacitan es la solución más apropiada.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://msaspnetmvc2.blogspot.com/feeds/3987688251964438017/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://msaspnetmvc2.blogspot.com/2012/10/analisis-del-plan-de-capacitacion-para.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3367264543642289030/posts/default/3987688251964438017'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3367264543642289030/posts/default/3987688251964438017'/><link rel='alternate' type='text/html' href='http://msaspnetmvc2.blogspot.com/2012/10/analisis-del-plan-de-capacitacion-para.html' title='Análisis del Plan de capacitación para un equipo de desarrollo'/><author><name>jose ojeda</name><uri>https://plus.google.com/101071729884870810170</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/--xIfvUuN_Vg/AAAAAAAAAAI/AAAAAAAAmFs/5nf-iRGa4Vg/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3367264543642289030.post-6831823744307580389</id><published>2011-11-14T09:23:00.001-08:00</published><updated>2012-10-05T14:14:03.042-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="API"/><category scheme="http://www.blogger.com/atom/ns#" term="ASP"/><category scheme="http://www.blogger.com/atom/ns#" term="Capas"/><category scheme="http://www.blogger.com/atom/ns#" term="MVP"/><category scheme="http://www.blogger.com/atom/ns#" term="n-Capas"/><title type='text'>MVP en ASP.NET usando Entity Framework (3 de 3)</title><content type='html'>&lt;div align=&quot;justify&quot;&gt;Puede parecer muy ingrato de parte de nuestros usuarios, pero a ellos solo les interesa que nuestra aplicación sea fácil de manejar, rápida y que no tenga errores. Todo lo que hagamos en las capas que ellos no ven, no tiene importancia, mientras no falle… &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Crear una interface que sea fácil de usar y que sea intuitiva (termino de moda) resulta en muchas horas de programación, para dejarla a punto… &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;/div&gt;&lt;h2 align=&quot;justify&quot;&gt;Introducción&lt;/h2&gt;&lt;div align=&quot;justify&quot;&gt;En esta ocasión no voy a hacer ningún ejemplo donde les ofrezca técnicas de programación para esta capa, usando JQuery, AJAX, HTML5 o alguna otra de moda, simplemente voy a simplificar esta relación con las capas inferiores, para que su trabajo sea más fácil y puedan aprovechar esas horas sobrantes a esta capa tan demandante. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&amp;nbsp; &lt;/div&gt;&lt;h2 align=&quot;justify&quot;&gt;Tutorial&lt;/h2&gt;&lt;div align=&quot;justify&quot;&gt;Vamos a continuar en el proyecto web que creamos en la primera parte de este ejemplo. Recuerden que nuestro objetivo desde que empezamos esta serie de ejemplos, es que nuestras WebForms no tengan en control de la aplicación, trasladar ese control hacia las capas inferiores, más estables, de forma no cohesiva. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Hasta el momento tenemos nuestra API lista en el otro proyecto y ahora debemos conectar los cables para que las cosas fluyan. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Para este patrón empezaremos por crear una interface, que debemos colocar dentro de la carpeta interfaces que se encuentra dentro de la carpeta Presentación, como se muestra a continuación: &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh4.ggpht.com/-QMpeTb6EobA/TsFOWlXA7jI/AAAAAAAAGQ0/TlgnelnHqs0/s1600-h/mvpentity29%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;mvpentity29&quot; border=&quot;0&quot; height=&quot;167&quot; src=&quot;http://lh3.ggpht.com/-XP09orUSTtQ/TsFOXFCRa6I/AAAAAAAAGQ8/SlYtYGhUrAg/mvpentity29_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;mvpentity29&quot; width=&quot;226&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Esta interface tiene como objetivo establecer un estándar en todas las formas que creemos, de tal forma que el método Display siempre este ahí: &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh6.ggpht.com/-ZTFy-xLUzLE/TsFOXrDChmI/AAAAAAAAGRE/_CD-ypdWjSo/s1600-h/mvpentity30%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;mvpentity30&quot; border=&quot;0&quot; height=&quot;122&quot; src=&quot;http://lh3.ggpht.com/-QtpSOa-8ku4/TsFOYHilRPI/AAAAAAAAGRM/dt2xvBOFECo/mvpentity30_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;mvpentity30&quot; width=&quot;244&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Creen una carpeta llamada Administración y dentro agreguen un formulario llamado frmHomeEmpresas: &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh5.ggpht.com/-B5DUx-LvlZA/TsFOYuvdjiI/AAAAAAAAGRU/m_vTCK2VFqY/s1600-h/mvpentity31%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;mvpentity31&quot; border=&quot;0&quot; height=&quot;191&quot; src=&quot;http://lh4.ggpht.com/-AXNZEkpuwlM/TsFOZMzODgI/AAAAAAAAGRc/Rf8LdFDPnFs/mvpentity31_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;mvpentity31&quot; width=&quot;226&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;En el fuente del diseñador agregaremos este código: &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh3.ggpht.com/-1w6mzvywsj8/TsFOZ25qn5I/AAAAAAAAGRk/CSXFkLnVAHI/s1600-h/mvpentity32%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;mvpentity32&quot; border=&quot;0&quot; height=&quot;244&quot; src=&quot;http://lh3.ggpht.com/-nVN6Q50TVJY/TsFOaYKMyEI/AAAAAAAAGRs/UVMWykxLGXg/mvpentity32_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;mvpentity32&quot; width=&quot;149&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;En el codebehind agregaremos nuestra interface para que nuestro formulario web la deba implementar: &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh6.ggpht.com/-rKa1k99VQ-I/TsFOa9al9_I/AAAAAAAAGR0/ztDoyjbH594/s1600-h/mvpentity33%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;mvpentity33&quot; border=&quot;0&quot; height=&quot;44&quot; src=&quot;http://lh3.ggpht.com/-ltNloSRiYI4/TsFObaOA1-I/AAAAAAAAGR8/7cdGcbdjliQ/mvpentity33_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;mvpentity33&quot; width=&quot;244&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Nuestro código necesita una clase que se encargue de la interacción con nuestra biblioteca de clases, la cual crearemos en una carpeta llamada Presentadores, dentro de Presentación: &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh3.ggpht.com/-W_yZ8BxXiOQ/TsFOcubXc3I/AAAAAAAAGSE/S4JshpvVjGY/s1600-h/mvpentity34%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;mvpentity34&quot; border=&quot;0&quot; height=&quot;168&quot; src=&quot;http://lh4.ggpht.com/--kGLuxoYPao/TsFOdS7ph2I/AAAAAAAAGSM/vCmUCZtHIHA/mvpentity34_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;mvpentity34&quot; width=&quot;232&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;El código debe ofrecer un método Display y un constructor que reciba la interface que creamos previamente: &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh3.ggpht.com/-IUwewTlPigM/TsFOd9wWpeI/AAAAAAAAGSU/fdZ2EtEyvYk/s1600-h/mvpentity37%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;mvpentity37&quot; border=&quot;0&quot; height=&quot;244&quot; src=&quot;http://lh4.ggpht.com/-uHIMTrt--5E/TsFOeYHlRnI/AAAAAAAAGSc/R8BgfEF_xIU/mvpentity37_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;mvpentity37&quot; width=&quot;224&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Observen como se crea la instancia de nuestro Servicio, no es necesario crear una instancia de la clase ServiceLocator, solo se requiere tener una referencia a la biblioteca. Otro aspecto interesante a notar en este presentador, es la forma en que se formatean los datos que se enviaran a la UI. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;De regreso a nuestro CodeBehind, este sería el código que debemos agregar: &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh4.ggpht.com/-SIuSXlnhmsY/TsFOfCRS4sI/AAAAAAAAGSk/jttE26lRUAY/s1600-h/mvpentity35%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;mvpentity35&quot; border=&quot;0&quot; height=&quot;185&quot; src=&quot;http://lh3.ggpht.com/-2JIDIy1CEJU/TsFOfi-7QYI/AAAAAAAAGSs/NKoAZmKboPM/mvpentity35_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;mvpentity35&quot; width=&quot;244&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Observen como se envía como parámetro a nuestro constructor la misma forma que lo está creando, esto es posible por la implementación de nuestra interface. Presten atención a la forma en que se controla la presentación en el Load. Y por último la implementación del método Display de la interface y la propiedad MensajeError. El método display recibe una lista de empresas, que el presentador le envía, nuevamente esto es posible porque en el constructor se envió el formulario, y el método Display es parte de esta. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Ahora ejecútenlo y podrán ver las empresas que hayan agregado a su tabla de la base de datos. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh6.ggpht.com/-U4zh8NOoEYU/TsFOgC_0PmI/AAAAAAAAGS0/PbqalGwhQ5o/s1600-h/mvpentity36%25255B3%25255D.jpg&quot;&gt;&lt;img alt=&quot;mvpentity36&quot; border=&quot;0&quot; height=&quot;145&quot; src=&quot;http://lh6.ggpht.com/-MZmhw1CfY0A/TsFOgo_yd9I/AAAAAAAAGS8/xR3QLUyn38I/mvpentity36_thumb%25255B1%25255D.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;mvpentity36&quot; width=&quot;586&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;h2 align=&quot;justify&quot;&gt;Comentario Final&lt;/h2&gt;&lt;div align=&quot;justify&quot;&gt;Los patrones pueden ser un poco irracionales al principio, sobre todo si estamos implementando algo que nos cambia el paradigma; sin embargo una vez que logramos entender lo que se persigue, se convierte en un proceso repetitivo, el cual nos garantiza que si seguimos por ese medio, no será necesario reinventar nuestro código cada vez. &lt;/div&gt;Y recuerden: El poder del código solo es completo, si tenemos el conocimiento de cómo usarlo.           &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://msaspnetmvc2.blogspot.com/feeds/6831823744307580389/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://msaspnetmvc2.blogspot.com/2011/11/mvp-en-aspnet-usando-entity-framework-3.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3367264543642289030/posts/default/6831823744307580389'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3367264543642289030/posts/default/6831823744307580389'/><link rel='alternate' type='text/html' href='http://msaspnetmvc2.blogspot.com/2011/11/mvp-en-aspnet-usando-entity-framework-3.html' title='MVP en ASP.NET usando Entity Framework (3 de 3)'/><author><name>jose ojeda</name><uri>https://plus.google.com/101071729884870810170</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/--xIfvUuN_Vg/AAAAAAAAAAI/AAAAAAAAmFs/5nf-iRGa4Vg/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/-XP09orUSTtQ/TsFOXFCRa6I/AAAAAAAAGQ8/SlYtYGhUrAg/s72-c/mvpentity29_thumb.jpg?imgmax=800" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3367264543642289030.post-5488530779285623149</id><published>2011-11-11T08:59:00.000-08:00</published><updated>2011-11-11T08:59:35.881-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="API"/><category scheme="http://www.blogger.com/atom/ns#" term="Builder Pattern"/><category scheme="http://www.blogger.com/atom/ns#" term="Capas"/><category scheme="http://www.blogger.com/atom/ns#" term="Cohesion"/><category scheme="http://www.blogger.com/atom/ns#" term="Dependency Injection"/><category scheme="http://www.blogger.com/atom/ns#" term="Domain Model"/><category scheme="http://www.blogger.com/atom/ns#" term="Entity Framework"/><category scheme="http://www.blogger.com/atom/ns#" term="Generics"/><category scheme="http://www.blogger.com/atom/ns#" term="Interfaces"/><category scheme="http://www.blogger.com/atom/ns#" term="LINQ"/><category scheme="http://www.blogger.com/atom/ns#" term="Patrones"/><title type='text'>MVP en ASP.NET usando Entity Framework (2 de 3)</title><content type='html'>&lt;div align=&quot;justify&quot;&gt;En un artículo que publique en Marzo de este año, hable del patrón &lt;b&gt;&lt;a href=&quot;http://msaspnetmvc2.blogspot.com/2011/03/service-locator.html&quot; target=&quot;_blank&quot;&gt;Service Locator&lt;/a&gt;&lt;/b&gt;, en ese entonces les presente un ejemplo cuyo contexto podía parecer un poco forzado o abstracto, en esta ocasión usaremos el mismo patrón para nuestro ejemplo de MVP. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Y veremos de qué forma interactuar con el proyecto de presentación… &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;/div&gt;&lt;h4 align=&quot;justify&quot;&gt;Casamiento por Separación de bienes.&lt;/h4&gt;&lt;div align=&quot;justify&quot;&gt;Cada quien lo suyo. Cuando se crea una aplicación que debe interactuar con el usuario, para ser alimentada por este, es normal pensar que la estructura de las tablas, representa los datos que el usuario ve en las UI; esto nos lleva a usar mecanismos que hacen cohesiva nuestra UI con los datos que representan. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Aquellos datos que no debe ver el usuario los omitimos, como podrían ser los campos lave o las relaciones, pero todo lo demás si se convierte en algún control para que el usuario pueda interactuar con esta información. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;La experiencia me dará la razón, cuando tenemos que modificar algo a nivel de datos, es un terremoto de 8 en la escala de &lt;b&gt;Ritchter&lt;/b&gt;, que afecta todo nuestro desarrollo, debemos mover rápidamente lo que hemos programado, por de lo contrario la aplicación corre peligro. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&amp;nbsp; &lt;/div&gt;&lt;h4 align=&quot;justify&quot;&gt;Como podemos hacer para que la UI y las entidades no se hagan cohesivas?&lt;/h4&gt;&lt;div align=&quot;justify&quot;&gt;Es un patrón que nos permite separar el modelo de la interface de usuario. &lt;br /&gt;Desde mi muy particular punto de vista un ViewModel es una forma de organizar los datos que pertenecen a un modelo para que puedan ser presentados sin tener que exponer la entidad, incluso aun que dicha entidad no exista en la base de datos. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&amp;nbsp; &lt;/div&gt;&lt;h4 align=&quot;justify&quot;&gt;Analicemos porque existe?&lt;/h4&gt;&lt;div align=&quot;justify&quot;&gt;Según el patrón las entidades pertenecen al MODEL y contienen propiedades que pueden estar relacionadas a campos en la base de datos o simplemente ser propiedades que no existen en la base de datos y que sirven para la lógica de la aplicación. Entonces cuando debemos enviar los datos al View, puede resultar pesado enviar una entidad del MODEL donde hay información de más.  &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh3.ggpht.com/-ZEQh_Dozu5o/Tr1T4BqZ5UI/AAAAAAAAGEM/gOPeE9guBnM/s1600-h/mvpentity16%25255B3%25255D.jpg&quot;&gt;&lt;img alt=&quot;mvpentity16&quot; border=&quot;0&quot; height=&quot;149&quot; src=&quot;http://lh4.ggpht.com/-x7Ca2iBwfKk/Tr1T4qhI_II/AAAAAAAAGEU/MSP6l9UZvxc/mvpentity16_thumb%25255B1%25255D.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;mvpentity16&quot; width=&quot;433&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Eso no es todo, para que resulte más complejo, cuando estamos creando un View resulta que se deben enviar algunos datos que ni son de la base de datos, ni son propiedades de ninguna entidad, por lo tanto no se emplean para uso de la lógica de negocios; son propiedades que deben existir para poder representar los datos apropiadamente en la View y no tienen sentido para nadie más.&amp;nbsp; &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&amp;nbsp; &lt;/div&gt;&lt;h4 align=&quot;justify&quot;&gt;Doble trabajo?&lt;/h4&gt;&lt;div align=&quot;justify&quot;&gt;Podría parecernos doble trabajo, sobre todo si estamos acostumbrados a la forma que comentamos al principio, pero a la larga si usamos ViewModels en vez de las entidades, lograremos separar adecuadamente las responsabilidades de cada parte. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&amp;nbsp; &lt;/div&gt;&lt;h4 align=&quot;justify&quot;&gt;Continuación&lt;/h4&gt;&lt;div align=&quot;justify&quot;&gt;Así que dicho lo anterior, vamos a empezar por crear nuestro primer ViewModel, para la empresa, por lo que deben crear una carpeta llamada ViewModels dentro de la carpeta model y agregar la siguiente clase dentro: &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh3.ggpht.com/-M-LQ5UuGq04/Tr1T5WAknwI/AAAAAAAAGEc/AFvIbyD_Bag/s1600-h/mvpentity17%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;mvpentity17&quot; border=&quot;0&quot; height=&quot;218&quot; src=&quot;http://lh6.ggpht.com/-oBUXzqyfcqA/Tr1T6qKqasI/AAAAAAAAGEk/vKlVDwWiW30/mvpentity17_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;mvpentity17&quot; width=&quot;244&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Si comparan la estructura de datos con la tabla que creamos en el articulo previo, podrán ver que no hemos incluido todos los campos, simplemente usaremos los que se necesitan para llevar la información a nivel de la capa del UI. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&amp;nbsp; &lt;/div&gt;&lt;h2 align=&quot;justify&quot;&gt;Como movemos los datos de las entidades hacia el ViewModel?&lt;/h2&gt;&lt;div align=&quot;justify&quot;&gt;Si han comprendido lo que estamos haciendo, entonces la pregunta que use como sub titulo de este párrafo, es la más obvia para hacer en este momento.  &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Si han llegado hasta aquí, entonces sus entidades residen dentro de un archivo de código que acompaña al Model: &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh5.ggpht.com/-cCiAS7s7eT4/Tr1T7DHz9tI/AAAAAAAAGEs/XBbj9AAdWRs/s1600-h/mvpentity18%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;mvpentity18&quot; border=&quot;0&quot; height=&quot;80&quot; src=&quot;http://lh5.ggpht.com/-kdKkI2Z6NHg/Tr1T7qaZnkI/AAAAAAAAGE0/Znp4sU7PX_g/mvpentity18_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;mvpentity18&quot; width=&quot;226&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Este código que se genera por la herramienta, no debe ser modificado, por que la próxima vez que se compile la aplicación, podría volver a generarse y se perdería nuestro trabajo. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Para solucionar este problema contamos con los métodos de &lt;a href=&quot;http://msaspnetmvc2.blogspot.com/2011/02/metodos-de-extension.html&quot; target=&quot;_blank&quot;&gt;Extensión&lt;/a&gt;, los cuales nos permiten extender lo que ofrece una clase, sin tener que tener el código fuente; así que ahora deben crear una carpeta que llamaremos Extensions dentro del Model: &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh6.ggpht.com/-F2MkhR63jeE/Tr1T8J8A4vI/AAAAAAAAGE8/FOxf1b44rIA/s1600-h/mvpentity19%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;mvpentity19&quot; border=&quot;0&quot; height=&quot;113&quot; src=&quot;http://lh3.ggpht.com/-DDVQGgidja4/Tr1T8rL3phI/AAAAAAAAGFE/1Fk-MpcWoHY/mvpentity19_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;mvpentity19&quot; width=&quot;238&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Según la lógica que hemos comentado vamos a necesitar de dos métodos de extensión, uno para convertir una entidad empresa a un ViewModel y otro que nos permita convertir una lista de Empresas en una lista de ViewModels. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh6.ggpht.com/-0_0AOXSbLss/Tr1T9LAIGzI/AAAAAAAAGFM/KeKhrDKsIyQ/s1600-h/mvpentity20%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;mvpentity20&quot; border=&quot;0&quot; height=&quot;193&quot; src=&quot;http://lh3.ggpht.com/-hNoUUkzdbbc/Tr1T9r7fhMI/AAAAAAAAGFU/3JaybJ-h40I/mvpentity20_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;mvpentity20&quot; width=&quot;244&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh4.ggpht.com/-rE1GywMxyD0/Tr1T-TlV-cI/AAAAAAAAGFc/NiZryA116jM/s1600-h/mvpentity21%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;mvpentity21&quot; border=&quot;0&quot; height=&quot;123&quot; src=&quot;http://lh3.ggpht.com/-LuH23Lt-Q2E/Tr1T-_JqzpI/AAAAAAAAGFk/eefX7QKuNJA/mvpentity21_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;mvpentity21&quot; width=&quot;244&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Es muy importante para que funcione que se encuentren en el mismo espacio de nombres que las entidades, o sea Model. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&amp;nbsp; &lt;/div&gt;&lt;h4 align=&quot;justify&quot;&gt;Servicios&lt;/h4&gt;&lt;div align=&quot;justify&quot;&gt;El software basado en servicios, no es algo nuevo, ha sido la forma en que se desarrollan aplicaciones por mucho tiempo, en este concepto donde los datos se centralizan, y las aplicaciones solicitan al software que atienda tareas específicas. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;A gran escala hay muchos ejemplos, sin embargo en esta ocasión estamos hablando de un componente dentro de nuestra aplicación que se encargara de recibir las solicitudes para la creación controlada de los servicios, cada vez que se requiera una instancia se la solicitamos a este único servicio y este atenderá nuestras necesidades. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;De esta forma la creación de las instancias se encuentra controlada, y agregar nuevos servicios solo afecta al código de un lado de la relación. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&amp;nbsp; &lt;/div&gt;&lt;h4 align=&quot;justify&quot;&gt;Continuemos&lt;/h4&gt;&lt;div align=&quot;justify&quot;&gt;Agreguen una carpeta llamada Servicios al mismo nivel que la carpeta del Model y agreguen dentro dos capetas más denominadas, Interfaces y Services: &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh6.ggpht.com/-HOlLfWmrj4c/Tr1T_Nx4mUI/AAAAAAAAGFs/ULyaaznax8A/s1600-h/mvpentity13%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;mvpentity13&quot; border=&quot;0&quot; height=&quot;113&quot; src=&quot;http://lh4.ggpht.com/-Gh-f4sVUCXw/Tr1T_vqwpRI/AAAAAAAAGF0/Cc9h-jDzgIs/mvpentity13_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;mvpentity13&quot; width=&quot;170&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Dentro de Interfaces vamos a crear las siguientes Interfaces: &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh3.ggpht.com/-gN9-LPj7A7I/Tr1UAEo9g-I/AAAAAAAAGF8/EA6YECMiVmU/s1600-h/mvpentity14%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;mvpentity14&quot; border=&quot;0&quot; height=&quot;175&quot; src=&quot;http://lh4.ggpht.com/-Oe_yFnl9Xj4/Tr1UAynToJI/AAAAAAAAGGE/Y79sASFSrwQ/mvpentity14_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;mvpentity14&quot; width=&quot;244&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;http://lh3.ggpht.com/-JL4WhVYN3BA/Tr1UBdpQBdI/AAAAAAAAGGM/uxeSP7wZbMc/s1600-h/mvpentity15%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;mvpentity15&quot; border=&quot;0&quot; height=&quot;138&quot; src=&quot;http://lh3.ggpht.com/-WucMaiqS_zg/Tr1UBxYmGKI/AAAAAAAAGGU/UfNBq5W1L0M/mvpentity15_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;mvpentity15&quot; width=&quot;244&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Ahora vamos a crear nuestro servicio para las empresas, el cual debe quedar dentro de la carpeta services: &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh4.ggpht.com/-Qak6O2EAScc/Tr1UCulII-I/AAAAAAAAGGc/vJOFxVggLvs/s1600-h/mvpentity22%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;mvpentity22&quot; border=&quot;0&quot; height=&quot;209&quot; src=&quot;http://lh6.ggpht.com/-Lm4eoRuk2lU/Tr1UDOoYvKI/AAAAAAAAGGk/Uq_BHiBShrw/mvpentity22_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;mvpentity22&quot; width=&quot;244&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Debe implementar nuestra interface, como lo indica el recuadro rojo. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Ahora veamos el código que se encontraba oculto: &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Propiedades. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh6.ggpht.com/-igfHZmLfwhc/Tr1UDsgqSvI/AAAAAAAAGGs/uWQBCTGOQxc/s1600-h/mvpentity23%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;mvpentity23&quot; border=&quot;0&quot; height=&quot;184&quot; src=&quot;http://lh3.ggpht.com/-QcLud4RS8OE/Tr1UELx550I/AAAAAAAAGG0/6ajEFW75bX4/mvpentity23_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;mvpentity23&quot; width=&quot;244&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Inyección de dependencia: &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh3.ggpht.com/-L6YYawIP24c/Tr1UEh2bzDI/AAAAAAAAGG8/nwvIux--5MA/s1600-h/mvpentity24%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;mvpentity24&quot; border=&quot;0&quot; height=&quot;130&quot; src=&quot;http://lh3.ggpht.com/-Hbk8UsislnY/Tr1UFZRYoMI/AAAAAAAAGHE/uiG-9YKCsHQ/mvpentity24_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;mvpentity24&quot; width=&quot;244&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Método que obtiene los datos: &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh4.ggpht.com/-S9z0s5gMu6w/Tr1UGEq63wI/AAAAAAAAGHM/lGXvTGVYGlI/s1600-h/mvpentity25%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;mvpentity25&quot; border=&quot;0&quot; height=&quot;188&quot; src=&quot;http://lh4.ggpht.com/-9r6d9GBTWPY/Tr1UGjF46VI/AAAAAAAAGHU/xrSJ5ssvAg8/mvpentity25_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;mvpentity25&quot; width=&quot;244&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Observen como se emplea el método de extensión después del método GetAll el cual nos regresa una lista de empresas.&lt;/div&gt;&lt;h4 align=&quot;justify&quot;&gt;Nuestro Service Locator&lt;/h4&gt;&lt;div align=&quot;justify&quot;&gt;Para esta parte solo nos falta implementar nuestro Servicio centralizado usando el patrón de Serice Locator: &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh3.ggpht.com/--HHzJ_dNeD4/Tr1UHZfMcqI/AAAAAAAAGHc/bHqx68R_Rb4/s1600-h/mvpentity26%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;mvpentity26&quot; border=&quot;0&quot; height=&quot;244&quot; src=&quot;http://lh6.ggpht.com/-if1kmlf5YAg/Tr1UH7kt8MI/AAAAAAAAGHk/8-Nn-r2VpEw/mvpentity26_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;mvpentity26&quot; width=&quot;191&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Presten especial atención a la implementación del patrón Singleton en la parte encerrada en el recuadro rojo. El método encerrado en amarillo, se encuentra en l código auxiliar, que veremos a continuación: &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh4.ggpht.com/-6RNL6Vl3NCA/Tr1UIUMN66I/AAAAAAAAGHs/SPZK2f_XPSc/s1600-h/mvpentity27%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;mvpentity27&quot; border=&quot;0&quot; height=&quot;70&quot; src=&quot;http://lh3.ggpht.com/-7zyR1F50724/Tr1UIyOSrcI/AAAAAAAAGH0/mQF26luqpvc/mvpentity27_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;mvpentity27&quot; width=&quot;244&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;En este método se registran los servicios que puede entregar nuestra clase, que no es otra cosa, que agregar definición de instancias (ojo: no se crean en ese momento) para que sean creadas, cuando se solicite. Como lo demuestra el siguiente código: &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh6.ggpht.com/-KmJf6iLsn5o/Tr1UJlp2AaI/AAAAAAAAGH8/3H9mJEfqRz8/s1600-h/mvpentity28%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;mvpentity28&quot; border=&quot;0&quot; height=&quot;183&quot; src=&quot;http://lh6.ggpht.com/-uae5M1xh--4/Tr1UKApg3hI/AAAAAAAAGIE/LG7pU7cLWB0/mvpentity28_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;mvpentity28&quot; width=&quot;244&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Para poder llevar a cabo la tarea, de crear instancias a partir de las definiciones que hemos registrado, es necesario hacer uso de la técnica de Reflection, como se puede observar en el recuadro rojo. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;En este código deben prestar especial atención a lo que se hace en el recuadro amarillo, se verifica si ha sido creada la instancia, para que le devolvamos una referencia a la misma, en vez de crear otra nueva. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&amp;nbsp; &lt;/div&gt;&lt;h4 align=&quot;justify&quot;&gt;Continuara….&lt;/h4&gt;&lt;div align=&quot;justify&quot;&gt;&lt;b&gt;Aclaración&lt;/b&gt;: Quiero comentarles que al empezar el artículo anterior, creí que con dos podría cubrir la explicación del ejemplo, pero mientras me encontraba escribiendo este, me di cuenta, que era así, por lo que cambie el titulo del anterior y extendí un articulo mas para este ejemplo, por lo cual serán 3. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;En el próximo veremos cómo se lleva a cabo la presentación de la información en la UI. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Y recuerden: El poder del código solo es completo, si tenemos el conocimiento de cómo usarlo.&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://msaspnetmvc2.blogspot.com/feeds/5488530779285623149/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://msaspnetmvc2.blogspot.com/2011/11/mvp-en-aspnet-usando-entity-framework-2.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3367264543642289030/posts/default/5488530779285623149'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3367264543642289030/posts/default/5488530779285623149'/><link rel='alternate' type='text/html' href='http://msaspnetmvc2.blogspot.com/2011/11/mvp-en-aspnet-usando-entity-framework-2.html' title='MVP en ASP.NET usando Entity Framework (2 de 3)'/><author><name>jose ojeda</name><uri>https://plus.google.com/101071729884870810170</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/--xIfvUuN_Vg/AAAAAAAAAAI/AAAAAAAAmFs/5nf-iRGa4Vg/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/-x7Ca2iBwfKk/Tr1T4qhI_II/AAAAAAAAGEU/MSP6l9UZvxc/s72-c/mvpentity16_thumb%25255B1%25255D.jpg?imgmax=800" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3367264543642289030.post-2864445002191686475</id><published>2011-11-10T10:24:00.001-08:00</published><updated>2011-11-11T08:19:35.395-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="API"/><category scheme="http://www.blogger.com/atom/ns#" term="Builder Pattern"/><category scheme="http://www.blogger.com/atom/ns#" term="Capas"/><category scheme="http://www.blogger.com/atom/ns#" term="Cohesion"/><category scheme="http://www.blogger.com/atom/ns#" term="Dependency Injection"/><category scheme="http://www.blogger.com/atom/ns#" term="Domain Model"/><category scheme="http://www.blogger.com/atom/ns#" term="Entity Framework"/><category scheme="http://www.blogger.com/atom/ns#" term="Generics"/><category scheme="http://www.blogger.com/atom/ns#" term="Interfaces"/><category scheme="http://www.blogger.com/atom/ns#" term="LINQ"/><category scheme="http://www.blogger.com/atom/ns#" term="Patrones"/><title type='text'>MVP en ASP.NET usando Entity Framework (1 de 3)</title><content type='html'>&lt;div align=&quot;justify&quot;&gt;Ya hemos visto la arquitectura de capas basada en el patrón MVP con dos ejemplos previamente, en el &lt;a href=&quot;http://msaspnetmvc2.blogspot.com/2011/10/ejemplo-aspnet-en-capas-1-de-3.html&quot; target=&quot;_blank&quot;&gt;primero&lt;/a&gt; use LINQ to SQL para el acceso a datos, en el &lt;a href=&quot;http://msaspnetmvc2.blogspot.com/2011/11/capas-con-entidades-relacionadas-1-de-2.html&quot; target=&quot;_blank&quot;&gt;segundo&lt;/a&gt;&amp;nbsp; use ADO.NET y en esta ocasión vamos a usar el &lt;a href=&quot;http://msaspnetmvc2.blogspot.com/2011/02/entity-framework-40.html&quot; target=&quot;_blank&quot;&gt;Entity Framework&lt;/a&gt;... &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Como siempre tratando de aplicar algún patrón dentro del ejemplo… &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;/div&gt;&lt;h4 align=&quot;justify&quot;&gt;Introducción&lt;/h4&gt;&lt;div align=&quot;justify&quot;&gt;En esta ocasión vamos a hacer un cambio sobre el modelo arquitectónico que hemos estado usando, todo con la finalidad de que avancemos en la idea de crear una API reutilizable de nuestro código. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;La idea es tener una solución con dos proyectos, en el primero tendremos nuestra UI, que en este caso será Web y en el segundo la biblioteca donde tendremos nuestros servicios y el model. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;O sea el UI será la parte presentadora de nuestro patrón y la biblioteca tendrá lo demás. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&amp;nbsp; &lt;/div&gt;&lt;h4 align=&quot;justify&quot;&gt;Creación de los proyectos&lt;/h4&gt;&lt;div align=&quot;justify&quot;&gt;Creen dos proyectos dentro de una solución, uno debe ser ASP.NET Web y el otro una Biblioteca de clases, como se muestra a continuación, no creen las carpetas que ahí se ven, yo les diré cuando crearlas, por el momento solo agreguen la del Model en la biblioteca de clases. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh6.ggpht.com/-dj_Qhq7yxQc/TrwWvw3ydAI/AAAAAAAAF-Y/1FgiJGsHouo/s1600-h/mvp1%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;mvp1&quot; border=&quot;0&quot; height=&quot;244&quot; src=&quot;http://lh3.ggpht.com/-HEXE_s7hDe4/TrwWwbDtUsI/AAAAAAAAF-g/9tDQNPPtOAQ/mvp1_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;mvp1&quot; width=&quot;108&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&amp;nbsp; &lt;/div&gt;&lt;h4 align=&quot;justify&quot;&gt;Model&lt;/h4&gt;&lt;div align=&quot;justify&quot;&gt;Usando el Entity Framework podemos seguir dos caminos, el primero es crear el Model a partir de tablas en una base de datos y el segundo es crear las tablas a partir de clases existentes en nuestro proyecto, en esta ocasión vamos a usar el primero. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&amp;nbsp; &lt;/div&gt;&lt;h4 align=&quot;justify&quot;&gt;Tabla&lt;/h4&gt;&lt;div align=&quot;justify&quot;&gt;Vamos a crear una tabla para almacenar empresas, con los siguientes campos: &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh6.ggpht.com/-YXEDx5dhA08/TrwWxBXBkZI/AAAAAAAAF-o/k7dhno7Ymws/s1600-h/mvpentity4%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;mvpentity4&quot; border=&quot;0&quot; height=&quot;244&quot; src=&quot;http://lh4.ggpht.com/-D2tUZFveX8Q/TrwWxuLJJ4I/AAAAAAAAF-w/bluu8OQym3E/mvpentity4_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;mvpentity4&quot; width=&quot;134&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Después agreguen manualmente algunas empresas, para que podamos testear la consulta. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&amp;nbsp; &lt;/div&gt;&lt;h4 align=&quot;justify&quot;&gt;Entity Framework&lt;/h4&gt;&lt;div align=&quot;justify&quot;&gt;Al usar el Entity Framework para el proyecto simplificamos la codificación de nuestro Model, ya que la herramienta lo creara por nosotros, para poder concentrarnos en la parte complicada, aquí les dejo el link hacia un articulo previo donde explico cómo agregar un Model usando el &lt;a href=&quot;http://msaspnetmvc2.blogspot.com/2011/01/como-agregar-un-modelo-entity-fremework.html&quot; target=&quot;_blank&quot;&gt;Entity Framework&lt;/a&gt;, solo deben seguir esos pasos. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Coloquen el Model que creara el Entity Framework en la carpeta Model; esto lo pueden obtener, haciendo clic con el botón derecho del mouse sobre la carpeta Model, como se ve en esta grafica: &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh5.ggpht.com/-yZBJV8tADqk/TrwWyJ28mpI/AAAAAAAAF-4/OjJVS7s4MFc/s1600-h/mvpentity3%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;mvpentity3&quot; border=&quot;0&quot; height=&quot;119&quot; src=&quot;http://lh6.ggpht.com/-ZOhtibMdybs/TrwWyiFX6LI/AAAAAAAAF_A/qaOqeyDuPyU/mvpentity3_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;mvpentity3&quot; width=&quot;244&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh5.ggpht.com/-4E6xPgiUhx0/TrwWzGWQWuI/AAAAAAAAF_I/n05GiGlDwPw/s1600-h/mvpentity2%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;mvpentity2&quot; border=&quot;0&quot; height=&quot;244&quot; src=&quot;http://lh4.ggpht.com/-Nu4xSkEg9x0/TrwWznj1YVI/AAAAAAAAF_Q/R3qYdDasXLA/mvpentity2_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;mvpentity2&quot; width=&quot;168&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;h4 align=&quot;justify&quot;&gt;Contexto&lt;/h4&gt;&lt;div align=&quot;justify&quot;&gt;Estamos usando el patrón &lt;b&gt;&lt;a href=&quot;http://msaspnetmvc2.blogspot.com/search/label/Singleton&quot; target=&quot;_blank&quot;&gt;Singleton&lt;/a&gt;&lt;/b&gt;&amp;nbsp; y el patrón &lt;b&gt;&lt;a href=&quot;http://msaspnetmvc2.blogspot.com/2011/03/service-locator.html&quot; target=&quot;_blank&quot;&gt;Service Locator&lt;/a&gt;&lt;/b&gt;&amp;nbsp; para darle fortaleza a esta parte del código. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Como todo buen patrón necesitamos una Interface, la cual debe crearse dentro de la carpeta Interfaces: &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh3.ggpht.com/-wZiT1tac-AM/TrwW0FmOOOI/AAAAAAAAF_Y/kj0pt9KbpMw/s1600-h/mvpentity7%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;mvpentity7&quot; border=&quot;0&quot; height=&quot;148&quot; src=&quot;http://lh6.ggpht.com/-PERTWtoc77Q/TrwW0swzpVI/AAAAAAAAF_g/2Ij1jN3UtFg/mvpentity7_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;mvpentity7&quot; width=&quot;244&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Dentro del Model creen una carpeta que llamaremos Contexto, y dentro de esta agreguen esta clase que implementa la interface que acabamos de crear: &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh4.ggpht.com/-lT40exERBCw/TrwW1LBnaEI/AAAAAAAAF_o/i0nOlCsf5VY/s1600-h/mvpentity9%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;mvpentity9&quot; border=&quot;0&quot; height=&quot;196&quot; src=&quot;http://lh5.ggpht.com/-hT72nVDbc0A/TrwW1ttyznI/AAAAAAAAF_w/p_J0W1n2ANY/mvpentity9_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;mvpentity9&quot; width=&quot;244&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Es una forma muy simple del &lt;b&gt;Service Locator&lt;/b&gt;, solo la parte que le corresponde al &lt;b&gt;Singleton&lt;/b&gt;, simplemente verifica si no existe y lo crea, lo interesante es el uso genérico. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&amp;nbsp; &lt;/div&gt;&lt;h4 align=&quot;justify&quot;&gt;Acceso a datos&lt;/h4&gt;&lt;div align=&quot;justify&quot;&gt;Usaremos el patrón de &lt;b&gt;Repository&lt;/b&gt; que hemos ejemplificado en los otros ejemplos, para lo cual debemos crear una carpeta dentro de Model, denominada &lt;b&gt;Interfaces&lt;/b&gt; y otra denominada &lt;b&gt;Repositories&lt;/b&gt;. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;En la carpeta de Interfaces colocaremos esta interface: &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh4.ggpht.com/-9JfBW_pPMec/TrwW2Cbb4HI/AAAAAAAAF_4/ddtIEIk4W8Q/s1600-h/mvpentity5%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;mvpentity5&quot; border=&quot;0&quot; height=&quot;210&quot; src=&quot;http://lh5.ggpht.com/-gNTU8OtNll0/TrwW29XR5qI/AAAAAAAAGAA/Q1NW98QESr0/mvpentity5_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;mvpentity5&quot; width=&quot;244&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Fíjense que en el &lt;b&gt;Namespace&lt;/b&gt;, he eliminado la parte que le añade VS y que corresponde a la carpeta donde colocamos la interface, esto me permite simplificar el acceso a lo vayamos creando dentro del Model; aun que se encuentren en diferentes carpetas, para organizar mejor los archivos, en código todo aparecerá dentro del mismo espacio de nombres. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Dentro de la carpeta &lt;b&gt;Repositories&lt;/b&gt; colocaremos la clase que se encargara de la entidad empresa, la cual debe implementar nuestra interface &lt;b&gt;Repository&lt;/b&gt; y la interface del sistema &lt;b&gt;IDisposable&lt;/b&gt;, para que tengamos algo como esto: &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh3.ggpht.com/-4lcwxnzDOhI/TrwW3Sf126I/AAAAAAAAGAI/IvyfWwiEa2g/s1600-h/mvpentity6%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;mvpentity6&quot; border=&quot;0&quot; height=&quot;190&quot; src=&quot;http://lh6.ggpht.com/-L2V1jLkDroM/TrwW3566mRI/AAAAAAAAGAQ/ayDMtbGTdtI/mvpentity6_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;mvpentity6&quot; width=&quot;244&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Nuevamente observen el Espacio de nombres, subrayado en rojo; pero observen lo que está encerrado en azul, en esta línea se define una instancia de tipo IDataContext (que creamos previamente), la cual emplearemos para controlar la creación de las instancias de nuestro Model durante la ejecución de nuestra aplicación; el motivo es simple, queremos que la creación sea controlada y desde un solo punto.  &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;A continuación les voy a presentar el código que está oculto en las regiones Grises. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&amp;nbsp; &lt;/div&gt;&lt;h4 align=&quot;justify&quot;&gt;Inyección de dependencia&lt;/h4&gt;&lt;div align=&quot;justify&quot;&gt;Para asegurarnos que nuestro repositorio no sea cohesivo vamos a usar la inyección de dependencia, la cual tiene una participación muy interesante en la parte del constructor.  &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh5.ggpht.com/-MoIpiUtcQC8/TrwW4SXzgJI/AAAAAAAAGAY/1sd2mbkeWHI/s1600-h/mvpentity10%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;mvpentity10&quot; border=&quot;0&quot; height=&quot;99&quot; src=&quot;http://lh5.ggpht.com/-sjYX2w1mbmI/TrwW43qB6hI/AAAAAAAAGAg/vF5XyYCFmSE/mvpentity10_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;mvpentity10&quot; width=&quot;244&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Si observan podrán ver que hay un constructor que no recibe parámetros y hay otro que recibe una instancia de nuestra clase HttpDataContext, de esta forma podemos garantizar que si el programador que usa nuestro repositorio desea cambiar esa parte, solo deberá implementar nuestra interface y codificarla según sus necesidades, sin que esto afecte a nuestro código; si por el contrario se limita crear la instancia sin enviarle una instancia, entonces mostros nos encargamos de enviarle una nueva instancia para que sea el nuestro el que emplee. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&amp;nbsp; &lt;/div&gt;&lt;h4 align=&quot;justify&quot;&gt;Implementación del Repositorio&lt;/h4&gt;&lt;div align=&quot;justify&quot;&gt;Para esta parte usaremos LINQ ya que es una forma muy sencilla de realizar esta acción, nuestro ejemplo se limita por el momento a obtener todas las empresas que no estén de baja: &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh3.ggpht.com/-rnwLHsQsHb0/TrwW5ULRe_I/AAAAAAAAGAo/9jRc-UjfSRg/s1600-h/mvpentity11%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;mvpentity11&quot; border=&quot;0&quot; height=&quot;200&quot; src=&quot;http://lh4.ggpht.com/-uSmh188YOMM/TrwW51-EJqI/AAAAAAAAGAw/V15cTRSvq6k/mvpentity11_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;mvpentity11&quot; width=&quot;244&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&amp;nbsp; &lt;/div&gt;&lt;h4 align=&quot;justify&quot;&gt;Por último la implementación del IDisposable&lt;/h4&gt;&lt;div align=&quot;justify&quot;&gt;Este código contiene una llamada al destructor de la instancia, es la que empieza con un circunflejo: &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh3.ggpht.com/-SaXQqUTUQvQ/TrwW6j1ww2I/AAAAAAAAGA4/0D1Bc4XBJEE/s1600-h/mvpentity8%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;mvpentity8&quot; border=&quot;0&quot; height=&quot;225&quot; src=&quot;http://lh6.ggpht.com/-V1B_skbWGE0/TrwW7CRlMnI/AAAAAAAAGBA/MBoAwnUcDsI/mvpentity8_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;mvpentity8&quot; width=&quot;244&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Esta implementación es la recomendada por Microsoft, ya que nos permite realizar cualquier validación antes de llamar al método donde se solicita la participación del Garbage Collector. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&amp;nbsp; &lt;/div&gt;&lt;h4 align=&quot;justify&quot;&gt;Final de la Primera parte&lt;/h4&gt;&lt;div align=&quot;justify&quot;&gt;En este punto hemos creado todo lo que necesitamos para el acceso a los datos, en nuestro articulo de mañana vamos a crear los servicios y en el siguiente la capa de presentación, ya falta poco. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Y recuerden: El poder del código solo es completo, si tenemos el conocimiento de cómo usarlo.            &lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://msaspnetmvc2.blogspot.com/feeds/2864445002191686475/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://msaspnetmvc2.blogspot.com/2011/11/mvp-en-aspnet-usando-entity-framework-1.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3367264543642289030/posts/default/2864445002191686475'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3367264543642289030/posts/default/2864445002191686475'/><link rel='alternate' type='text/html' href='http://msaspnetmvc2.blogspot.com/2011/11/mvp-en-aspnet-usando-entity-framework-1.html' title='MVP en ASP.NET usando Entity Framework (1 de 3)'/><author><name>jose ojeda</name><uri>https://plus.google.com/101071729884870810170</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/--xIfvUuN_Vg/AAAAAAAAAAI/AAAAAAAAmFs/5nf-iRGa4Vg/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/-HEXE_s7hDe4/TrwWwbDtUsI/AAAAAAAAF-g/9tDQNPPtOAQ/s72-c/mvp1_thumb.jpg?imgmax=800" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3367264543642289030.post-6751513103271260376</id><published>2011-11-07T08:01:00.001-08:00</published><updated>2011-11-07T08:01:45.484-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="API"/><category scheme="http://www.blogger.com/atom/ns#" term="Capas"/><category scheme="http://www.blogger.com/atom/ns#" term="n-Capas"/><title type='text'>Capas con Entidades relacionadas (3 de 3 )</title><content type='html'>&lt;p align=&quot;justify&quot;&gt;Según &lt;a href=&quot;http://en.wikipedia.org/wiki/Application_programming_interface&quot; target=&quot;_blank&quot;&gt;Wikipedia&lt;/a&gt;, una API, es una interface programable de una aplicación, es un conjunto de reglas y especificaciones que facilitan la interacción con estas. Este tipo de interfaces nos permiten ofrecer la solución que lleva a cabo nuestra aplicación, para que pueda ser usada por otras aplicaciones, de una manera sencilla. &lt;p align=&quot;justify&quot;&gt;Lo que estamos haciendo al codificar nuestra aplicación usando capas para colocarlas en ASP, nos coloca en una interesante posición con respecto a las APIs; al lograr que nuestras capas no sean cohesivas, podemos prepararnos para tener nuestra propia API. &lt;div align=&quot;justify&quot;&gt; &lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;/div&gt; &lt;p align=&quot;justify&quot;&gt;8.- El éxito de esta arquitectura reside en el paso que vamos a codificar a continuación; para poder crear una API que pueda migrar a otras plataformas, en este punto es necesario crear una Clase que coordine las operaciones a nivel de la aplicación, se trata de un servicio que recibirá las solicitudes de la UI y realizara las acciones y conversiones necesarias para que la comunicación con el Model no sea cohesiva hacia afuera de estas. &lt;p align=&quot;justify&quot;&gt;Este servicio contendrá todo el código de control que en las aplicaciones tradicionales escritas usando la arquitectura ASP colocan en el Code Behind; se debe tener cuidado para evitar que a nivel de este servicio se añadan reglas de negocio, estas deben estar en el Model. &lt;p align=&quot;justify&quot;&gt;&amp;nbsp; &lt;h4 align=&quot;justify&quot;&gt;Presentador o API.&lt;/h4&gt; &lt;p align=&quot;justify&quot;&gt;9.- En el ejemplo anterior lo llamamos Presentador, puesto que se limitaba a presentar la información, sin embargo en esta ocasión la responsabilidad es mayor; para organizar mejor nuestro código la carpeta debe llamarse API: &lt;p align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh3.ggpht.com/-olwYwYbZmF0/TrgAzQnlZgI/AAAAAAAAF20/QvhBrSvxZrQ/s1600-h/Trns37%25255B2%25255D.jpg&quot;&gt;&lt;img style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px&quot; title=&quot;Trns37&quot; border=&quot;0&quot; alt=&quot;Trns37&quot; src=&quot;http://lh6.ggpht.com/--p6b3V2xGRQ/TrgAz7beYSI/AAAAAAAAF28/ItMP3EOOEM0/Trns37_thumb.jpg?imgmax=800&quot; width=&quot;237&quot; height=&quot;147&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;Por obvias razones de tiempo y espacio, no voy a codificar toda la aplicación, me limitare a mostrarles una de las acciones que se definieron en el &lt;a href=&quot;http://msaspnetmvc2.blogspot.com/2011/11/capas-con-entidades-relacionadas-2-de-3.html&quot; target=&quot;_blank&quot;&gt;artículo anterior&lt;/a&gt;, el método CrearCuenta: &lt;p align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh6.ggpht.com/-cWyKWfEt4mw/TrgA0ix7dlI/AAAAAAAAF3E/qZMSVH076RY/s1600-h/Trns38%25255B2%25255D.jpg&quot;&gt;&lt;img style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px&quot; title=&quot;Trns38&quot; border=&quot;0&quot; alt=&quot;Trns38&quot; src=&quot;http://lh3.ggpht.com/-7ODFRq0PrVI/TrgA1ZMxFrI/AAAAAAAAF3M/xPDnfYAuhiE/Trns38_thumb.jpg?imgmax=800&quot; width=&quot;244&quot; height=&quot;212&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh4.ggpht.com/-I7bDHxJQtcw/TrgA2AATBMI/AAAAAAAAF3U/H9YdD497Ovw/s1600-h/Trns39%25255B2%25255D.jpg&quot;&gt;&lt;img style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px&quot; title=&quot;Trns39&quot; border=&quot;0&quot; alt=&quot;Trns39&quot; src=&quot;http://lh3.ggpht.com/-nE0wPR0e1QA/TrgA2h-0ifI/AAAAAAAAF3c/F5WXvSfBP84/Trns39_thumb.jpg?imgmax=800&quot; width=&quot;244&quot; height=&quot;206&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;Observación: Para simplificar nuestro ejemplo he omitido validaciones básicas, por ejemplo verificar que el cliente no exista para darle de alta. Otro detalle a considerar es, en vez de que sea &lt;strong&gt;void&lt;/strong&gt; el método grabar, debería regresar el identificador que le acaba de asignar la base de datos, para no tener que realizar la consulta, etc. &lt;p align=&quot;justify&quot;&gt;Este código es con fines demostrativos y no es recomendable que se emplee tal cual en alguna aplicación final. &lt;p align=&quot;justify&quot;&gt;Ahora vamos a escribir el código para la UI. &lt;h5 align=&quot;justify&quot;&gt;Diseñador de Default.&lt;/h5&gt; &lt;p align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh4.ggpht.com/-t-Y4vaNXy5Y/TrgA3bwKRwI/AAAAAAAAF3k/D-GaNvN1DAY/s1600-h/Trns40%25255B2%25255D.jpg&quot;&gt;&lt;img style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px&quot; title=&quot;Trns40&quot; border=&quot;0&quot; alt=&quot;Trns40&quot; src=&quot;http://lh6.ggpht.com/-dnLRj3WPsQQ/TrgA3y0-okI/AAAAAAAAF3s/Mb5kp8o0yUE/Trns40_thumb.jpg?imgmax=800&quot; width=&quot;244&quot; height=&quot;171&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;h5 align=&quot;justify&quot;&gt;Code Behind de Default.&lt;/h5&gt; &lt;p align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh5.ggpht.com/--VnnLRBJ4Zs/TrgA4uquXAI/AAAAAAAAF30/YyCL8A9o_Nw/s1600-h/Trns41%25255B2%25255D.jpg&quot;&gt;&lt;img style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px&quot; title=&quot;Trns41&quot; border=&quot;0&quot; alt=&quot;Trns41&quot; src=&quot;http://lh6.ggpht.com/-axkBYQHg3H8/TrgA5GWRveI/AAAAAAAAF38/1RFTFtjtwBA/Trns41_thumb.jpg?imgmax=800&quot; width=&quot;244&quot; height=&quot;203&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;&lt;strong&gt;Observación&lt;/strong&gt;: Este código puede ser escrito en una aplicación de Windows y de esta forma estaríamos reutilizando todo el código que se creo en las capas inferiores.&lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;Pantalla de creación, después de enviar la solicitud. &lt;p align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh4.ggpht.com/-dCRnsFhBaa4/TrgA5sftLMI/AAAAAAAAF4E/I7io8QKsmCI/s1600-h/Trns42%25255B2%25255D.jpg&quot;&gt;&lt;img style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px&quot; title=&quot;Trns42&quot; border=&quot;0&quot; alt=&quot;Trns42&quot; src=&quot;http://lh6.ggpht.com/-1OfHEpdK8NI/TrgA6MYVvwI/AAAAAAAAF4M/y4m3iWwsIGo/Trns42_thumb.jpg?imgmax=800&quot; width=&quot;244&quot; height=&quot;129&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;&lt;strong&gt;Nota&lt;/strong&gt;: Se ha usado el GUID, para simplificar el código, lo correcto sería tener un código para la creación estos números de cuenta. &lt;p align=&quot;justify&quot;&gt;&amp;nbsp; &lt;h4 align=&quot;justify&quot;&gt;Comentario Final&lt;/h4&gt; &lt;p align=&quot;justify&quot;&gt;Como ha podido validar a través de estos 3 artículos, el empleo de capas en ASP, es una forma ordenada y muy sencilla de organizar nuestro código y aplicar patrones de arquitectura, así como principios de desarrollo. &lt;p align=&quot;justify&quot;&gt;Espero que este siendo de utilidad para alguien, seguiré publicando ejemplos. &lt;p align=&quot;justify&quot;&gt;Y recuerden: El poder del código solo es completo, si tenemos el conocimiento de cómo usarlo.       </content><link rel='replies' type='application/atom+xml' href='http://msaspnetmvc2.blogspot.com/feeds/6751513103271260376/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://msaspnetmvc2.blogspot.com/2011/11/capas-con-entidades-relacionadas-3-de-3.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3367264543642289030/posts/default/6751513103271260376'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3367264543642289030/posts/default/6751513103271260376'/><link rel='alternate' type='text/html' href='http://msaspnetmvc2.blogspot.com/2011/11/capas-con-entidades-relacionadas-3-de-3.html' title='Capas con Entidades relacionadas (3 de 3 )'/><author><name>jose ojeda</name><uri>https://plus.google.com/101071729884870810170</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/--xIfvUuN_Vg/AAAAAAAAAAI/AAAAAAAAmFs/5nf-iRGa4Vg/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/--p6b3V2xGRQ/TrgAz7beYSI/AAAAAAAAF28/ItMP3EOOEM0/s72-c/Trns37_thumb.jpg?imgmax=800" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3367264543642289030.post-7919724146681071299</id><published>2011-11-04T15:01:00.001-07:00</published><updated>2011-11-04T15:01:31.077-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Arquitectura"/><category scheme="http://www.blogger.com/atom/ns#" term="ASP"/><category scheme="http://www.blogger.com/atom/ns#" term="Capas"/><category scheme="http://www.blogger.com/atom/ns#" term="Clase Abstracta"/><category scheme="http://www.blogger.com/atom/ns#" term="Interfaces"/><category scheme="http://www.blogger.com/atom/ns#" term="n-Capas"/><category scheme="http://www.blogger.com/atom/ns#" term="Patron"/><category scheme="http://www.blogger.com/atom/ns#" term="Patron Repositorio"/><category scheme="http://www.blogger.com/atom/ns#" term="ViewModels"/><title type='text'>Capas con Entidades relacionadas (2 de 3)</title><content type='html'>&lt;p align=&quot;justify&quot;&gt;Esta es la segunda parte del artículo donde se ejemplifica como usar la arquitectura de capas con entidades relacionadas. &lt;p align=&quot;justify&quot;&gt;Ya hemos presentado en el articulo previo la capa del doman Model, aun que aun debe ser modificada para incluir todos los controles que se requerirán por los cambios que introduciremos; además en esta segunda parte vamos a terminar con las capas superiores de este modelo. &lt;div align=&quot;justify&quot;&gt; &lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;/div&gt; &lt;p align=&quot;justify&quot;&gt;Nuevos requerimientos. &lt;p align=&quot;justify&quot;&gt;Para garantizar la integridad de la información que estaremos manejando, debemos incluir en nuestro ejemplo el uso del objeto de transacciones de ADO. &lt;p align=&quot;justify&quot;&gt;Este mecanismo se implementara en la capa de servicios, pero es necesario modificar lo que ya habíamos creado, la interface de IRepository: &lt;p align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh4.ggpht.com/-HzILlhDLalI/TrRgdcvWbbI/AAAAAAAAFyU/Poi4k1h-Wlc/s1600-h/Trns21%25255B2%25255D.jpg&quot;&gt;&lt;img style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px&quot; title=&quot;Trns21&quot; border=&quot;0&quot; alt=&quot;Trns21&quot; src=&quot;http://lh4.ggpht.com/-_wjQlikhsCg/TrRgdyVQFoI/AAAAAAAAFyc/jLIKmGvkoSo/Trns21_thumb.jpg?imgmax=800&quot; width=&quot;244&quot; height=&quot;72&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;Sera necesario agregar dos parámetros para nuestro método Grabar de la interface de Repository. Mismos que se deben agregar al método grabar de las clases que la implementan: &lt;p align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh6.ggpht.com/-CfE8FGY4kVY/TrRgeqJz8vI/AAAAAAAAFyk/Gia0YmOco08/s1600-h/Trns22%25255B5%25255D.jpg&quot;&gt;&lt;img style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px&quot; title=&quot;Trns22&quot; border=&quot;0&quot; alt=&quot;Trns22&quot; src=&quot;http://lh3.ggpht.com/-TtlskYjlN3w/TrRgfEai21I/AAAAAAAAFys/Xj1I7CRA47U/Trns22_thumb%25255B1%25255D.jpg?imgmax=800&quot; width=&quot;198&quot; height=&quot;244&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;Nota: Esto debe hacerse en los dos repositorios. &lt;p align=&quot;justify&quot;&gt;Continuación Tutorial &lt;p align=&quot;justify&quot;&gt;1.- Para continuar con la capa de servicios, necesitamos una carpeta llamada Servicios, y dentro de esta creamos un folder para ViewModels: &lt;p align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh6.ggpht.com/-rwBvXKBvzac/TrRgfkZXbKI/AAAAAAAAFy0/wSmEVoIwrs8/s1600-h/Trns23%25255B2%25255D.jpg&quot;&gt;&lt;img style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px&quot; title=&quot;Trns23&quot; border=&quot;0&quot; alt=&quot;Trns23&quot; src=&quot;http://lh4.ggpht.com/-C3zDGIr9-_U/TrRggEEfA-I/AAAAAAAAFy8/qNBmTN0FZSE/Trns23_thumb.jpg?imgmax=800&quot; width=&quot;244&quot; height=&quot;99&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;2.- Los ViewModels son una simple representación de las entidades, para mantener la independencia de cada capa: &lt;p align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh6.ggpht.com/-qNqa7SRBk1U/TrRgghlXv5I/AAAAAAAAFzE/e-IqNoQhRFw/s1600-h/Trns24%25255B2%25255D.jpg&quot;&gt;&lt;img style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px&quot; title=&quot;Trns24&quot; border=&quot;0&quot; alt=&quot;Trns24&quot; src=&quot;http://lh3.ggpht.com/-Cd40dw9GJcM/TrRghGLyUsI/AAAAAAAAFzM/7E2IWaTe4wY/Trns24_thumb.jpg?imgmax=800&quot; width=&quot;244&quot; height=&quot;143&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh5.ggpht.com/-ljElO-w0Yz8/TrRghmx6TVI/AAAAAAAAFzU/qR4-nhjUAGc/s1600-h/Trns25%25255B2%25255D.jpg&quot;&gt;&lt;img style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px&quot; title=&quot;Trns25&quot; border=&quot;0&quot; alt=&quot;Trns25&quot; src=&quot;http://lh5.ggpht.com/-j9SJTrvkqBM/TrRgiIV0c_I/AAAAAAAAFzc/JoR6_hfAYbQ/Trns25_thumb.jpg?imgmax=800&quot; width=&quot;244&quot; height=&quot;148&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;3.- Dentro de la carpeta de servicios crearemos la clase que se encarga de llevar a cabo las transacciones a nivel del Model: &lt;p align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh5.ggpht.com/-R9XvBa4fTbY/TrRgizLtvVI/AAAAAAAAFzk/ATaLy8xYnCU/s1600-h/Trns26%25255B2%25255D.jpg&quot;&gt;&lt;img style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px&quot; title=&quot;Trns26&quot; border=&quot;0&quot; alt=&quot;Trns26&quot; src=&quot;http://lh6.ggpht.com/-OCa_xnuiKh4/TrRgjbcgzBI/AAAAAAAAFzs/chkZKJMlF1U/Trns26_thumb.jpg?imgmax=800&quot; width=&quot;244&quot; height=&quot;167&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;Este es el código del método RealizaTransaccion que aparecía cerrado en la imagen anterior: &lt;p align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh5.ggpht.com/-9-zXbKGDL1Y/TrRgj3idTII/AAAAAAAAFz0/1eQjwxhnUic/s1600-h/Trns27%25255B5%25255D.jpg&quot;&gt;&lt;img style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px&quot; title=&quot;Trns27&quot; border=&quot;0&quot; alt=&quot;Trns27&quot; src=&quot;http://lh6.ggpht.com/-ufVJQ9D2fsY/TrRgkkK3AeI/AAAAAAAAFz8/O4BYhmK5Xuc/Trns27_thumb%25255B1%25255D.jpg?imgmax=800&quot; width=&quot;169&quot; height=&quot;244&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;&lt;strong&gt;Observación&lt;/strong&gt;: El objetivo de este código es mantener en un solo punto el control de la conexión, así como de la transacción, para garantizar la atomicidad de la operación. A pesar que se creó publica, lo ideal es que se mantenga interna al igual que las clases de repositorio, puesto que solo las clases a nivel de la API deben ser visibles y de esta forma se evitan accesos indebidos violando la integridad de nuestra aplicación. &lt;p align=&quot;justify&quot;&gt;4.- Al igual que en el ejemplo anterior, debemos crear las clases para poder convertir una entidad en una ViewModel, mismas que crearemos como extensiones de las entidades, en la carpeta de entidades: &lt;p align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh3.ggpht.com/-w9DBy2aNWgw/TrRglDiSWhI/AAAAAAAAF0E/GLXf2XVQlKA/s1600-h/Trns28%25255B2%25255D.jpg&quot;&gt;&lt;img style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px&quot; title=&quot;Trns28&quot; border=&quot;0&quot; alt=&quot;Trns28&quot; src=&quot;http://lh5.ggpht.com/-c0OoPX2UaHE/TrRglrCqWrI/AAAAAAAAF0M/rg-Yj1zLN7o/Trns28_thumb.jpg?imgmax=800&quot; width=&quot;232&quot; height=&quot;134&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;Extensión de cuentas &lt;p align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh5.ggpht.com/-Uv5-65eXOiQ/TrRgmYzz-tI/AAAAAAAAF0U/L5GdizQYlyQ/s1600-h/Trns29%25255B2%25255D.jpg&quot;&gt;&lt;img style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px&quot; title=&quot;Trns29&quot; border=&quot;0&quot; alt=&quot;Trns29&quot; src=&quot;http://lh6.ggpht.com/-ZxonX2b7Vks/TrRgm5k2kPI/AAAAAAAAF0c/adyKzIljxLY/Trns29_thumb.jpg?imgmax=800&quot; width=&quot;244&quot; height=&quot;140&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;Extensión de Movimientos &lt;p align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh5.ggpht.com/-YkercaHIzEI/TrRgneWjeXI/AAAAAAAAF0k/0j5PHLY8YzA/s1600-h/Trns30%25255B2%25255D.jpg&quot;&gt;&lt;img style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px&quot; title=&quot;Trns30&quot; border=&quot;0&quot; alt=&quot;Trns30&quot; src=&quot;http://lh3.ggpht.com/-TxG5uSJXoKs/TrRgoCHKiNI/AAAAAAAAF0s/8RyQ7koLoww/Trns30_thumb.jpg?imgmax=800&quot; width=&quot;244&quot; height=&quot;164&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;5.- Según nuestra misma arquitectura ahora debemos crear la solicitud y la respuesta, en esta ocasión vamos a preparar nuestro código para poder implementar más de una clase de respuesta, esto es posible creando una clase base que puede ser implementada por cada clase que deba contener esas propiedades: &lt;p align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh6.ggpht.com/-ZKhp9eE4OPg/TrRgotF_I8I/AAAAAAAAF00/xlnBdomyDGc/s1600-h/Trns31%25255B2%25255D.jpg&quot;&gt;&lt;img style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px&quot; title=&quot;Trns31&quot; border=&quot;0&quot; alt=&quot;Trns31&quot; src=&quot;http://lh4.ggpht.com/-wLLsHPdoXzQ/TrRgpHNv75I/AAAAAAAAF08/jdoZOHpSq5w/Trns31_thumb.jpg?imgmax=800&quot; width=&quot;244&quot; height=&quot;98&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh4.ggpht.com/-HdXrs7AJh2E/TrRgpmKt5fI/AAAAAAAAF1E/uG0zWSMskiw/s1600-h/Trns32%25255B2%25255D.jpg&quot;&gt;&lt;img style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px&quot; title=&quot;Trns32&quot; border=&quot;0&quot; alt=&quot;Trns32&quot; src=&quot;http://lh6.ggpht.com/-lQ5oXvEwWpc/TrRgqBUFwpI/AAAAAAAAF1M/Y4uih9eULtg/Trns32_thumb.jpg?imgmax=800&quot; width=&quot;244&quot; height=&quot;87&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;6.- Si fuera necesario crear otra clase respuesta, por ejemplo para enviar todas las cuentas, podemos crear una clase usando la misma estructura. &lt;p align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh4.ggpht.com/-RBUVDoOTJyM/TrRgqixZrLI/AAAAAAAAF1U/-lOm6NaPZzY/s1600-h/Trns33%25255B2%25255D.jpg&quot;&gt;&lt;img style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px&quot; title=&quot;Trns33&quot; border=&quot;0&quot; alt=&quot;Trns33&quot; src=&quot;http://lh3.ggpht.com/-rPiCmeQiG8I/TrRgrPqWcTI/AAAAAAAAF1c/zh1qkeSqI-I/Trns33_thumb.jpg?imgmax=800&quot; width=&quot;244&quot; height=&quot;85&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;7.- Para llevar a cabo las acciones inherentes al manejo de la cuenta vamos a implementar un mecanismo de mensajes, este patrón establece que por cada solicitud debe haber una respuesta, aun que una clase respuesta puede servirnos para responder a mas de una solicitud; las acciones a realizar serian: &lt;p align=&quot;justify&quot;&gt;Crear la cuenta: Es la acción de abrir una cuenta. &lt;p align=&quot;justify&quot;&gt;Solicitud &lt;p align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh5.ggpht.com/-gMAOnaQflCE/TrRgrtpyQSI/AAAAAAAAF1k/vb2GzdJsN5c/s1600-h/Trns35%25255B2%25255D.jpg&quot;&gt;&lt;img style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px&quot; title=&quot;Trns35&quot; border=&quot;0&quot; alt=&quot;Trns35&quot; src=&quot;http://lh3.ggpht.com/-nR6s4vveSRM/TrRgsL1CseI/AAAAAAAAF1s/-Ssz4LU1vEE/Trns35_thumb.jpg?imgmax=800&quot; width=&quot;244&quot; height=&quot;87&quot;&gt;&lt;/a&gt; &lt;p align=&quot;justify&quot;&gt;Respuesta &lt;p align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh6.ggpht.com/-q9Sm4gAvua8/TrRgspYbRBI/AAAAAAAAF10/n4kFvdxD0Dw/s1600-h/Trns36%25255B2%25255D.jpg&quot;&gt;&lt;img style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px&quot; title=&quot;Trns36&quot; border=&quot;0&quot; alt=&quot;Trns36&quot; src=&quot;http://lh4.ggpht.com/-NdtHtqOIo6s/TrRgtUuOXPI/AAAAAAAAF18/bVwqljSpeY4/Trns36_thumb.jpg?imgmax=800&quot; width=&quot;244&quot; height=&quot;80&quot;&gt;&lt;/a&gt; &lt;p align=&quot;justify&quot;&gt;Consultar cuenta: Es la acción de solicitar el estado de cuenta. &lt;p align=&quot;justify&quot;&gt;Abonar al saldo: Es la acción de sumar efectivo al saldo de la cuenta. &lt;p align=&quot;justify&quot;&gt;Retirar efectivo: Es la acción de retirar efectivo de la cuenta. &lt;p align=&quot;justify&quot;&gt;Transferir a otra cuenta: Es la acción de usar el saldo de la cuenta para realizar una transferencia de efectivo a otra cuenta. (Pudiendo ser un pago) &lt;p align=&quot;justify&quot;&gt;Al terminar tendremos nuestro proyecto de esta manera: &lt;p align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh3.ggpht.com/-7ntdsHVs5n0/TrRgt5UD4fI/AAAAAAAAF2E/1c_7zJJY39Y/s1600-h/Trns34%25255B2%25255D.jpg&quot;&gt;&lt;img style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px&quot; title=&quot;Trns34&quot; border=&quot;0&quot; alt=&quot;Trns34&quot; src=&quot;http://lh4.ggpht.com/-N_jmVy0ZbR0/TrRguQJq1aI/AAAAAAAAF2M/hvmByBuld7w/Trns34_thumb.jpg?imgmax=800&quot; width=&quot;222&quot; height=&quot;244&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p align=&quot;justify&quot;&gt;Hasta aquí hemos creado el código de la capa intermedia, ya nos falta poco para poder ver en ejecución este nuevo ejemplo. &lt;p align=&quot;justify&quot;&gt;Solo nos queda pendiente una entrega, donde podrán ver como se crea una cuenta.   </content><link rel='replies' type='application/atom+xml' href='http://msaspnetmvc2.blogspot.com/feeds/7919724146681071299/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://msaspnetmvc2.blogspot.com/2011/11/capas-con-entidades-relacionadas-2-de-3.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3367264543642289030/posts/default/7919724146681071299'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3367264543642289030/posts/default/7919724146681071299'/><link rel='alternate' type='text/html' href='http://msaspnetmvc2.blogspot.com/2011/11/capas-con-entidades-relacionadas-2-de-3.html' title='Capas con Entidades relacionadas (2 de 3)'/><author><name>jose ojeda</name><uri>https://plus.google.com/101071729884870810170</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/--xIfvUuN_Vg/AAAAAAAAAAI/AAAAAAAAmFs/5nf-iRGa4Vg/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/-_wjQlikhsCg/TrRgdyVQFoI/AAAAAAAAFyc/jLIKmGvkoSo/s72-c/Trns21_thumb.jpg?imgmax=800" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3367264543642289030.post-1308113253230670806</id><published>2011-11-01T10:13:00.001-07:00</published><updated>2011-11-04T11:10:27.898-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ADO"/><category scheme="http://www.blogger.com/atom/ns#" term="Capas"/><category scheme="http://www.blogger.com/atom/ns#" term="Domain Model"/><category scheme="http://www.blogger.com/atom/ns#" term="Patron Repositorio"/><category scheme="http://www.blogger.com/atom/ns#" term="Patrones"/><title type='text'>Capas con entidades relacionadas (1 de 3)</title><content type='html'>&lt;div align=&quot;justify&quot;&gt;Para quienes hemos estado por muchos años escribiendo código y hemos vivido la evolución de las plataformas y la aparición de &lt;strong&gt;Frameworks&lt;/strong&gt;, así como la sublimación de los patrones, siempre nos queda un lastre, cuando se debe implementar una solución. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Simplemente creemos que sabemos cómo hacerlo, basándonos en lo que sabíamos hacer… &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;/div&gt;&lt;h4 align=&quot;justify&quot;&gt;Patrones&lt;/h4&gt;&lt;div align=&quot;justify&quot;&gt;Actualmente podemos encontrar soluciones en forma de patrones, que se emplean en los diferentes Framework que hay en el mercado, algunos de estos patrones pueden ser implementados sin importar la plataforma que estemos empleando. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&amp;nbsp; &lt;/div&gt;&lt;h4 align=&quot;justify&quot;&gt;El reto más serio&lt;/h4&gt;&lt;div align=&quot;justify&quot;&gt;Dentro del acceso a datos lo más sencillo de codificar es una transacción, pero si cometemos el error de crearlas a la vieja forma Procedural, será lo más complejo y repetitivo de codificar. Los programadores somos animales de costumbres, y pocos nos preocupamos por investigar y descubrir una mejor o más actualizada forma de hacer las cosas. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Las herramientas modernas como &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/bb425822.aspx&quot; target=&quot;_blank&quot;&gt;LINQ2SQL&lt;/a&gt;, &lt;a href=&quot;http://msaspnetmvc2.blogspot.com/2011/01/como-agregar-un-modelo-entity-fremework.html&quot; target=&quot;_blank&quot;&gt;Entity Framework&lt;/a&gt;, &lt;a href=&quot;http://nhforge.org/Default.aspx&quot; target=&quot;_blank&quot;&gt;NHibernate&lt;/a&gt;, &lt;a href=&quot;http://www.castleproject.org/&quot; target=&quot;_blank&quot;&gt;Castle&lt;/a&gt;&amp;nbsp; nos ofrecen formas modernas de simplificar nuestro proceso de desarrollo, para que nuestras aplicaciones no presenten problemas en el futuro. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Tal vez deberíamos prestarles un poco mas de atención…no creen? &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&amp;nbsp; &lt;/div&gt;&lt;h4 align=&quot;justify&quot;&gt;El patrón Domain Model&lt;/h4&gt;&lt;div align=&quot;justify&quot;&gt;En la serie de artículos previos les ejemplifique una forma de implementar capas usando ASP.NET, con la ayuda del patrón Domain Model.  &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;El ejemplo fue muy simple, con fines didácticos, y estoy seguro que una vez que lo vieron funcionar empezaron las dudas: cómo usar esto con entidades con relaciones complejas? &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&amp;nbsp; &lt;/div&gt;&lt;h4 align=&quot;justify&quot;&gt;Ejemplo&lt;/h4&gt;&lt;div align=&quot;justify&quot;&gt;Toda aplicación administrativa debe llevar registro de los pagos que realiza, así que vamos a implementar una solución para este requerimiento usando la arquitectura de capas que les presente previamente. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;1.- Lo primero es crear una aplicación ASP.NET nueva. Tal y como lo hicimos en nuestro ejemplo de capas, empezaremos con la capa de datos. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh6.ggpht.com/-EPbqdqPE1A4/TrAoVTaQxnI/AAAAAAAAFjI/klKGSV9m1KE/s1600-h/Trns1%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;Trns1&quot; border=&quot;0&quot; height=&quot;101&quot; src=&quot;http://lh5.ggpht.com/-Hefy5BV3TR8/TrAoV6hN7sI/AAAAAAAAFjQ/lmF2mG2m94M/Trns1_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;Trns1&quot; width=&quot;167&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;2.- Para simplificar nuestro código, solo vamos a usar 4 tipos de movimiento: Registro, Depósito, Retiro y Transferencia, aun que en la vida real es más complejo. Para esto crearemos un &lt;b&gt;Enum&lt;/b&gt;: &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh4.ggpht.com/-F3low5SJK7I/TrAoWabSQiI/AAAAAAAAFjY/SY6gbJ0-XQ8/s1600-h/Trns2%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;Trns2&quot; border=&quot;0&quot; height=&quot;136&quot; src=&quot;http://lh3.ggpht.com/-XSEcYKn-TJ8/TrAoW5lLSvI/AAAAAAAAFjg/-X-H5uMx-VQ/Trns2_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;Trns2&quot; width=&quot;244&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;3.- Necesitaremos una entidad para los movimientos en la Cuenta bancaria: &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh3.ggpht.com/-xgnl_7HG2Hk/TrAoXWWxTmI/AAAAAAAAFjo/zCtq07ZgFys/s1600-h/Trns3%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;Trns3&quot; border=&quot;0&quot; height=&quot;161&quot; src=&quot;http://lh6.ggpht.com/-RZgtViaR8uA/TrAoXykefUI/AAAAAAAAFjw/P7CYeXsgoMo/Trns3_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;Trns3&quot; width=&quot;244&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;4.- Nuestra última entidad será la cuenta bancara en sí: &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh5.ggpht.com/-B88WxCwSans/TrAoYGeoCyI/AAAAAAAAFj4/1WO8rqNTbKU/s1600-h/cuenta1%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;cuenta1&quot; border=&quot;0&quot; height=&quot;142&quot; src=&quot;http://lh4.ggpht.com/-dfp6QY293nc/TrAoYtAl1cI/AAAAAAAAFkA/ijK1jxCCaMA/cuenta1_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;cuenta1&quot; width=&quot;244&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;strong&gt;Nota&lt;/strong&gt;: como pueden observar he agregado la propiedad para la &lt;b&gt;CuentaId&lt;/b&gt;, sin embargo esta no se inicializa en el constructor. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh3.ggpht.com/-N9PTSUI87o4/TrAoZM7CBXI/AAAAAAAAFkI/edNKse20_sU/s1600-h/cuenta2%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;cuenta2&quot; border=&quot;0&quot; height=&quot;244&quot; src=&quot;http://lh6.ggpht.com/-RETUKxdRPgA/TrAoZqCLUCI/AAAAAAAAFkQ/PlzEXWSX3tI/cuenta2_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;cuenta2&quot; width=&quot;123&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;5.- Vamos a agregar una sobre carga del constructor: &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh5.ggpht.com/-Dt60VXIs8P4/TrAoaIIUM3I/AAAAAAAAFkY/8MUgy0mF6gk/s1600-h/cuenta3%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;cuenta3&quot; border=&quot;0&quot; height=&quot;70&quot; src=&quot;http://lh3.ggpht.com/-C-M3SYW3Wgc/TrAoaf-dK_I/AAAAAAAAFkg/dTuukvERAgI/cuenta3_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;cuenta3&quot; width=&quot;244&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;6.- Nuestra clase debe controlar las acciones inmediatas que pueden llevarse a cabo con ella, como son: &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Aumentar el Saldo &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh3.ggpht.com/-vT882JQw2cE/TrAoa4FrCyI/AAAAAAAAFko/y7EiJAubfBk/s1600-h/cuenta4%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;cuenta4&quot; border=&quot;0&quot; height=&quot;38&quot; src=&quot;http://lh5.ggpht.com/-GBarU9O-37w/TrAobZFLT9I/AAAAAAAAFkw/B8eIkcEu-Fo/cuenta4_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;cuenta4&quot; width=&quot;244&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Disminuir el Saldo &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Para aumentar el saldo no existe ninguna regla, sin embargo para poder disminuirlo (por ejemplo: retirar dinero, hacer algún pago, transferir) debe haber fondos suficientes, por lo tanto debemos implementar esta regla de negocio: &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh4.ggpht.com/-tfDeSbGid7s/TrAobuJVQhI/AAAAAAAAFk4/EJqZCr3dnBo/s1600-h/cuenta5%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;cuenta5&quot; border=&quot;0&quot; height=&quot;109&quot; src=&quot;http://lh4.ggpht.com/-ujffefKznFQ/TrAocPa3JdI/AAAAAAAAFlA/sRNDkZXWr3c/cuenta5_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;cuenta5&quot; width=&quot;244&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Si observan con cuidado podrán ver que en el método de disminuir el saldo, se uso una variable de clase _&lt;b&gt;&lt;i&gt;ultimoMensaje&lt;/i&gt;&lt;/b&gt;, la cual debe ser expuesta por medio de una propiedad de solo lectura. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;7.- Dentro de esta capa se deben ofrecer los métodos conocidos como &lt;a href=&quot;http://msaspnetmvc2.blogspot.com/2011/01/crud.html&quot; target=&quot;_blank&quot;&gt;CRUD&lt;/a&gt;, aun que por simplificar el ejemplo solo implementaremos algunos de ellos, para lo cual vamos a crear una interface genérica para que sea implementada por cada repositorio: &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh3.ggpht.com/-Nr8zkMZNEds/TrAocqhsT6I/AAAAAAAAFlI/lZ8TbEBA_Ug/s1600-h/Trns7%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;Trns7&quot; border=&quot;0&quot; height=&quot;113&quot; src=&quot;http://lh6.ggpht.com/-RC-4KGmG4FY/TrAoc7XeaPI/AAAAAAAAFlQ/b3SKda2AIVI/Trns7_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;Trns7&quot; width=&quot;244&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&amp;nbsp; &lt;/div&gt;&lt;h3 align=&quot;justify&quot;&gt;Analicemos lo que debemos hacer.&lt;/h3&gt;&lt;div align=&quot;justify&quot;&gt;Las entidades que ya hemos creado son clases que representan la información en memoria, en las bases de datos aplican otras reglas, por ejemplo, los movimientos deben estar relacionados de alguna forma con la cuenta o con el cliente; en nuestras entidades, tenemos los movimientos dentro de una colección que es una propiedad de la clase Cuenta.  &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;En la base de datos necesitaremos dos tablas, una con la cuenta y otra con los movimientos, para relacionar ambas usaremos un campo que podría ser el número de cuenta o el identificador del cliente. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Si usáramos el cliente, podríamos tener problemas ya que, ese cliente podría tener otras cuentas y de esa forma se entre mezclarían los movimientos de ambas, así que la mejor opción es usar el identificador o el numero de la cuenta. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Estas son las tablas: &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh4.ggpht.com/-y1qw22ZUCl8/TrAodS0qMwI/AAAAAAAAFlY/fcSVznMyZxc/s1600-h/Trns8%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;Trns8&quot; border=&quot;0&quot; height=&quot;244&quot; src=&quot;http://lh5.ggpht.com/-PwcoX3X6wFQ/TrAod6p5D4I/AAAAAAAAFlg/TECXzBmMPHU/Trns8_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;Trns8&quot; width=&quot;242&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh4.ggpht.com/-HD4SSznLWJo/TrAoeRtG9DI/AAAAAAAAFlo/KUXIfG9zPsA/s1600-h/Trns9%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;Trns9&quot; border=&quot;0&quot; height=&quot;244&quot; src=&quot;http://lh6.ggpht.com/-kRkHu0GHqSE/TrAoe5GKZbI/AAAAAAAAFlw/wAfDR1Vra3Q/Trns9_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;Trns9&quot; width=&quot;207&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Y este es el diagrama: &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh4.ggpht.com/-rONL8QW2ltk/TrAofYcGaLI/AAAAAAAAFl4/ACLtixz8IUw/s1600-h/Trns10%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;Trns10&quot; border=&quot;0&quot; height=&quot;168&quot; src=&quot;http://lh5.ggpht.com/-lPUyCT_QT2U/TrAofx2J_9I/AAAAAAAAFmA/AbRHn27xHyw/Trns10_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;Trns10&quot; width=&quot;244&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&amp;nbsp; &lt;/div&gt;&lt;h3 align=&quot;justify&quot;&gt;Dilema existencial&lt;/h3&gt;&lt;div align=&quot;justify&quot;&gt;Para el acceso a datos podemos usar diferentes tecnologías, como son ADO.NET, LINQ2SQL, Entity Framework; además si escogemos ADO, tenernos al menos dos formas de hacerlo, usando Stored Procedures o Escribiendo cadenas de texto con las instrucciones. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Si se atreven a buscar en internet sobre el tema, van a encontrar un número interminable de sitios donde acaloradamente discuten el tema, cada uno con su propio punto de vista. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Para que nuestro ejemplo sea más sencillo de entender voy a usar las cadenas de texto en vez de los Stored Procedures. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&amp;nbsp; &lt;/div&gt;&lt;h3 align=&quot;justify&quot;&gt;Un repositorio o varios&lt;/h3&gt;&lt;div align=&quot;justify&quot;&gt;8.- En el ejemplo anterior donde les presente la arquitectura de capas, emplee LINQ2SQL para el acceso a datos, En este ejemplo vamos a usar ADO, Aun que al usar ADO será necesario usar una cadena de Conexión, y requiere que agreguemos una referencia a System.Configuration. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;9.- Para nuestro ejemplo crearemos un repositorio para cada tabla; aun que bien podríamos crear un repositorio para la cuenta y este cargar los movimientos. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Hay quienes creen que estaríamos mezclando responsabilidades y quienes creen que es mejor hacer un repositorio por conjunto de entidades relacionadas. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Este es el Repositorio de Cuentas &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh3.ggpht.com/-GPjC8jss8Dg/TrAogWrZy1I/AAAAAAAAFmI/___9w5dfmnc/s1600-h/Trns12%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;Trns12&quot; border=&quot;0&quot; height=&quot;244&quot; src=&quot;http://lh3.ggpht.com/-_ZL1W4VL2UQ/TrAog5W_q_I/AAAAAAAAFmQ/s1Qpl4v5_E0/Trns12_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;Trns12&quot; width=&quot;203&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;10.- La implementación de los 4 métodos es esta: &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Grabar &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh3.ggpht.com/-aZ1PEGfPhAw/TrAohX3pyyI/AAAAAAAAFmY/-9IkxSrtiHY/s1600-h/Trns13%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;Trns13&quot; border=&quot;0&quot; height=&quot;191&quot; src=&quot;http://lh3.ggpht.com/-73hDpXcZou4/TrAoh0Ib8lI/AAAAAAAAFmg/v1JWm_GDKEQ/Trns13_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;Trns13&quot; width=&quot;244&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;ObtenerTodas &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh5.ggpht.com/-R9zc4oz8rQM/TrAoiaRjmtI/AAAAAAAAFmo/OcU8CnljOJs/s1600-h/Trns14%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;Trns14&quot; border=&quot;0&quot; height=&quot;244&quot; src=&quot;http://lh5.ggpht.com/-QTLzca40apU/TrAoi6w5nJI/AAAAAAAAFmw/MC3UH0NdCcc/Trns14_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;Trns14&quot; width=&quot;210&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;BuscarPor &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh6.ggpht.com/-3-gKSxyI4TA/TrAojb3AtvI/AAAAAAAAFm4/mJ7pDB_4iaA/s1600-h/Trns15%25255B5%25255D.jpg&quot;&gt;&lt;img alt=&quot;Trns15&quot; border=&quot;0&quot; height=&quot;216&quot; src=&quot;http://lh5.ggpht.com/-5u3-iUMBd7A/TrAoj2MBtQI/AAAAAAAAFnA/ttSP7ivQYKQ/Trns15_thumb%25255B1%25255D.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;Trns15&quot; width=&quot;244&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;ConvertiraCuentas &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh3.ggpht.com/-rMmmiD_rpfE/TrAoke4RvKI/AAAAAAAAFnI/3SKFHJsxCT8/s1600-h/Trns16%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;Trns16&quot; border=&quot;0&quot; height=&quot;180&quot; src=&quot;http://lh6.ggpht.com/-FAXbOzao4yY/TrAokjvPMuI/AAAAAAAAFnQ/Qy05MaB8rjw/Trns16_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;Trns16&quot; width=&quot;244&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;11.- Este es el repositorio de Movimientos: &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh3.ggpht.com/-0Jk5KM4ZPm4/TrAolQMxvMI/AAAAAAAAFnY/lx6_f6vpYj4/s1600-h/Trns17%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;Trns17&quot; border=&quot;0&quot; height=&quot;244&quot; src=&quot;http://lh4.ggpht.com/-8t2WdU7HROk/TrAomAmblJI/AAAAAAAAFng/mJp0UkG9yqY/Trns17_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;Trns17&quot; width=&quot;197&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Grabar &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh4.ggpht.com/-xLtD7LbWi5w/TrAompk13QI/AAAAAAAAFno/OJcGK45Mqa8/s1600-h/Trns18%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;Trns18&quot; border=&quot;0&quot; height=&quot;179&quot; src=&quot;http://lh6.ggpht.com/-dAsVZx1m1QE/TrAonIppWKI/AAAAAAAAFnw/IZtU_OdNTaY/Trns18_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;Trns18&quot; width=&quot;244&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;ObtenerTodos &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh3.ggpht.com/-RotHcWkI8G0/TrAoniyUB9I/AAAAAAAAFn4/yxUdLB1xxUk/s1600-h/Trns19%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;Trns19&quot; border=&quot;0&quot; height=&quot;244&quot; src=&quot;http://lh4.ggpht.com/-91ZWRw0J-So/TrAooL6zYAI/AAAAAAAAFoA/pMZKmDLHcMc/Trns19_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;Trns19&quot; width=&quot;211&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;ConvertiraMovimientos &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh4.ggpht.com/-mzL5ezEg59w/TrAoohqdL1I/AAAAAAAAFoI/57Kb4kQcV4A/s1600-h/Trns20%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;Trns20&quot; border=&quot;0&quot; height=&quot;208&quot; src=&quot;http://lh3.ggpht.com/-9cc5P5BXopk/TrAoo9ITRlI/AAAAAAAAFoQ/vmHyuyy5DRw/Trns20_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;Trns20&quot; width=&quot;244&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;b&gt;Observación&lt;/b&gt;: Los movimientos de la cuenta bancaria, no pueden ser modificados una vez que se han registrado, por reglas de contabilidad, solo podrán hacerse inserciones de registros nuevos. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Fin de la primera parte. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;En el siguiente articulo vamos a continuar con este ejemplo, hasta el momento tenemos la parte del doman Model.                      &lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://msaspnetmvc2.blogspot.com/feeds/1308113253230670806/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://msaspnetmvc2.blogspot.com/2011/11/capas-con-entidades-relacionadas-1-de-2.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3367264543642289030/posts/default/1308113253230670806'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3367264543642289030/posts/default/1308113253230670806'/><link rel='alternate' type='text/html' href='http://msaspnetmvc2.blogspot.com/2011/11/capas-con-entidades-relacionadas-1-de-2.html' title='Capas con entidades relacionadas (1 de 3)'/><author><name>jose ojeda</name><uri>https://plus.google.com/101071729884870810170</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/--xIfvUuN_Vg/AAAAAAAAAAI/AAAAAAAAmFs/5nf-iRGa4Vg/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh5.ggpht.com/-Hefy5BV3TR8/TrAoV6hN7sI/AAAAAAAAFjQ/lmF2mG2m94M/s72-c/Trns1_thumb.jpg?imgmax=800" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3367264543642289030.post-2465046147563807352</id><published>2011-10-31T08:26:00.000-07:00</published><updated>2011-10-31T08:26:41.375-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Arquitectura"/><category scheme="http://www.blogger.com/atom/ns#" term="ASP"/><category scheme="http://www.blogger.com/atom/ns#" term="n-Capas"/><title type='text'>Ejemplo ASP.NET en capas (3 de 3)</title><content type='html'>&lt;div align=&quot;justify&quot;&gt;Una vez que hemos armado las tuberías de comunicación a la base de datos, podemos movernos un poco más arriba, en esta ocasión vamos a crear una capa que controla la comunicación entre la interface de usuario y la capa de servicios. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Me refiero a la capa de Presentación… &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;/div&gt;&lt;h4 align=&quot;justify&quot;&gt;Capa de Presentación.&lt;/h4&gt;&lt;div align=&quot;justify&quot;&gt;Para esta capa vamos a implementar el patrón &lt;strong&gt;Model-View-Presenter&lt;/strong&gt;, si les parece conocido es porque se trata de una derivación del &lt;strong&gt;MVC&lt;/strong&gt;. Se trata de una variante del patrón, con la cual se sugieren algunas modificaciones:  &lt;/div&gt;&lt;ul&gt;&lt;li&gt; &lt;div align=&quot;justify&quot;&gt;La Vista no conoce el Modelo.&lt;/div&gt;&lt;/li&gt;&lt;li&gt; &lt;div align=&quot;justify&quot;&gt;El presentador es Independiente de la interface de usuario. &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h4 align=&quot;justify&quot;&gt;Relación Vista Presentador.&lt;/h4&gt;&lt;div align=&quot;justify&quot;&gt;La recomendación es usar el modelo de vista pasiva, o sea la vista se limita a presentar los datos, no tiene lógica ni formateo de datos. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh3.ggpht.com/-abR8MyBpZs4/TqiBR3d3SmI/AAAAAAAAFDQ/RONOucAo7VA/s1600-h/MVP2%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;MVP2&quot; border=&quot;0&quot; height=&quot;113&quot; src=&quot;http://lh3.ggpht.com/-KO2l9wNpW8Y/TqiBSseAN8I/AAAAAAAAFDY/m_FI-kijp-s/MVP2_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;MVP2&quot; width=&quot;189&quot; /&gt;&lt;/a&gt; &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;El presentador es quien recibe los datos y es el responsable de realizar las acciones contra el sistema; es quien recibe la respuesta y la prepara para la vista.  &lt;/div&gt;&lt;blockquote&gt;&lt;div align=&quot;justify&quot;&gt;Donde he visto esto?...Claro es como el Controlador del modelo MVC.&lt;/div&gt;&lt;/blockquote&gt;&lt;div align=&quot;justify&quot;&gt;&amp;nbsp; &lt;/div&gt;&lt;h4 align=&quot;justify&quot;&gt;Como se logra la separación entre Vista y Presentador.&lt;/h4&gt;&lt;div align=&quot;justify&quot;&gt;Mediante un Contrato, o sea una estructura de datos bien definida que representa toda la información que el usuario recibe. Este contrato está ligado a la vista, cada vista debe soportar un solo contrato. &lt;/div&gt;&lt;h5 align=&quot;justify&quot;&gt;La única relación entre ambas es el contrato.&lt;/h5&gt;&lt;div align=&quot;justify&quot;&gt;Antes de empezar agregaremos una nueva carpeta que llamaremos &lt;b&gt;Presentacion&lt;/b&gt; y dentro crearemos una carpeta para las Interfaces. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh6.ggpht.com/-xUmFkv99U70/TqiBTctYhTI/AAAAAAAAFDg/m6MbZ3sNwsA/s1600-h/MVP3%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;MVP3&quot; border=&quot;0&quot; height=&quot;244&quot; src=&quot;http://lh4.ggpht.com/-_ak2WlSUywQ/TqiBUPfrOvI/AAAAAAAAFDo/B8DW2FkxHOw/MVP3_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;MVP3&quot; width=&quot;195&quot; /&gt;&lt;/a&gt; &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&amp;nbsp; &lt;/div&gt;&lt;h4 align=&quot;justify&quot;&gt;Tutorial&lt;/h4&gt;&lt;div align=&quot;justify&quot;&gt;1.- Lo primero que hacemos será crear el contrato, este contrato no es otra cosa que una interface: &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh5.ggpht.com/-a8ex_xIRycI/TqiBUqw-XQI/AAAAAAAAFDw/NXp969n3UNc/s1600-h/MVP4%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;MVP4&quot; border=&quot;0&quot; height=&quot;110&quot; src=&quot;http://lh6.ggpht.com/-ovERVaLy0UA/TqiBVckYpLI/AAAAAAAAFD4/r1XZIlW3uWw/MVP4_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;MVP4&quot; width=&quot;244&quot; /&gt;&lt;/a&gt; &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;2.- Ahora debemos crear el Presentador: &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh5.ggpht.com/-dWNZEQ27b0k/TqiBWwaFDlI/AAAAAAAAFEA/nBqipprlGEs/s1600-h/MVP5%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;MVP5&quot; border=&quot;0&quot; height=&quot;161&quot; src=&quot;http://lh6.ggpht.com/-B-P_KYJi9OE/TqiBXn9_mTI/AAAAAAAAFEI/o5M3b8cDw1M/MVP5_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;MVP5&quot; width=&quot;244&quot; /&gt;&lt;/a&gt; &lt;/div&gt;&lt;h3 align=&quot;justify&quot;&gt;Descripción del código&lt;/h3&gt;&lt;div align=&quot;justify&quot;&gt;Como pueden observar en el código, es en el presentador donde se unen todas las partes que previamente estuvimos codificando. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;La explicación del método &lt;i&gt;Display&lt;/i&gt; es bastante simple: &lt;/div&gt;&lt;ul&gt;&lt;li&gt; &lt;div align=&quot;justify&quot;&gt;Se recibe la solicitud por medio de la cual se identifica para que tipo de Cliente se creara la lista.&lt;/div&gt;&lt;/li&gt;&lt;li&gt; &lt;div align=&quot;justify&quot;&gt;Se obtiene los productos para eta solicitud en particular.&lt;/div&gt;&lt;/li&gt;&lt;li&gt; &lt;div align=&quot;justify&quot;&gt;Si la acción tuvo éxito, se despliegan los resultados de lo contrario se envía el mensaje de error que se ha obtenido.&lt;/div&gt;&lt;/li&gt;&lt;li&gt; &lt;div align=&quot;justify&quot;&gt;Es tan simple que la primera vez que la vi, tuve mis dudas al respecto.&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h5 align=&quot;justify&quot;&gt;La capa final&lt;/h5&gt;&lt;div align=&quot;justify&quot;&gt;Esta capa es la que el usuario ve, es donde el usuario interactúa con nuestra aplicación. Y como les comente en el &lt;a href=&quot;http://msaspnetmvc2.blogspot.com/2011/10/aspnet-sobre-capas.html&quot; target=&quot;_blank&quot;&gt;primero&lt;/a&gt;&amp;nbsp; de estos artículos debemos descargar una &lt;a href=&quot;http://sourceforge.net/projects/structuremap/&quot; target=&quot;_blank&quot;&gt;biblioteca de esta dirección&lt;/a&gt;, para que la &lt;a href=&quot;http://msaspnetmvc2.blogspot.com/2011/02/dependency-injection.html&quot; target=&quot;_blank&quot;&gt;Inyección de dependencia&lt;/a&gt;&amp;nbsp; no sea dolorosa; ya que tratar de implementarla en una plataforma como &lt;b&gt;ASP&lt;/b&gt;, nos llevaría mucho tiempo y esfuerzo. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Después de descargar la biblioteca debemos descomprimirla, una vez que tengamos la &lt;b&gt;DLL&lt;/b&gt;, vamos a nuestro proyecto y agregaremos una Carpeta nueva a nivel de la raíz, a la cual llamaremos &lt;b&gt;Lib&lt;/b&gt; y acto seguido copiamos la DLL en el. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh3.ggpht.com/-oAyM5_nlMo0/TqiBYrOMp6I/AAAAAAAAFEQ/zTJk_sn1GVs/s1600-h/MVP6%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;MVP6&quot; border=&quot;0&quot; height=&quot;144&quot; src=&quot;http://lh4.ggpht.com/-CHlvH_xK10Q/TqiBZdVCD9I/AAAAAAAAFEY/eYBuEUSxQp0/MVP6_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;MVP6&quot; width=&quot;191&quot; /&gt;&lt;/a&gt; &lt;/div&gt;&lt;h5 align=&quot;justify&quot;&gt;Al terminar agregaremos una referencia a la biblioteca.&lt;/h5&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh5.ggpht.com/-pUcJFcaDEZ0/TqiBaqEq6OI/AAAAAAAAFEg/W1fTFZRFKug/s1600-h/MVP7%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;MVP7&quot; border=&quot;0&quot; height=&quot;192&quot; src=&quot;http://lh6.ggpht.com/--oshJeDaOs0/TqiBbHjFtpI/AAAAAAAAFEo/MGzjR2UmaeU/MVP7_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;MVP7&quot; width=&quot;244&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Nos encontramos ante un reto interesante, ya que necesitamos una forma de “meternos” en medio, o sea entre la página web y el presentador; es un punto que servirá para preparar nuestro entorno para la inversión del control, permitiendo la inyección de dependencia. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;3.- Agreguen otra carpeta a nivel del Raíz, y denomínenla &lt;b&gt;WebUI&lt;/b&gt;. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;4.- Vamos a crear una nueva Clase dentro de esta carpeta, que nos servirá para registrar las dependencias y permitirle a la biblioteca inyectar lo que corresponde: &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh3.ggpht.com/-bzdJfbJBsFc/TqiBb9D__NI/AAAAAAAAFEw/aXJ0YYpjmnk/s1600-h/MVP8%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;MVP8&quot; border=&quot;0&quot; height=&quot;244&quot; src=&quot;http://lh5.ggpht.com/-7yq6Jbbi44g/TqiBcujeSgI/AAAAAAAAFE4/4X-5aBSZPLM/MVP8_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;MVP8&quot; width=&quot;228&quot; /&gt;&lt;/a&gt; &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;5.- Este código es similar al que se usa en &lt;b&gt;MVC&lt;/b&gt; y debe ser cargado al principio de la ejecución, por lo tanto debemos asegurarnos que sea así, para lograrlo debemos escribir código en el &lt;b&gt;Global.asax&lt;/b&gt; de nuestra aplicación: &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh4.ggpht.com/-NQu5FvuioC0/TqiBdUky5UI/AAAAAAAAFFA/ukW0bpfkB94/s1600-h/MVP9%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;MVP9&quot; border=&quot;0&quot; height=&quot;150&quot; src=&quot;http://lh3.ggpht.com/-vhKBY2gmnMc/TqiBeBuqt_I/AAAAAAAAFFI/d84K1jKVr8w/MVP9_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;MVP9&quot; width=&quot;244&quot; /&gt;&lt;/a&gt; &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;6.- Antes de continuar debemos agregar información a la tabla para poder presentar algo cuando ejecutemos nuestra aplicación por primera vez. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh3.ggpht.com/-v2DV3zUvtNc/TqiBenm4AOI/AAAAAAAAFFQ/-rIhi6rsss8/s1600-h/MVP10%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;MVP10&quot; border=&quot;0&quot; height=&quot;86&quot; src=&quot;http://lh5.ggpht.com/-LyD2KrcS8Mo/TqiBffOjwuI/AAAAAAAAFFY/PYAw5UAXeHg/MVP10_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;MVP10&quot; width=&quot;244&quot; /&gt;&lt;/a&gt; &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;7.- Ahora sí, la interfaz de usuario, para el ejemplo voy a usar la página Default.aspx, primero agregare los controles en modo de código fuente: &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh6.ggpht.com/-n6y9--qb7-o/TqiBf35akjI/AAAAAAAAFFg/BqKc3aORdZg/s1600-h/MVP11%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;MVP11&quot; border=&quot;0&quot; height=&quot;20&quot; src=&quot;http://lh3.ggpht.com/-_dxslbx7-e4/TqiBgjYUaSI/AAAAAAAAFFo/-lfzh9GCS84/MVP11_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;MVP11&quot; width=&quot;244&quot; /&gt;&lt;/a&gt; &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;8.- Este es el código HTML: &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh4.ggpht.com/--WD_1LnmoKk/TqiBhfyqvSI/AAAAAAAAFFw/YzuuELcrpEA/s1600-h/MVP12%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;MVP12&quot; border=&quot;0&quot; height=&quot;244&quot; src=&quot;http://lh3.ggpht.com/-QM_eu0MZCEg/TqiBiGGWKCI/AAAAAAAAFF4/Ge3-v3DxnAg/MVP12_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;MVP12&quot; width=&quot;211&quot; /&gt;&lt;/a&gt; &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;9.- Hasta aquí solo nos falta el Code Behind… (Si creyeron que lo íbamos a omitir, pues no es posible, solo le vamos a dar la vuelta), así queda: &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh4.ggpht.com/-oXGkku5wn9Y/TqiBi1oAsCI/AAAAAAAAFGA/EMDTaAeY504/s1600-h/MVP13%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;MVP13&quot; border=&quot;0&quot; height=&quot;244&quot; src=&quot;http://lh3.ggpht.com/-F6hfMrK_l98/TqiBjTY5BAI/AAAAAAAAFGE/ITn4mFiKNFo/MVP13_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;MVP13&quot; width=&quot;244&quot; /&gt;&lt;/a&gt; &lt;/div&gt;&lt;h5 align=&quot;justify&quot;&gt;Explicación del código&lt;/h5&gt;&lt;ol&gt;&lt;li&gt; &lt;div align=&quot;justify&quot;&gt;Lo primero que se debe notar es la presencia de nuestra interface junto a Page, para que podamos implementar nuestro modelo dentro de la página.&lt;/div&gt;&lt;/li&gt;&lt;li&gt; &lt;div align=&quot;justify&quot;&gt;En el método &lt;i&gt;Init&lt;/i&gt; se crea una instancia de nuestro Presentador, pasándole una instancia de la propia página y por medio de la biblioteca nos aseguramos que se envíe la instancia apropiada.&lt;/div&gt;&lt;/li&gt;&lt;li&gt; &lt;div align=&quot;justify&quot;&gt;Justo debajo de esta línea, podemos ver que agregamos un delegado para que atienda el evento del &lt;b&gt;DropDownList&lt;/b&gt;.&lt;/div&gt;&lt;/li&gt;&lt;li&gt; &lt;div align=&quot;justify&quot;&gt;En el método &lt;i&gt;Load&lt;/i&gt;, se llama al método &lt;i&gt;Display&lt;/i&gt; del presentador, condicionado con el &lt;b&gt;postback&lt;/b&gt;.&lt;/div&gt;&lt;/li&gt;&lt;li&gt; &lt;div align=&quot;justify&quot;&gt;Luego encontraremos un Bloque de código que contiene la implementación de nuestra interface, lo que nos permite tomar el control.&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h4 align=&quot;justify&quot;&gt;Prueba&lt;/h4&gt;&lt;div align=&quot;justify&quot;&gt;Compilen su aplicación y ejecútenla. &lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-rIixXIGhFmg/Tq6-F84dE1I/AAAAAAAAFho/fLbMFpFi6eM/s1600/MVP14.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;285&quot; src=&quot;http://3.bp.blogspot.com/-rIixXIGhFmg/Tq6-F84dE1I/AAAAAAAAFho/fLbMFpFi6eM/s320/MVP14.JPG&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;KISS: Simplemente sencillo. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&amp;nbsp; &lt;/div&gt;&lt;h4 align=&quot;justify&quot;&gt;Comentario Final&lt;/h4&gt;&lt;div align=&quot;justify&quot;&gt;Esta serie de artículos nos han permitido experimentar esta forma de crear aplicaciones usando ASP.NET, con un enfoque más moderno, el cual nos permite la escalabilidad y nos ofrece una alternativa viable para que nuestra aplicación pueda crecer posteriormente, sin que este crecimiento represente un problema futuro. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Espero que lo hayan disfrutado tanto como yo. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Y como siempre: El poder del código solo es completo, si tenemos el conocimiento de como usarlo.              &lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://msaspnetmvc2.blogspot.com/feeds/2465046147563807352/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://msaspnetmvc2.blogspot.com/2011/10/ejemplo-aspnet-en-capas-3-de-3.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3367264543642289030/posts/default/2465046147563807352'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3367264543642289030/posts/default/2465046147563807352'/><link rel='alternate' type='text/html' href='http://msaspnetmvc2.blogspot.com/2011/10/ejemplo-aspnet-en-capas-3-de-3.html' title='Ejemplo ASP.NET en capas (3 de 3)'/><author><name>jose ojeda</name><uri>https://plus.google.com/101071729884870810170</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/--xIfvUuN_Vg/AAAAAAAAAAI/AAAAAAAAmFs/5nf-iRGa4Vg/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/-KO2l9wNpW8Y/TqiBSseAN8I/AAAAAAAAFDY/m_FI-kijp-s/s72-c/MVP2_thumb.jpg?imgmax=800" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3367264543642289030.post-5435261059192116248</id><published>2011-10-28T07:01:00.000-07:00</published><updated>2011-10-28T07:01:53.146-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Arquitectura"/><category scheme="http://www.blogger.com/atom/ns#" term="ASP"/><category scheme="http://www.blogger.com/atom/ns#" term="n-Capas"/><title type='text'>Ejemplo ASP.NET en capas (2 de 3)</title><content type='html'>Hasta este momento ya hemos creado la capa del Modelo de Dominio, y estamos listos para empezar la codificación de la capa intermedia; esta capa también llamada de Servicios, es la encargada de crear el vínculo de comunicación entre la capa a nivel de usuario y la capa de datos. &lt;br /&gt;Su responsabilidad incluye todo aquello que se requiera para trasladar los datos en ambos sentidos, incluso las conversiones entre una vista y otra…&lt;br /&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;h4&gt;Importancia&lt;/h4&gt;Esta capa cumple con uno de los principales requisitos en este modelo de capas, mantener la independencia entre las partes; aislar las clases, para romper con la dependencia tan estrecha que existe en las aplicaciones codificadas usando ASP. &lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;h4&gt;Continuación&lt;/h4&gt;Este tutorial es la continuación del anterior donde se creó la capa del &lt;b&gt;Model&lt;/b&gt;.  &lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: large;&quot;&gt;Tutorial &lt;/span&gt;&lt;br /&gt;1.- Para mantener ambas capas separadas físicamente, vamos a crear una nueva carpeta al mismo nivel que la del Model, a la cual llamaremos &lt;b&gt;Servicios&lt;/b&gt; y Dentro de esta agregaremos otra llamada &lt;b&gt;&lt;a href=&quot;http://msaspnetmvc2.blogspot.com/2011/01/view-models.html&quot; target=&quot;_blank&quot;&gt;ViewModels&lt;/a&gt;&lt;/b&gt;: &lt;br /&gt;&lt;a href=&quot;http://lh3.ggpht.com/-87f6BL9UFwQ/Tqh11Zxhc7I/AAAAAAAAE_8/4t_NKh8b-2A/s1600-h/aspnet2-1%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;aspnet2-1&quot; border=&quot;0&quot; height=&quot;103&quot; src=&quot;http://lh5.ggpht.com/-S6nes3pEl64/Tqh12UrnpOI/AAAAAAAAFAE/d9DwpF_s8uk/aspnet2-1_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;aspnet2-1&quot; width=&quot;130&quot; /&gt;&lt;/a&gt; &lt;br /&gt;2.- Agregaremos el primer &lt;a href=&quot;http://msaspnetmvc2.blogspot.com/2011/01/view-models.html&quot; target=&quot;_blank&quot;&gt;View Model&lt;/a&gt;: &lt;br /&gt;&lt;a href=&quot;http://lh3.ggpht.com/-n188O6k0zlw/Tqh13OLOoxI/AAAAAAAAFAM/U0NbSzgqV0M/s1600-h/aspnet2-2%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;aspnet2-2&quot; border=&quot;0&quot; height=&quot;128&quot; src=&quot;http://lh5.ggpht.com/-Ie4DTKd6a3M/Tqh14GY8WuI/AAAAAAAAFAU/wNikDgdXtlo/aspnet2-2_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;aspnet2-2&quot; width=&quot;244&quot; /&gt;&lt;/a&gt; &lt;br /&gt;&lt;b&gt;Observación&lt;/b&gt;: al ver el código podrán notar la pequeña diferencia con la entidad, se trata de la propiedad &lt;i&gt;Precio &lt;/i&gt;de la entidad Producto, que en este caso se separo en dos propiedades. &lt;br /&gt;En un artículo posterior les mostrare de qué forma podemos agregar propiedades nuevas para contener el porcentaje de descuento, y validar que la afectación será mínima. &lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Patrón Solicitud/Respuesta.&lt;/strong&gt;&lt;br /&gt;Al tratarse de una aplicación Web, es necesario tomar en cuenta que se recibirán solicitudes y se enviaran respuestas; estas solicitudes deben cumplir con un contrato especifico, así mismo las respuestas. &lt;br /&gt;3.- Dentro de la carpeta Servicios, agregaremos dos carpetas más denominadas &lt;b&gt;Solicitudes&lt;/b&gt; y &lt;b&gt;Respuestas&lt;/b&gt;: &lt;br /&gt;&lt;a href=&quot;http://lh5.ggpht.com/--k-G6vcBcBQ/Tqh14lgipUI/AAAAAAAAFAc/gk9U-AAi3LY/s1600-h/aspnet2-12%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;aspnet2-12&quot; border=&quot;0&quot; height=&quot;61&quot; src=&quot;http://lh5.ggpht.com/-DZvQezzntuc/Tqh15ixaNWI/AAAAAAAAFAk/RTfM3aXW3SY/aspnet2-12_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;aspnet2-12&quot; width=&quot;190&quot; /&gt;&lt;/a&gt; &lt;br /&gt;4.- Dentro de la carpeta de solicitudes agregaremos una clase para las solicitudes:&lt;br /&gt;&lt;a href=&quot;http://lh3.ggpht.com/-0e4ubO2fvaw/Tqh1623jd7I/AAAAAAAAFAs/5qGq2CuGYlw/s1600-h/aspnet2-4%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;aspnet2-4&quot; border=&quot;0&quot; height=&quot;91&quot; src=&quot;http://lh6.ggpht.com/-PYGxLXvAiLI/Tqh175Wuh9I/AAAAAAAAFA0/ONnJeot4yXk/aspnet2-4_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;aspnet2-4&quot; width=&quot;244&quot; /&gt;&lt;/a&gt; &lt;br /&gt;Observación: Las letras&lt;b&gt; VM&lt;/b&gt; al final nos indican que se trata de un ViewModel. &lt;br /&gt;5.- Dentro de la carpeta Respuestas agregaremos otra clase, para las respuestas: &lt;br /&gt;&lt;a href=&quot;http://lh3.ggpht.com/-Fw4vXBGKQ4k/Tqh18QA5JqI/AAAAAAAAFA8/EgLdUvh3R4E/s1600-h/aspnet2-5%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;aspnet2-5&quot; border=&quot;0&quot; height=&quot;95&quot; src=&quot;http://lh6.ggpht.com/-xXxmPb-5uxs/Tqh18xFO6KI/AAAAAAAAFBE/Yna0Pw-mB2s/aspnet2-5_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;aspnet2-5&quot; width=&quot;244&quot; /&gt;&lt;/a&gt; &lt;br /&gt;Ya estamos listos para hacer la conversión de View Models en Entidades. Esta&amp;nbsp;conversión&amp;nbsp;mantiene separados los datos de la pagina y las entidades del Modelo.&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: 19px; font-weight: bold;&quot;&gt;Paso de la muerte&lt;/span&gt;&lt;br /&gt;Podemos decir que esta es la parte crucial de esta capa, un paso en falso y todo fallara. Así que deben seguir con mucho cuidado las indicaciones; si tienen dudas, sigan los links que se agregan para completar la teoría. &lt;br /&gt;&lt;br /&gt;6.- Nuevamente haremos uso de los métodos de extensión, que son mucho mas versátiles que agregar el código a la entidad; en esta ocasión vamos a necesitar dos: &lt;br /&gt;&lt;ul&gt;&lt;li&gt; El primero nos permite convertir una entidad producto a un view model de producto,&lt;/li&gt;&lt;li&gt;El segundo una lista genérica de Productos a una lista genérica de ProductoViewModel.&lt;/li&gt;&lt;/ul&gt;Se trata de una extensión de la entidad producto, así que agregaremos esta nueva clase en la carpeta Entities del Model: &lt;br /&gt;&lt;a href=&quot;http://lh5.ggpht.com/-kEGxKxTwkhc/Tqh19vIOIuI/AAAAAAAAFBM/7kjnPp_hHMk/s1600-h/aspnet2-6%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;aspnet2-6&quot; border=&quot;0&quot; height=&quot;117&quot; src=&quot;http://lh5.ggpht.com/-R2eKUjzqek0/Tqh1-OCkImI/AAAAAAAAFBU/CdvWPdOFsqs/aspnet2-6_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;aspnet2-6&quot; width=&quot;244&quot; /&gt;&lt;/a&gt; &lt;br /&gt;&lt;b&gt;Nota&lt;/b&gt;: Este Método de extensión recibe un Producto y lo convierte en ProductoViewModel. &lt;br /&gt;&lt;br /&gt;7.- En el artículo anterior agregamos un método de extensión para aplicar el descuento; en esa misma (ProductoListExtension) vamos a agregar otro método nuevo, para poder agregar elementos: &lt;br /&gt;&lt;a href=&quot;http://lh4.ggpht.com/-jVCzY2p43rk/Tqh1-pMduFI/AAAAAAAAFBc/JUvTcsPcuuQ/s1600-h/aspnet2-7%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;aspnet2-7&quot; border=&quot;0&quot; height=&quot;67&quot; src=&quot;http://lh4.ggpht.com/-nalWTtiwUIQ/Tqh1_kDdc4I/AAAAAAAAFBk/47WOnljRHdA/aspnet2-7_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;aspnet2-7&quot; width=&quot;244&quot; /&gt;&lt;/a&gt; &lt;br /&gt;8.- A continuación vamos a crear una clase Servicio que atenderá las solicitudes y generara las respuestas: &lt;br /&gt;&lt;a href=&quot;http://lh3.ggpht.com/-EhEKfnyJNSI/Tqh2ASo1nWI/AAAAAAAAFBs/XSDrnt24yII/s1600-h/aspnet2-8%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;aspnet2-8&quot; border=&quot;0&quot; height=&quot;230&quot; src=&quot;http://lh4.ggpht.com/-Yf22NyBKsj0/Tqh2BX92JQI/AAAAAAAAFB0/yphkLWZCMQo/aspnet2-8_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;aspnet2-8&quot; width=&quot;244&quot; /&gt;&lt;/a&gt; &lt;br /&gt;&lt;b&gt;Nota&lt;/b&gt;: Todo lo que hemos creado se encuentra en memoria, aun no hemos creado un acceso al almacén de datos; para que el trabajo sea mucho mas rápido vamos a usar Clases de &lt;strong&gt;LINQ to SQL&lt;/strong&gt;. &lt;br /&gt;&lt;br /&gt;9.- Agregaremos un nuevo elemento de las plantillas de Data, dentro de la carpeta de Model, al cual llamaremos Entidades;  &lt;br /&gt;&lt;a href=&quot;http://lh4.ggpht.com/-GQKJTGIHpRU/Tqh2CY663RI/AAAAAAAAFB8/fTE0ZFbRO4s/s1600-h/aspnet2-9%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;aspnet2-9&quot; border=&quot;0&quot; height=&quot;170&quot; src=&quot;http://lh4.ggpht.com/-u_fFNdDgC3o/Tqh2DGvPnMI/AAAAAAAAFCE/wBWD8rMepLY/aspnet2-9_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;aspnet2-9&quot; width=&quot;244&quot; /&gt;&lt;/a&gt; &lt;br /&gt;10.- En la base de datos de SQL crearemos una tabla, a la cual llamaremos Productos; desde la IDE de VS solo debemos abrir el panel de servidores, ubicar la tabla y&amp;nbsp;después&amp;nbsp;arrastrarla y soltarla en el diseñador de LINQ para obtener la clase.  &lt;br /&gt;&lt;a href=&quot;http://lh6.ggpht.com/--1WCwJJ32g8/Tqh2ENut1JI/AAAAAAAAFCM/BWfOYMWJ-T0/s1600-h/aspnet2-10%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;aspnet2-10&quot; border=&quot;0&quot; height=&quot;106&quot; src=&quot;http://lh6.ggpht.com/-lO8HZiEoD2s/Tqh2EwU6MQI/AAAAAAAAFCU/EhgR1hyrN1A/aspnet2-10_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;aspnet2-10&quot; width=&quot;244&quot; /&gt;&lt;/a&gt; &lt;br /&gt;&lt;b&gt;Ojo&lt;/b&gt;: deben tener cuidado, el nombre de la tabla debe conservarse, de lo contrario se presentaran errores en las extensiones y las entidades.&lt;br /&gt;. &lt;br /&gt;10.- Abrimos la clase repositorio que habías creado en el artículo anterior y la modificamos como se muestra a&amp;nbsp;continuación, para que emplee LINQ al realizar la consulta: &lt;br /&gt;&lt;a href=&quot;http://lh3.ggpht.com/-Rqutm1EM7BY/Tqh2Fip8KdI/AAAAAAAAFCc/kAF7vxJ49eo/s1600-h/aspnet2-11%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;aspnet2-11&quot; border=&quot;0&quot; height=&quot;228&quot; src=&quot;http://lh3.ggpht.com/-t0iyZymf6P4/Tqh2GSPNmWI/AAAAAAAAFCk/GhogvnLQdYY/aspnet2-11_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;aspnet2-11&quot; width=&quot;244&quot; /&gt;&lt;/a&gt; &lt;br /&gt;&amp;nbsp; &lt;br /&gt;Ya solo falta un articulo para tener el modelo arquitectónico completo. En el&amp;nbsp;próximo&amp;nbsp;articulo&amp;nbsp;podrán&amp;nbsp;completar el ejemplo y ver como se ejecuta.&lt;br /&gt;&lt;br /&gt;Fin de la capa de Servicios.</content><link rel='replies' type='application/atom+xml' href='http://msaspnetmvc2.blogspot.com/feeds/5435261059192116248/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://msaspnetmvc2.blogspot.com/2011/10/ejemplo-aspnet-en-capas-2-de-3.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3367264543642289030/posts/default/5435261059192116248'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3367264543642289030/posts/default/5435261059192116248'/><link rel='alternate' type='text/html' href='http://msaspnetmvc2.blogspot.com/2011/10/ejemplo-aspnet-en-capas-2-de-3.html' title='Ejemplo ASP.NET en capas (2 de 3)'/><author><name>jose ojeda</name><uri>https://plus.google.com/101071729884870810170</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/--xIfvUuN_Vg/AAAAAAAAAAI/AAAAAAAAmFs/5nf-iRGa4Vg/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh5.ggpht.com/-S6nes3pEl64/Tqh12UrnpOI/AAAAAAAAFAE/d9DwpF_s8uk/s72-c/aspnet2-1_thumb.jpg?imgmax=800" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3367264543642289030.post-9031532005316638146</id><published>2011-10-27T07:53:00.000-07:00</published><updated>2011-10-27T07:53:08.081-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Arquitectura"/><category scheme="http://www.blogger.com/atom/ns#" term="ASP"/><category scheme="http://www.blogger.com/atom/ns#" term="n-Capas"/><title type='text'>Ejemplo ASP.NET en capas (1 de 3)</title><content type='html'>&lt;div align=&quot;justify&quot;&gt;Para poder entender algo tan abstracto y nuevo, será necesario que llevemos a cabo la creación de un ejemplo donde podamos ver de qué manera los patrones afectaran la estructura de nuestro proyecto. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;El ejemplo es simple, pero que nos permite ver como se crean las capas… &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;/div&gt;&lt;h4 align=&quot;justify&quot;&gt;Introducción&lt;/h4&gt;&lt;div align=&quot;justify&quot;&gt;Este articulo es la continuación del denominado &lt;a href=&quot;http://msaspnetmvc2.blogspot.com/2011/10/aspnet-sobre-capas.html&quot; target=&quot;_blank&quot;&gt;ASP.NET sobre capas&lt;/a&gt;, los términos y la teoría que aquí se ejemplifican están en él; en esta ocasión me limitare a explicar cómo se crea la estructura de un proyecto usando esas capas y ampliare lo que no haya mencionado en el articulo antes citado. Los links les llevaran a profundizar en los temas que se mencionan. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Forma parte de una serie de 3 artículos que explicaran la implementación de este modelo de capas en su totalidad. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&amp;nbsp; &lt;/div&gt;&lt;h4 align=&quot;justify&quot;&gt;Tutorial&lt;/h4&gt;&lt;div align=&quot;justify&quot;&gt;1.- Crearemos una nueva aplicación ASP.NET WEB, puede ser con VB o con C#. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh3.ggpht.com/-OCq0TSAnD70/TqhR-5kP0UI/AAAAAAAAE8c/HyM58d7OxoE/s1600-h/ejemploaspnet1%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;ejemploaspnet1&quot; border=&quot;0&quot; height=&quot;139&quot; src=&quot;http://lh6.ggpht.com/-Gt3b6skCaHM/TqhR_SvofzI/AAAAAAAAE8k/01JPhB_HJOM/ejemploaspnet1_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;ejemploaspnet1&quot; width=&quot;244&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;strong&gt;Nota&lt;/strong&gt;: En este punto debo hacer una observación, en el artículo anterior dije que en el flujo de codificación de las aplicaciones modernas se debe empezar por las clases, así que en este ejemplo vamos a empezar por crear las clases del Model. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;2.- Hagan clic con el botón derecho sobre el proyecto y agreguen una carpeta nueva a la cual denominaran &lt;b&gt;Model&lt;/b&gt;. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;3.- Dentro de esta nueva carpeta vamos a agregar otra que llamaremos &lt;b&gt;Interfaces&lt;/b&gt;. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;4.- Ahora agregaremos dos capetas mas, una para almacenar las entidades, que debe llamarse &lt;b&gt;Entities &lt;/b&gt;y otra llamada &lt;b&gt;Custom&lt;/b&gt;, que contendrá las clases de apoyo. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh4.ggpht.com/-z7ebV7cEkXg/TqhR_8L88bI/AAAAAAAAE8s/hKtWBx5SPd0/s1600-h/ejemploaspnet4%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;ejemploaspnet4&quot; border=&quot;0&quot; height=&quot;111&quot; src=&quot;http://lh3.ggpht.com/-Kj29PdA98T0/TqhSAToxIuI/AAAAAAAAE80/lxYnzNGRvhI/ejemploaspnet4_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;ejemploaspnet4&quot; width=&quot;217&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;strong&gt;Nota&lt;/strong&gt;: Para nuestro proyecto vamos a usar el patrón &lt;b&gt;Strategy&lt;/b&gt;, que se ejemplifica en el artículo del patrón &lt;a href=&quot;http://msaspnetmvc2.blogspot.com/2011/03/patron-builder.html&quot; target=&quot;_blank&quot;&gt;Builder&lt;/a&gt;. El cual es muy útil para permitirle a l código adaptarse a situaciones desconocidas en el futuro, como podría ser el caso del mecanismo de descuentos que ofrece nuestra aplicación. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;5.- Este patrón como casi todos empieza con una interface, la cual debe quedar en la carpeta Interfaces: &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh3.ggpht.com/-8CCVudM2pIg/TqhSA5cveAI/AAAAAAAAE88/PobBiOXSAAA/s1600-h/ejemploaspnet5%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;ejemploaspnet5&quot; border=&quot;0&quot; height=&quot;85&quot; src=&quot;http://lh3.ggpht.com/-_u3Dn1ZwnJw/TqhSBS9RDGI/AAAAAAAAE9E/PbPWlwX0Ia4/ejemploaspnet5_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;ejemploaspnet5&quot; width=&quot;244&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;6.- Ahora vamos a crear una clase que implementa esta interface, dentro de la carpeta Custom: &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh5.ggpht.com/-t0XMcBEk_Jk/TqhSB8aNxLI/AAAAAAAAE9M/bcezgoF7A0U/s1600-h/ejemploaspnet6%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;ejemploaspnet6&quot; border=&quot;0&quot; height=&quot;198&quot; src=&quot;http://lh6.ggpht.com/-AEQ85Qt57xw/TqhSCRpYZSI/AAAAAAAAE9U/cyM_4ytKuSM/ejemploaspnet6_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;ejemploaspnet6&quot; width=&quot;244&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;7.- Para prevenir errores por valores nulos se recomienda el empleo del patrón de &lt;strong&gt;Objetos Nulos&lt;/strong&gt;, como se muestra a continuación; creada dentro de la carpeta Custom: &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh6.ggpht.com/-r_1thi-rl7g/TqhSDLTZIlI/AAAAAAAAE9c/R1C4dzRNv-w/s1600-h/ejemploaspnet7%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;ejemploaspnet7&quot; border=&quot;0&quot; height=&quot;169&quot; src=&quot;http://lh4.ggpht.com/-qr4HGypZ3Ok/TqhSDl1xgRI/AAAAAAAAE9k/K9l-Nia2yF0/ejemploaspnet7_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;ejemploaspnet7&quot; width=&quot;244&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;8.- Nuestra entidad principal debe contener una propiedad para almacenar el precio de venta, que puede ser modificado usando la estrategia de descuentos; por lo tanto crearemos una clase que se empleará como tipo de esa propiedad, para que podamos tener el control de nuestra estrategia: &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh6.ggpht.com/-mZGoNz79QfE/TqhSEYLwVyI/AAAAAAAAE9s/mMDd49tbyUY/s1600-h/ejemploaspnet8%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;ejemploaspnet8&quot; border=&quot;0&quot; height=&quot;244&quot; src=&quot;http://lh3.ggpht.com/-cpBRZ4oXpxg/TqhSE1AvI7I/AAAAAAAAE90/7amDSG9djUM/ejemploaspnet8_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;ejemploaspnet8&quot; width=&quot;168&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;b&gt;Observación&lt;/b&gt;: Si prestan atención al método &lt;i&gt;ObtenerDescuento&lt;/i&gt;, podrán detectar la regla de negocio que impide la aplicación de un descuento que ocasione que vendamos a menor precio del costo. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;9.- En este momento podemos crear la clase Producto: &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh4.ggpht.com/-dRPSM_vyjMg/TqhSFf-uP1I/AAAAAAAAE98/ozQsmD_-5ao/s1600-h/ejemploaspnet9%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;ejemploaspnet9&quot; border=&quot;0&quot; height=&quot;123&quot; src=&quot;http://lh5.ggpht.com/-oc6YFcLY1Uc/TqhSFykta3I/AAAAAAAAE-E/nHbdkn-KfYg/ejemploaspnet9_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;ejemploaspnet9&quot; width=&quot;244&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;10.- Para controlar la aplicación del descuento será necesario ligarlo de tal forma que nos permita, que dicha interacción sea automática, por ejemplo el tipo de cliente. Para lo cual agregaremos una nueva carpeta dentro de la carpeta Model, a la cual le pondremos por nombre Enums. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh6.ggpht.com/-FJxdjl53pgI/TqhSGV_E4tI/AAAAAAAAE-M/aTPktkH76_o/s1600-h/ejemploaspnet10%25255B5%25255D.jpg&quot;&gt;&lt;img alt=&quot;ejemploaspnet10&quot; border=&quot;0&quot; height=&quot;131&quot; src=&quot;http://lh4.ggpht.com/-eIUhVvYABng/TqhSG1_YToI/AAAAAAAAE-U/5W4K2hiDPP4/ejemploaspnet10_thumb%25255B1%25255D.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;ejemploaspnet10&quot; width=&quot;161&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh3.ggpht.com/-UNchG6KKIdo/TqhSHeyRYOI/AAAAAAAAE-c/w5ooe5k8NVk/s1600-h/ejemploaspnet11%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;ejemploaspnet11&quot; border=&quot;0&quot; height=&quot;126&quot; src=&quot;http://lh5.ggpht.com/-ph8LgIqRU_I/TqhSHyLt2FI/AAAAAAAAE-k/XXe7G2ecgQI/ejemploaspnet11_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;ejemploaspnet11&quot; width=&quot;244&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;11.- Para terminar con la implementación de este patrón necesitaremos una clase &lt;b&gt;&lt;a href=&quot;http://msaspnetmvc2.blogspot.com/2011/02/factory-pattern.html&quot; target=&quot;_blank&quot;&gt;Factory&lt;/a&gt;&lt;/b&gt;, que tendrá la responsabilidad de crear el objeto descuento que corresponda: &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh3.ggpht.com/-MNU7fysA_0o/TqhSIbflEQI/AAAAAAAAE-s/oXT_PLpZe8c/s1600-h/ejemploaspnet12%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;ejemploaspnet12&quot; border=&quot;0&quot; height=&quot;170&quot; src=&quot;http://lh3.ggpht.com/-xylraU3-CnI/TqhSI-dPTeI/AAAAAAAAE-0/t5hll5VuNWM/ejemploaspnet12_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;ejemploaspnet12&quot; width=&quot;244&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;12.- En este punto vamos a preparar nuestra capa para acceder al almacén de datos, para lo cual vamos a emplear el patrón &lt;b&gt;&lt;a href=&quot;http://msaspnetmvc2.blogspot.com/2011/01/repositorio.html&quot; target=&quot;_blank&quot;&gt;Repository&lt;/a&gt;&lt;/b&gt;. Empezaremos con una interface, para continuar con la separación de las partes. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh6.ggpht.com/-w5KuRWmjK70/TqhSJb4ImmI/AAAAAAAAE-8/EyThRWL7bkE/s1600-h/ejemploaspnet13%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;ejemploaspnet13&quot; border=&quot;0&quot; height=&quot;122&quot; src=&quot;http://lh3.ggpht.com/-VMFFjXZVfsI/TqhSJwQXasI/AAAAAAAAE_E/IMG83tX7e2o/ejemploaspnet13_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;ejemploaspnet13&quot; width=&quot;244&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;b&gt;Observación&lt;/b&gt;: conforme avancemos agregaremos mas métodos a la interface, por el momento solo usaremos uno. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;13.- Antes de crear el repositorio de productos, vamos a agregar una nueva carpeta llamada &lt;b&gt;Repositories&lt;/b&gt; dentro de &lt;b&gt;Model&lt;/b&gt;, después agregaremos esta clase: &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh3.ggpht.com/-hlqV_qX-2QA/TqhSKtbgvYI/AAAAAAAAE_M/1JexbYfkXXo/s1600-h/ejemploaspnet14%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;ejemploaspnet14&quot; border=&quot;0&quot; height=&quot;223&quot; src=&quot;http://lh6.ggpht.com/-exkgie9VwiM/TqhSLKwpkrI/AAAAAAAAE_U/jPG3SUVyJvg/ejemploaspnet14_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;ejemploaspnet14&quot; width=&quot;244&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;b&gt;Observación&lt;/b&gt;: Este código tiene una excepción, si me han seguido con cuidado, se habrán dado cuenta que al momento de obtener los productos estamos omitiendo el mecanismo de descuentos que creamos al principio. Ese mecanismo se aplica a un producto, y en este caso estamos tratando con una lista, por lo que será necesario extender la funcionalidad, con un &lt;a href=&quot;http://msaspnetmvc2.blogspot.com/2011/02/metodos-de-extension.html&quot; target=&quot;_blank&quot;&gt;método de extensión&lt;/a&gt;. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;14.- Creamos nuestro método de extensión dentro de la carpeta Entities: &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh3.ggpht.com/-A_iyorWx3vg/TqhSLixQ3DI/AAAAAAAAE_c/fSKLW1oLtuk/s1600-h/ejemploaspnet15%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;ejemploaspnet15&quot; border=&quot;0&quot; height=&quot;110&quot; src=&quot;http://lh6.ggpht.com/-0QwaYxbzL30/TqhSMJRhE6I/AAAAAAAAE_k/Tg1fNnSWfEo/ejemploaspnet15_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;ejemploaspnet15&quot; width=&quot;244&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;15.- Luego modificamos el método &lt;b&gt;&lt;i&gt;GetAllfor&lt;/i&gt;&lt;/b&gt; de la clase ProductosRepository: &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh5.ggpht.com/-Bg3BaICDo_w/TqhSMnWyrVI/AAAAAAAAE_s/3XjZhG4_0LQ/s1600-h/ejemploaspnet16%25255B2%25255D.jpg&quot;&gt;&lt;img alt=&quot;ejemploaspnet16&quot; border=&quot;0&quot; height=&quot;62&quot; src=&quot;http://lh6.ggpht.com/-SReLVuNJ6Hk/TqhSNEd1OcI/AAAAAAAAE_0/fhgcwnXOAZ0/ejemploaspnet16_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;ejemploaspnet16&quot; width=&quot;244&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;De esta forma al solicitar los productos se aplicara la estrategia de descuento que le corresponde al cliente. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Comentario Final: Esta última clase repositorio se modificara en el siguiente articulo cuando se cree el acceso a datos. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Fin de la primera parte.                 &lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://msaspnetmvc2.blogspot.com/feeds/9031532005316638146/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://msaspnetmvc2.blogspot.com/2011/10/ejemplo-aspnet-en-capas-1-de-3.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3367264543642289030/posts/default/9031532005316638146'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3367264543642289030/posts/default/9031532005316638146'/><link rel='alternate' type='text/html' href='http://msaspnetmvc2.blogspot.com/2011/10/ejemplo-aspnet-en-capas-1-de-3.html' title='Ejemplo ASP.NET en capas (1 de 3)'/><author><name>jose ojeda</name><uri>https://plus.google.com/101071729884870810170</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/--xIfvUuN_Vg/AAAAAAAAAAI/AAAAAAAAmFs/5nf-iRGa4Vg/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/-Gt3b6skCaHM/TqhR_SvofzI/AAAAAAAAE8k/01JPhB_HJOM/s72-c/ejemploaspnet1_thumb.jpg?imgmax=800" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3367264543642289030.post-4100985154150412559</id><published>2011-10-26T08:33:00.001-07:00</published><updated>2011-10-26T08:33:42.192-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term=".NET"/><category scheme="http://www.blogger.com/atom/ns#" term="Arquitectura"/><category scheme="http://www.blogger.com/atom/ns#" term="ASP"/><category scheme="http://www.blogger.com/atom/ns#" term="Facade Pattern"/><category scheme="http://www.blogger.com/atom/ns#" term="Martin Fowler"/><category scheme="http://www.blogger.com/atom/ns#" term="n-Capas"/><category scheme="http://www.blogger.com/atom/ns#" term="SoC"/><category scheme="http://www.blogger.com/atom/ns#" term="ViewModels"/><title type='text'>ASP.NET sobre capas</title><content type='html'>&lt;p&gt;La solución que ofrece Microsoft al problema del código mezclado es el Code Behind. Una forma al parecer simple de separar el código HTML del código VB o C#, en un archivo aparte. &lt;p&gt;Este archivo aparte contiene código que responde a los eventos que se disparan en la interface, y al final termina siendo una forma disfrazada de SMART UI, debemos romper ese vicio….&lt;/p&gt; &lt;a name=&#39;more&#39;&gt;&lt;/a&gt; &lt;h4&gt;Como podemos romper ese círculo vicioso?&lt;/h4&gt; &lt;p&gt;Debemos aplicar las buenas practicas como cuando empleamos el principio &lt;a href=&quot;http://msaspnetmvc2.blogspot.com/2011/02/buenas-practicas.html&quot; target=&quot;_blank&quot;&gt;SoC (Separation of Concerns)&lt;/a&gt; o separación de las partes, como se explica en este otro &lt;a href=&quot;http://msaspnetmvc2.blogspot.com/2011/02/n-capas.html&quot; target=&quot;_blank&quot;&gt;artículo&lt;/a&gt;&amp;nbsp; que habla de MVC, pero desde la arquitectura de ASP representa un reto. &lt;p&gt;&amp;nbsp; &lt;h4&gt;&lt;a href=&quot;http://msaspnetmvc2.blogspot.com/2011/02/n-capas.html&quot; target=&quot;_blank&quot;&gt;Capas&lt;/a&gt;&lt;/h4&gt; &lt;p&gt;Al principio puede parecer forzado, podría parecerles que quiero cambiar la arquitectura de ASP para que se adapte al modelo &lt;b&gt;MVC&lt;/b&gt;, sin embargo no es así; la idea es aplicar un patrón ya probado en una arquitectura que puede ser mejorada, si sabemos que ajustes realizar. &lt;p&gt;El objetivo es aplicar principios y patrones para que nuestra aplicación pueda soportar los cambios y la evolución a la que se enfrentara durante el proceso de desarrollo e implementación en producción. &lt;p&gt;&amp;nbsp; &lt;h4&gt;Tradicional ASP vs Capas:&lt;/h4&gt; &lt;p&gt;Una aplicación típica desarrollada usando ASP.NET contiene paginas, que contienen controles, de tras de esa pagina existen manejadores de eventos que se codifican en el &lt;b&gt;Code behind&lt;/b&gt;, los controles o el &lt;b&gt;Code Behind&lt;/b&gt; lleva a cabo el acceso a los datos, posiblemente si son exigentes con su trabajo, a lo mejor tengan bibliotecas para esto, sin embargo la relación entre la interface y el Code Behind, es muy difícil de romper. &lt;p&gt;Para poder lograrlo, lo primero será identificar las responsabilidades que se encuentran entre mezcladas en ese modelo: &lt;h5&gt;Puntos&lt;/h5&gt; &lt;ol&gt; &lt;li&gt;Web UI&lt;/li&gt; &lt;li&gt;Manejo de eventos&lt;/li&gt; &lt;li&gt;Servicios&lt;/li&gt; &lt;li&gt;Clases que representan entidades en algún almacén de datos.&lt;/li&gt; &lt;li&gt;Código de acceso a ese almacén de datos.&lt;/li&gt;&lt;/ol&gt; &lt;h4&gt;Donde va cada cosa?&lt;/h4&gt; &lt;p&gt;En una aplicación de capas se asignan responsabilidades en niveles que van desde el usuario hasta los datos. &lt;i&gt;&lt;u&gt;El &lt;b&gt;Code Behind&lt;/b&gt; no es una capa&lt;/u&gt;&lt;/i&gt;. &lt;p&gt;Se debe identificar que contendrá cada capa, cuales serán esas capas y cuáles son las reglas de su uso e implementación. &lt;p&gt;&amp;nbsp; &lt;h3&gt;Patrón de &lt;a href=&quot;http://msdn.microsoft.com/en-us/magazine/ee236415.aspx&quot; target=&quot;_blank&quot;&gt;Modelo de dominio&lt;/a&gt; (Punto 4)&lt;/h3&gt; &lt;p&gt;La programación moderna empieza por el modelado de Clases, así que lo primero será definir esta responsabilidad. Este patrón fue presentado por &lt;b&gt;Martin Fowler&lt;/b&gt; en 2003 y según su definición  &lt;blockquote&gt; &lt;p&gt;“E&lt;i&gt;s un objeto que contiene comportamiento y datos”&lt;/i&gt;.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;En este modelo debemos incluir toda la lógica de negocios, tanto datos como funcionalidades relacionadas a esta. Contendrá nuestras clases, si alguna clase requiriera de algún tipo de lógica para determinar un dato, esta lógica debe estar en esta capa. &lt;p&gt;Como una forma de mantener las partes independientes, se recomienda el uso de interfaces de código, que deberán ser implementadas por las clases. &lt;p&gt;&amp;nbsp; &lt;h4&gt;Capa de servicios (Punto 3)&lt;/h4&gt; &lt;p&gt;Esta capa intermedia será nuestro punto de comunicación entre la aplicación y los datos; para sustentar esta capa en patrones les diré que en un extremo se encuentra el patrón &lt;b&gt;&lt;a href=&quot;http://msaspnetmvc2.blogspot.com/2011/03/facade-pattern.html&quot; target=&quot;_blank&quot;&gt;Facade&lt;/a&gt;&lt;/b&gt; y en el otro extremo el patrón &lt;b&gt;&lt;a href=&quot;http://msaspnetmvc2.blogspot.com/2011/01/view-models.html&quot; target=&quot;_blank&quot;&gt;ViewModel&lt;/a&gt;&lt;/b&gt;. &lt;p&gt;Una &lt;b&gt;&lt;a href=&quot;http://msaspnetmvc2.blogspot.com/2011/03/facade-pattern.html&quot; target=&quot;_blank&quot;&gt;Facade&lt;/a&gt;&amp;nbsp;&lt;/b&gt; (es una fachada) por ejemplo una interface que debe enviar y recibir datos, estos datos deben ser tipificados para conseguir la relación, pero al mismo tiempo la independencia con respecto a la capa superior. &lt;p&gt;En esta capa se reciben los datos en forma de &lt;b&gt;&lt;a href=&quot;http://msaspnetmvc2.blogspot.com/2011/01/view-models.html&quot; target=&quot;_blank&quot;&gt;ViewModels&lt;/a&gt;&amp;nbsp;&lt;/b&gt; que se traducen en términos del modelo, para mantener la independencia entre las capas; si se presentará un cambio a nivel de los datos solo afectaría hacia un lado de la relación. &lt;p&gt;&amp;nbsp; &lt;h4&gt;Capa de presentación (Punto 2)&lt;/h4&gt; &lt;p&gt;Continuando con la aplicación de patrones, en esta capa usaremos el patrón &lt;b&gt;MVP&lt;/b&gt; con sus siglas en ingles, &lt;b&gt;Model-View-Presenter&lt;/b&gt;; contendrá interfaces para que sean implementadas por las formas web, lo cual refuerza la independencia de las capas. &lt;p&gt;&amp;nbsp; &lt;h3&gt;Capa a nivel del usuario (Punto 1)&lt;/h3&gt; &lt;p&gt;El reto más grande con respecto a la arquitectura ASP, es lograr que el control de que reside en la interfaz de usuario se traslade hacia las capas inferiores, para evitar que esta sea la que se encargue de crear los objetos, para ser una receptora de los mismos. &lt;p&gt;Esta acción es muy compleja de codificar, por lo cual vamos a apoyarnos en una biblioteca gratuita que podemos descargar de &lt;a href=&quot;http://sourceforge.net/projects/structuremap&quot; target=&quot;_blank&quot;&gt;aquí&lt;/a&gt;.  &lt;p&gt;&amp;nbsp; &lt;h4&gt;Comentario Final&lt;/h4&gt; &lt;p&gt;Este articulo podría parecer muy abstracto (y hasta cierto punto lo es), sin embargo si han leído los artículos que previamente publique en este mismo blog, deben tener las bases para entender lo que vamos a hacer. &lt;p&gt;Si no es el caso y les resulta confuso, entonces deben leer los siguientes artículos, ya que en ellos voy a desarrollar un ejemplo; podemos decir que este artículo es la introducción y deben leerlo para poder entender el ejemplo. &lt;p&gt;Y no se olviden: &lt;i&gt;El poder del código solo es completo, si tenemos el conocimiento de cómo usarlo.&lt;/i&gt;&lt;/p&gt;  </content><link rel='replies' type='application/atom+xml' href='http://msaspnetmvc2.blogspot.com/feeds/4100985154150412559/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://msaspnetmvc2.blogspot.com/2011/10/aspnet-sobre-capas.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3367264543642289030/posts/default/4100985154150412559'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3367264543642289030/posts/default/4100985154150412559'/><link rel='alternate' type='text/html' href='http://msaspnetmvc2.blogspot.com/2011/10/aspnet-sobre-capas.html' title='ASP.NET sobre capas'/><author><name>jose ojeda</name><uri>https://plus.google.com/101071729884870810170</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/--xIfvUuN_Vg/AAAAAAAAAAI/AAAAAAAAmFs/5nf-iRGa4Vg/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3367264543642289030.post-5543987726235845125</id><published>2011-10-25T06:51:00.001-07:00</published><updated>2011-10-25T06:51:04.340-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Arquitectura"/><category scheme="http://www.blogger.com/atom/ns#" term="Patrones"/><title type='text'>Como determinar que patrón usar.</title><content type='html'>&lt;p align=&quot;justify&quot;&gt;Conocerlos y haberlos usado en alguna ocasión o por ejemplos, no es suficiente para poder determinar cuál sería el patrón que mejor se adapta a nuestro problema, incluso podría no ser necesario usar alguno. &lt;p align=&quot;justify&quot;&gt;Según mi propia experiencia puedo darles algunas ideas…&lt;/p&gt; &lt;a name=&#39;more&#39;&gt;&lt;/a&gt; &lt;h4 align=&quot;justify&quot;&gt;Lineamientos&lt;/h4&gt; &lt;p align=&quot;justify&quot;&gt;Estos consejos no son más que la forma en que llevo a cabo un flujo mental para tratar de determinar cual patrón debo emplear en mis proyectos: &lt;ol&gt; &lt;li&gt; &lt;div align=&quot;justify&quot;&gt;Lo primero es conocerlos. Si no los conoces no podrás aplicarlos.&lt;/div&gt;&lt;/li&gt; &lt;li&gt; &lt;div align=&quot;justify&quot;&gt;Antes de tratar de entender un patrón es importante tener bases firmes sustentadas en el conocimiento de los principios de desarrollo.&lt;/div&gt;&lt;/li&gt; &lt;li&gt; &lt;div align=&quot;justify&quot;&gt;Antes de decidir emplear un patrón investigar sobre las variantes de implementación conocidas.&lt;/div&gt;&lt;/li&gt; &lt;li&gt; &lt;div align=&quot;justify&quot;&gt;Se debe tener cuidado con respecto al tiempo que podría llevarnos realizar la implementación de un patrón, podría ser un factor determinante para evitarlo o descubrir que no es viable.&lt;/div&gt;&lt;/li&gt; &lt;li&gt; &lt;div align=&quot;justify&quot;&gt;Es muy importante poder generalizar el problema que vamos a solucionar, descomponerlo en piezas y tratar de verlo lo más genérico posible antes de empezar a codificar.&lt;/div&gt;&lt;/li&gt; &lt;li&gt; &lt;div align=&quot;justify&quot;&gt;Un problema debe verse desde diferentes puntos de vista, piensa en él como una pieza de un rompecabezas, a la cual tratas de colocar en un lugar y a veces debes cambiar su posición, para hacerla encajar y muchas veces esta pieza no encaja donde trataste de ponerla, pero mientras la observas descubres donde va.&lt;/div&gt;&lt;/li&gt; &lt;li&gt; &lt;div align=&quot;justify&quot;&gt;Los patrones están clasificados dentro de tres grandes grupos: Creacionales, estructurales y de comportamiento así que mientras analizas el problema debes tener en cuanta a que grupo pertenece tu problema en particular.&lt;/div&gt;&lt;/li&gt; &lt;li&gt; &lt;div align=&quot;justify&quot;&gt;Una vez que has identificado a qué grupo pertenece es muy importante tratar de ver el código en la evolución de la aplicación como un todo, podría tratarse de un código estático e inmutable a través del tiempo, pero podría ser una regla de negocios que evolucionara con el paso del tiempo.&lt;/div&gt;&lt;/li&gt; &lt;li&gt; &lt;div align=&quot;justify&quot;&gt;Evita re inventar lo que ya fue hecho con anterioridad, si analizas el problema con detenimiento podrás descubrir que se trata de algo que ya fue hecho en el proyecto antes de volver a escribir ese código, posiblemente de otra forma, con lo que tendrías la misma solución en dos lugares de dos formas distintas.&lt;/div&gt;&lt;/li&gt; &lt;li&gt; &lt;div align=&quot;justify&quot;&gt;Que hacer si el código ya fue liberado y descubres que podría hacerse mejor con un patrón?&lt;/div&gt;&lt;/li&gt; &lt;li&gt; &lt;div align=&quot;justify&quot;&gt;No temas refactorizar, la refactorización ocurre a nivel de código y no debe afectar el comportamiento de nuestro método.&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt; &lt;h4 align=&quot;justify&quot;&gt;Comentario final&lt;/h4&gt; &lt;p align=&quot;justify&quot;&gt;La mejor forma de sacar el máximo provecho de una herramienta de desarrollo es aprendiendo a usarla, conociendo sus atajos y formas de mejorar su desempeño; al escribir código debemos descubrir entre las líneas de código, esas situaciones que se repiten y que forman parte de algún patrón al codificar. &lt;p&gt;Y no se olviden: &lt;i&gt;El poder del código solo es completo, si tenemos el conocimiento de cómo usarlo.&lt;/i&gt;&lt;/p&gt;  </content><link rel='replies' type='application/atom+xml' href='http://msaspnetmvc2.blogspot.com/feeds/5543987726235845125/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://msaspnetmvc2.blogspot.com/2011/10/como-determinar-que-patron-usar.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3367264543642289030/posts/default/5543987726235845125'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3367264543642289030/posts/default/5543987726235845125'/><link rel='alternate' type='text/html' href='http://msaspnetmvc2.blogspot.com/2011/10/como-determinar-que-patron-usar.html' title='Como determinar que patrón usar.'/><author><name>jose ojeda</name><uri>https://plus.google.com/101071729884870810170</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/--xIfvUuN_Vg/AAAAAAAAAAI/AAAAAAAAmFs/5nf-iRGa4Vg/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3367264543642289030.post-2845530122936847561</id><published>2011-10-24T14:52:00.001-07:00</published><updated>2011-10-24T14:52:19.213-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="anti-pattern"/><category scheme="http://www.blogger.com/atom/ns#" term="ASP"/><category scheme="http://www.blogger.com/atom/ns#" term="Patrones"/><title type='text'>Anti patrón Smart UI.</title><content type='html'>&lt;p align=&quot;justify&quot;&gt;Quien no ha escrito una aplicación urgente agregando controles a una página o formulario y por la facilidad que nos ofrecen las herramientas de desarrollo como Visual Studio, agregamos código a los eventos en la misma interface, después de todo es algo rápido y no va a servir más que para esta vez. &lt;p align=&quot;justify&quot;&gt;Además si lo podemos hacer, es porque la herramienta lo permite, entonces no debe ser mal, no? Pues no es así, es una mala práctica que no debemos repetir… &lt;div align=&quot;justify&quot;&gt; &lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;/div&gt; &lt;h3 align=&quot;justify&quot;&gt;Código en la interface&lt;/h3&gt; &lt;p align=&quot;justify&quot;&gt;Quienes empezamos a escribir código antes del .NET, vivimos en una época donde el código y los controles se entremezclaban para crear una aplicación; pero también sufrimos con todos los problemas que esto acarrea.  &lt;p align=&quot;justify&quot;&gt;Hoy en día es sabido por todos que el código y los controles no deben estar en el mismo lugar, aun que es probable que encontremos algunos viejos lobos solitarios que no han modificado esa ancestral practica, a la cual se le conoce como un anti patrón. &lt;p align=&quot;justify&quot;&gt;Los anti patrones son patrones que son usados comúnmente, pero que en realidad son inefectivos, incluso es contra producente su aplicación; podríamos simplificarlo diciendo que se trata de un mal habito de programación. &lt;p align=&quot;justify&quot;&gt;&amp;nbsp; &lt;h3 align=&quot;justify&quot;&gt;ASP&lt;/h3&gt; &lt;p align=&quot;justify&quot;&gt;Si trabajaron con el ASP antes del .NET, en sus inicios saben de que estoy hablando, el código HTML entre mezclado con el código de VB era un caos; el mantenimiento y las modificaciones un dolor de cabeza. &lt;p align=&quot;justify&quot;&gt;La reutilización era casi imposible, algunos inventamos formas de reutilizar el código pero en vez de ser útil, terminaba siendo una pérdida de tiempo. &lt;p align=&quot;justify&quot;&gt;Incluso hoy en día es muy fácil caer en la tentación de repetir esta mala práctica, pensando que no le hacemos daño a nadie sobre todo si nosotros somos los que vamos a darle mantenimiento a la “pequeña aplicación” que nos solicitaron, quizás una utilería, o que se yo. &lt;p align=&quot;justify&quot;&gt;Lo cierto es que si afectamos severamente a alguien…a nosotros mismos. &lt;p align=&quot;justify&quot;&gt;&amp;nbsp; &lt;h3 align=&quot;justify&quot;&gt;Codificar primero&lt;/h3&gt; &lt;p align=&quot;justify&quot;&gt;El problema radica en sentir que somos expertos y que a nosotros no nos pasara, que nosotros si podemos escribir el código sin tener que hacer uso de diseños, pensar que podremos controlarlo. &lt;p align=&quot;justify&quot;&gt;El peor error de un programador es escribir el código sin antes haberlo entendido, sin elaborar el más pequeño diagrama o cuando menos conceptualizar lo que vamos a codificar. &lt;p align=&quot;justify&quot;&gt;Lo más común es que nuestro código resulte en una serie de problemas que difícilmente podemos reparar: &lt;ul&gt; &lt;li&gt; &lt;div align=&quot;justify&quot;&gt;Dependencia entre las clases&lt;/div&gt;&lt;/li&gt; &lt;li&gt; &lt;div align=&quot;justify&quot;&gt;Ausencia de capas&lt;/div&gt;&lt;/li&gt; &lt;li&gt; &lt;div align=&quot;justify&quot;&gt;Y un sinfín más de problemas.&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt; &lt;h3 align=&quot;justify&quot;&gt;Que debo saber para poder usar los patrones apropiadamente?&lt;/h3&gt; &lt;p align=&quot;justify&quot;&gt;Los patrones no son la solución a todos nuestros problemas, para poder sacar provecho de ellos, es necesario conocerlos, aprender cómo se lleva a cabo su implementación, probar las variantes que existen y conocer las fortalezas y debilidades. &lt;p align=&quot;justify&quot;&gt;Es necesario saber leer los requerimientos para poder detectar la necesidad de alguno de ellos en nuestro código; al principio resulta complicado, pero conforme los tenemos en cuanta y nos hacemos disciplinados en nuestro proceso de codificación, avanzaremos en le dominio de estas increíbles herramientas al escribir código. &lt;p align=&quot;justify&quot;&gt;&amp;nbsp; &lt;h3 align=&quot;justify&quot;&gt;Nueva etapa del Blog&lt;/h3&gt; &lt;p align=&quot;justify&quot;&gt;En esta nueva etapa del Blog, me encuentro en preparación de un proyecto para un cliente, pero por requerimientos específicos, debe ser ASP.NET, no MVC; lo cual quiero llevar a cabo de la mejor manera posible, aplicando patrones a todas las etapas del desarrollo. &lt;p align=&quot;justify&quot;&gt;En este blog estaré comentando el avance y ejemplificando el uso y la implementación de patrones con ASP.NET. &lt;p align=&quot;justify&quot;&gt;Y no se olviden: &lt;em&gt;El poder del código solo es completo, si tenemos el conocimiento de cómo usarlo.&lt;/em&gt;&lt;/p&gt;  </content><link rel='replies' type='application/atom+xml' href='http://msaspnetmvc2.blogspot.com/feeds/2845530122936847561/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://msaspnetmvc2.blogspot.com/2011/10/anti-patron-smart-ui.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3367264543642289030/posts/default/2845530122936847561'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3367264543642289030/posts/default/2845530122936847561'/><link rel='alternate' type='text/html' href='http://msaspnetmvc2.blogspot.com/2011/10/anti-patron-smart-ui.html' title='Anti patrón Smart UI.'/><author><name>jose ojeda</name><uri>https://plus.google.com/101071729884870810170</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/--xIfvUuN_Vg/AAAAAAAAAAI/AAAAAAAAmFs/5nf-iRGa4Vg/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3367264543642289030.post-5969038531652753019</id><published>2011-10-11T09:12:00.001-07:00</published><updated>2011-10-11T09:12:23.923-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="MVC 3"/><category scheme="http://www.blogger.com/atom/ns#" term="Scaffolding"/><title type='text'>Andamios?</title><content type='html'>&lt;p&gt;En la versión anterior de MVC de Microsoft, la 2.0 encontré en repetidas ocasiones la palabra &lt;b&gt;Scaffolding&lt;/b&gt;. La traducción literal es ANDAMIO, a pesar que investigue sobre ella, la tecnología en ese momento era más limitada. &lt;p&gt;En MVC 2 podemos crear automáticamente los &lt;b&gt;Controllers&lt;/b&gt; y las Vistas con un simple clic en el lugar apropiado. En la nueva versión MVC 3 los programadores han ido mas allá, permitiéndonos crear de forma automática el código del cual podemos partir. &lt;p&gt;Si la versión anterior me pareció un gran avance, esta nueva versión es mucho mejor.&lt;/p&gt; &lt;a name=&#39;more&#39;&gt;&lt;/a&gt; &lt;h4&gt;Que necesito?&lt;/h4&gt; &lt;p&gt;Para poder usar esta nueva herramienta es necesario instalar la versión del MVC 3, lo cual puede llevarse a cabo sin tener que desinstalar la versión previa. &lt;p&gt;Una vez instalado podemos acceder a la tecnología &lt;b&gt;&lt;a href=&quot;http://visualstudiogallery.msdn.microsoft.com/27077b70-9dad-4c64-adcf-c7cf6bc9970c&quot; target=&quot;_blank&quot;&gt;NuGet&lt;/a&gt;&lt;/b&gt;&amp;nbsp; la cual es un código gratuito y su objetivo es ampliar las posibilidades de integración de bibliotecas de terceros a la plataforma de .NET. &lt;h4&gt;Ejemplo&lt;/h4&gt; &lt;p&gt;1.- Crear un proyecto nuevo con MVC 3. &lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/-ykwG5QG68zg/TpRqwUyyX5I/AAAAAAAAEaQ/VSdpbRfSEJI/s1600-h/scaf1%25255B2%25255D.jpg&quot;&gt;&lt;img style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px&quot; title=&quot;scaf1&quot; border=&quot;0&quot; alt=&quot;scaf1&quot; src=&quot;http://lh4.ggpht.com/-DErrGvMgRFk/TpRqwxaoGrI/AAAAAAAAEaY/IPrsLXqzYBE/scaf1_thumb.jpg?imgmax=800&quot; width=&quot;244&quot; height=&quot;170&quot;&gt;&lt;/a&gt; &lt;p&gt;2.- Seleccionamos el tipo de motor de vistas. (Próximamente hablare del RAZOR). &lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/-jRUhtQ5WwX8/TpRqxultSTI/AAAAAAAAEag/-Sq-4rbEvBM/s1600-h/scaf2%25255B2%25255D.jpg&quot;&gt;&lt;img style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px&quot; title=&quot;scaf2&quot; border=&quot;0&quot; alt=&quot;scaf2&quot; src=&quot;http://lh3.ggpht.com/-RkuqxZqOo54/TpRqx8BzsBI/AAAAAAAAEao/9qiUR-CBUeY/scaf2_thumb.jpg?imgmax=800&quot; width=&quot;244&quot; height=&quot;221&quot;&gt;&lt;/a&gt; &lt;p&gt;3.- En la carpeta de MODEL, creamos una clase: &lt;p&gt;&lt;a href=&quot;http://lh3.ggpht.com/-sk6ClyR_HOY/TpRqy-q7GJI/AAAAAAAAEaw/mufchaorAIc/s1600-h/scaf3%25255B2%25255D.jpg&quot;&gt;&lt;img style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px&quot; title=&quot;scaf3&quot; border=&quot;0&quot; alt=&quot;scaf3&quot; src=&quot;http://lh4.ggpht.com/-iAXJXsCl-c0/TpRqzdq23oI/AAAAAAAAEa4/LjkSb38EEB0/scaf3_thumb.jpg?imgmax=800&quot; width=&quot;230&quot; height=&quot;244&quot;&gt;&lt;/a&gt; &lt;p&gt;4.- Lo compilamos y abrimos la ventana de &lt;b&gt;NuGet&lt;/b&gt;: &lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/-T2PQRBkwvKI/TpRqz2bEpJI/AAAAAAAAEbA/vkt-s0kgeHY/s1600-h/scaf4%25255B2%25255D.jpg&quot;&gt;&lt;img style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px&quot; title=&quot;scaf4&quot; border=&quot;0&quot; alt=&quot;scaf4&quot; src=&quot;http://lh4.ggpht.com/-kWox-TfSMhU/TpRq0Wp-6YI/AAAAAAAAEbI/6K-NDYIiUuw/scaf4_thumb.jpg?imgmax=800&quot; width=&quot;244&quot; height=&quot;175&quot;&gt;&lt;/a&gt; &lt;p&gt;5.- En la parte inferior se abrirá una ventana tipo consola que nos permite escribir comandos en ella: &lt;p&gt;&lt;a href=&quot;http://lh3.ggpht.com/-i3miL7wVRiQ/TpRq1D7ex4I/AAAAAAAAEbQ/AFHyIxyyGMs/s1600-h/scaf5%25255B2%25255D.jpg&quot;&gt;&lt;img style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px&quot; title=&quot;scaf5&quot; border=&quot;0&quot; alt=&quot;scaf5&quot; src=&quot;http://lh3.ggpht.com/-uw7qqS_YoPU/TpRq1olExDI/AAAAAAAAEbY/0WqIwmVLSC0/scaf5_thumb.jpg?imgmax=800&quot; width=&quot;244&quot; height=&quot;52&quot;&gt;&lt;/a&gt; &lt;p&gt;6.- Escriban: &lt;b&gt;Scaffold Controller&lt;/b&gt; Producto &lt;p&gt;&lt;strong&gt;Observación&lt;/strong&gt;: La palabra producto es el nombre de la clase que queremos usar para crear el código automático. &lt;p&gt;7.- La ventana de la consola presentara algo como esto: &lt;p&gt;&lt;a href=&quot;http://lh6.ggpht.com/-jZfKrQDP0vM/TpRq2RhcCVI/AAAAAAAAEbg/qCIEqfP0kPw/s1600-h/scaf6%25255B2%25255D.jpg&quot;&gt;&lt;img style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px&quot; title=&quot;scaf6&quot; border=&quot;0&quot; alt=&quot;scaf6&quot; src=&quot;http://lh4.ggpht.com/-u7UFTgWopF0/TpRq4aWOIKI/AAAAAAAAEbo/KbTAGT3XBV8/scaf6_thumb.jpg?imgmax=800&quot; width=&quot;244&quot; height=&quot;87&quot;&gt;&lt;/a&gt; &lt;p&gt;8.- En nuestro proyecto aparecerán los siguientes elementos: &lt;p&gt;&lt;a href=&quot;http://lh3.ggpht.com/-BA6u0i_3hm8/TpRq4yEnROI/AAAAAAAAEbw/GCm9eD6KqdM/s1600-h/scaf7%25255B2%25255D.jpg&quot;&gt;&lt;img style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px&quot; title=&quot;scaf7&quot; border=&quot;0&quot; alt=&quot;scaf7&quot; src=&quot;http://lh6.ggpht.com/-BSh0xmRyXUI/TpRq5Qrc_wI/AAAAAAAAEb4/Ff3PwG90Sp0/scaf7_thumb.jpg?imgmax=800&quot; width=&quot;116&quot; height=&quot;244&quot;&gt;&lt;/a&gt; &lt;ul&gt; &lt;li&gt;En la carpeta de Controllers: ProductoController.&lt;/li&gt; &lt;li&gt;En la carpeta de Model: STInventoryContext&lt;/li&gt; &lt;li&gt;En la carpeta de &lt;b&gt;Views&lt;/b&gt; aparecerá una carpeta denominada Producto que contendrá las vistas.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;9.- En este punto la aplicación es completamente funcional. &lt;p&gt;Si tienen instalado SQL Express en la maquina, mediante &lt;b&gt;EFCodeFirts&lt;/b&gt; se conectara y creara los elementos necesarios para que se convierta en una aplicación. &lt;p&gt;&amp;nbsp; &lt;h4&gt;Comentario final&lt;/h4&gt; &lt;p&gt;Después de varios mese de estar desconectado de este Blog, voy a tratar de retomarlo a partir del día de hoy, con MVC 3. &lt;p&gt;Aun estoy empezando a probarlo y la verdad creo que me espere mucho para hacerlo…nos estamos viendo. &lt;p&gt;Suerte.         </content><link rel='replies' type='application/atom+xml' href='http://msaspnetmvc2.blogspot.com/feeds/5969038531652753019/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://msaspnetmvc2.blogspot.com/2011/10/andamios.html#comment-form' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3367264543642289030/posts/default/5969038531652753019'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3367264543642289030/posts/default/5969038531652753019'/><link rel='alternate' type='text/html' href='http://msaspnetmvc2.blogspot.com/2011/10/andamios.html' title='Andamios?'/><author><name>jose ojeda</name><uri>https://plus.google.com/101071729884870810170</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/--xIfvUuN_Vg/AAAAAAAAAAI/AAAAAAAAmFs/5nf-iRGa4Vg/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/-DErrGvMgRFk/TpRqwxaoGrI/AAAAAAAAEaY/IPrsLXqzYBE/s72-c/scaf1_thumb.jpg?imgmax=800" height="72" width="72"/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3367264543642289030.post-1695167432393230991</id><published>2011-05-19T07:57:00.001-07:00</published><updated>2011-05-19T07:59:23.760-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Interfaces"/><category scheme="http://www.blogger.com/atom/ns#" term="Patron Repositorio"/><category scheme="http://www.blogger.com/atom/ns#" term="Repositorio"/><title type='text'>DisposeCurrent</title><content type='html'>En las aplicaciones que desarrollamos siempre debemos tener en cuenta la posibilidad de quedarnos sin memoria; aun que casi siempre le dejamos esta tarea a nuestro buen amigo El Garbage Collector. &lt;br /&gt;Lo cierto es que no podemos predecir en qué momento va a pasar a nuestra puerta a recoger la basura. Así mismo el Recolector no podrá realizar su trabajo adecuadamente si le ponemos una cadena y un candado a nuestro bote de basura, no creen? &lt;br /&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;Esto ocurre cuando nuestras aplicaciones emplean una estructura de clases compleja y los recursos que se están liberando no pueden ser o no deberían ser removidos aun, en vista que podrían estar realizando alguna actividad que se atraso. &lt;br /&gt;La recomendación que nos hace Microsoft es que usemos el patrón Try Catch para poder atender situaciones de este tipo, en aquellas clases que pudieran encontrarse en ese escenario. &lt;br /&gt;En un &lt;a href=&quot;http://msaspnetmvc2.blogspot.com/2011/02/patron-de-repositorio-y-patron-de.html&quot; target=&quot;_blank&quot;&gt;articulo&lt;/a&gt;&amp;nbsp; que publique en febrero de este año presente un ejemplo donde definía una interface que empleaba un método que no desarrolle en dicho articulo, &lt;a href=&quot;http://www.blogger.com/profile/03688519073622912398&quot; target=&quot;_blank&quot;&gt;Lau&lt;/a&gt;&amp;nbsp; me solicito un ejemplo desde Abril y debido ala carga de trabajo no había podido atender su solicitud, así que hoy pondremos un ejemplo que es el complemento de dicho &lt;a href=&quot;http://www.blogger.com/profile/03688519073622912398.&quot; target=&quot;_blank&quot;&gt;articulo&lt;/a&gt; . &lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;h4&gt;Ejemplo:&lt;/h4&gt;En ese ejemplo se presenta el patrón de repositorio, si observan con detenimiento tanto en la definición de la interface como en la clase que lo implementa podemos identificar una interface que se relacionan con el tema: IDisposable. &lt;br /&gt;En el último párrafo de código aparece la región donde se implementa esta interface, pero aparece contraída, así que a continuación la voy a presentar para que puedan ver la forma en que se implementa: &lt;br /&gt;&lt;a href=&quot;http://lh6.ggpht.com/_e_QYGLfOt1I/TdUv1oOSQuI/AAAAAAAABuk/C3sLTibwUgU/s1600-h/idisp2%5B2%5D.jpg&quot;&gt;&lt;img alt=&quot;idisp2&quot; border=&quot;0&quot; height=&quot;92px&quot; src=&quot;http://lh4.ggpht.com/_e_QYGLfOt1I/TdUv2OJ2eII/AAAAAAAABuo/PHITUUJe7Og/idisp2_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;idisp2&quot; width=&quot;244px&quot; /&gt;&lt;/a&gt; &lt;br /&gt;En este primer párrafo vemos un destructor mismo que llama al método Dispose usando como parámetro un valor false, esta es la forma que pertenece al patrón recomendado por Microsoft para que se emplee en este tipo de situaciones: &lt;br /&gt;&lt;a href=&quot;http://lh5.ggpht.com/_e_QYGLfOt1I/TdUv2XWq5KI/AAAAAAAABus/N8a_BHDuZY8/s1600-h/idisp1%5B2%5D.jpg&quot;&gt;&lt;img alt=&quot;idisp1&quot; border=&quot;0&quot; height=&quot;119px&quot; src=&quot;http://lh5.ggpht.com/_e_QYGLfOt1I/TdUv23WQBWI/AAAAAAAABuw/q5GJVFmrWDo/idisp1_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;idisp1&quot; width=&quot;244px&quot; /&gt;&lt;/a&gt; &lt;br /&gt;En este segundo párrafo podemos ver que se llama un método Dispose que recibe un parámetro true y justamente después se llama al Garbage Collector pasándole como parámetro el objeto que lo está llamando. &lt;br /&gt;&lt;a href=&quot;http://lh6.ggpht.com/_e_QYGLfOt1I/TdUv3RVb6WI/AAAAAAAABu0/5rxpb9ojqDs/s1600-h/idisp3%5B2%5D.jpg&quot;&gt;&lt;img alt=&quot;idisp3&quot; border=&quot;0&quot; height=&quot;186px&quot; src=&quot;http://lh3.ggpht.com/_e_QYGLfOt1I/TdUv30nybMI/AAAAAAAABu4/gve229qzzvM/idisp3_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;idisp3&quot; width=&quot;244px&quot; /&gt;&lt;/a&gt; &lt;br /&gt;En este último método que es llamado por los dos métodos anteriores, con diferente parámetro, podemos observar que cuando el destructor llama al Dispose, este no destruye la referencia que se creó al principio de nuestro ejemplo; sin embargo cuando es llamado al momento de tratar de disponer de el nuestro Garbage Collector, entonces si podemos ver la forma como se libera un recurso que por su naturaleza podría no haber sido liberado aun, y que se declaro al principio de esta clase, creando una relación con esta. &lt;br /&gt;Espero que este ejemplo sirva para concluir la idea que en el artículo anterior quedo a medias. &lt;br /&gt;Suerte.</content><link rel='replies' type='application/atom+xml' href='http://msaspnetmvc2.blogspot.com/feeds/1695167432393230991/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://msaspnetmvc2.blogspot.com/2011/05/disposecurrent.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3367264543642289030/posts/default/1695167432393230991'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3367264543642289030/posts/default/1695167432393230991'/><link rel='alternate' type='text/html' href='http://msaspnetmvc2.blogspot.com/2011/05/disposecurrent.html' title='DisposeCurrent'/><author><name>jose ojeda</name><uri>https://plus.google.com/101071729884870810170</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/--xIfvUuN_Vg/AAAAAAAAAAI/AAAAAAAAmFs/5nf-iRGa4Vg/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/_e_QYGLfOt1I/TdUv2OJ2eII/AAAAAAAABuo/PHITUUJe7Og/s72-c/idisp2_thumb.jpg?imgmax=800" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3367264543642289030.post-470916074637583011</id><published>2011-04-12T16:10:00.001-07:00</published><updated>2011-04-12T16:12:10.625-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Http Handler"/><category scheme="http://www.blogger.com/atom/ns#" term="MVC"/><category scheme="http://www.blogger.com/atom/ns#" term="Web Forms"/><title type='text'>Image Handler (MVC y WebForms)</title><content type='html'>&lt;div align=&quot;justify&quot;&gt;En una aplicación web , cualquier pista que le permitamos obtener a un hacker, es suficiente para que tengan alguna idea de cómo está organizado nuestro sitio, o simplemente saber cuál es el sistema operativo, etc. Algo tan simple como la ruta de una imagen al ser obtenida del sitio puede ser suficiente. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&amp;nbsp; &lt;/div&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;div align=&quot;justify&quot;&gt;&lt;/div&gt;&lt;h4 align=&quot;justify&quot;&gt;Http Handler&lt;/h4&gt;&lt;div align=&quot;justify&quot;&gt;ASP.NET nos ofrece una funcionalidad que nos permite implementar un HTTP Handler. El principio es simple, cada vez que una página es solicitada la solicitud es atendida por un objeto que implementa la interface IHttpHandler, la cual requiere un método llamado ProcessRequest que se encarga de escribir lo necesario como salida. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;El HTTP Handler implementa la misma interface, y por consiguiente es muy fácil crear un Rest Service que pueda enviar imágenes como resultado. Al handler podemos enviarle parámetros en la misma cadena de solicitud. Si usamos un entero o un Guid, la ruta quedaría encapsulada en la lógica del código de nuestro RestService. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&amp;nbsp; &lt;/div&gt;&lt;h4 align=&quot;justify&quot;&gt;Que necesitamos?&lt;/h4&gt;&lt;div align=&quot;justify&quot;&gt;Un Generic Handler, al cual llamaremos ImageHandler: &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh4.ggpht.com/_e_QYGLfOt1I/TaTbsT02NwI/AAAAAAAABVs/YV_X7WCFaUQ/s1600-h/handler1%5B3%5D.jpg&quot;&gt;&lt;img alt=&quot;handler1&quot; border=&quot;0&quot; height=&quot;166&quot; src=&quot;http://lh5.ggpht.com/_e_QYGLfOt1I/TaTbs0NZnGI/AAAAAAAABVw/BrX_DAjij8c/handler1_thumb%5B1%5D.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;handler1&quot; width=&quot;240&quot; /&gt;&lt;/a&gt; &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;El código original se ve así: &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh6.ggpht.com/_e_QYGLfOt1I/TaTbtcQIQbI/AAAAAAAABV0/C68Unidt_LU/s1600-h/handler2%5B3%5D.jpg&quot;&gt;&lt;img alt=&quot;handler2&quot; border=&quot;0&quot; height=&quot;124&quot; src=&quot;http://lh6.ggpht.com/_e_QYGLfOt1I/TaTbtzgu6JI/AAAAAAAABV4/gOg1fQ_Yl7s/handler2_thumb%5B1%5D.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;handler2&quot; width=&quot;240&quot; /&gt;&lt;/a&gt; &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Nosotros tendremos que escribir el código del método que procesa la solicitud. Primero obtendremos el id que nos envía la pagina, ya sea un entero o un guid. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh5.ggpht.com/_e_QYGLfOt1I/TaTbueKvJbI/AAAAAAAABV8/0FBausH4WGw/s1600-h/hanlder3%5B4%5D.jpg&quot;&gt;&lt;img alt=&quot;hanlder3&quot; border=&quot;0&quot; height=&quot;50&quot; src=&quot;http://lh3.ggpht.com/_e_QYGLfOt1I/TaTbu14vwqI/AAAAAAAABWA/zzp6rRCts_I/hanlder3_thumb%5B2%5D.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;hanlder3&quot; width=&quot;287&quot; /&gt;&lt;/a&gt; &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;En la sección de declaraciones de variables, usaremos la ruta de una imagen default en caso de no encontrar la que se solicita. (Mecanismo no incluido) &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh3.ggpht.com/_e_QYGLfOt1I/TaTbvW2JtnI/AAAAAAAABWE/_27FkPcAPXE/s1600-h/handler4%5B4%5D.jpg&quot;&gt;&lt;img alt=&quot;handler4&quot; border=&quot;0&quot; height=&quot;86&quot; src=&quot;http://lh4.ggpht.com/_e_QYGLfOt1I/TaTbvthhd7I/AAAAAAAABWI/M7EgxIu_YIA/handler4_thumb%5B2%5D.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;handler4&quot; width=&quot;350&quot; /&gt;&lt;/a&gt; &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Con este dato podríamos buscar en nuestra base de datos (código comentado). &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Una vez obtenida la ruta, verificamos que el archivo exista para poder cargarlo: &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh6.ggpht.com/_e_QYGLfOt1I/TaTbwOStv-I/AAAAAAAABWM/se9RpBuutc0/s1600-h/handler5%5B4%5D.jpg&quot;&gt;&lt;img alt=&quot;handler5&quot; border=&quot;0&quot; height=&quot;114&quot; src=&quot;http://lh5.ggpht.com/_e_QYGLfOt1I/TaTbwQOHhzI/AAAAAAAABWQ/zUTMDRymclA/handler5_thumb%5B2%5D.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;handler5&quot; width=&quot;326&quot; /&gt;&lt;/a&gt; &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Regresamos el resultado: &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh6.ggpht.com/_e_QYGLfOt1I/TaTbw1zmgcI/AAAAAAAABWU/0HvY76Ls6Tc/s1600-h/handler6%5B4%5D.jpg&quot;&gt;&lt;img alt=&quot;handler6&quot; border=&quot;0&quot; height=&quot;55&quot; src=&quot;http://lh3.ggpht.com/_e_QYGLfOt1I/TaTbxLl6M9I/AAAAAAAABWY/fvykzj2BWn0/handler6_thumb%5B2%5D.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;handler6&quot; width=&quot;298&quot; /&gt;&lt;/a&gt; &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;En la página el código html debe ser algo así: &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh6.ggpht.com/_e_QYGLfOt1I/TaTbxgx7ShI/AAAAAAAABWc/AX0a8xjgxcE/s1600-h/handler8%5B3%5D.jpg&quot;&gt;&lt;img alt=&quot;handler8&quot; border=&quot;0&quot; height=&quot;39&quot; src=&quot;http://lh6.ggpht.com/_e_QYGLfOt1I/TaTbx28WZeI/AAAAAAAABWg/GWptZyOuLzI/handler8_thumb%5B1%5D.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;handler8&quot; width=&quot;240&quot; /&gt;&lt;/a&gt; &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Cuando ejecutamos nuestra aplicación la página presentara la imagen: &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh5.ggpht.com/_e_QYGLfOt1I/TaTbyWQvnNI/AAAAAAAABWk/javDnDLfvCw/s1600-h/handler9%5B3%5D.jpg&quot;&gt;&lt;img alt=&quot;handler9&quot; border=&quot;0&quot; height=&quot;203&quot; src=&quot;http://lh3.ggpht.com/_e_QYGLfOt1I/TaTbywvv_CI/AAAAAAAABWo/dRrZNZk12qg/handler9_thumb%5B1%5D.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;handler9&quot; width=&quot;240&quot; /&gt;&lt;/a&gt; &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Este ejemplo funciona para MVC y WebForms. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Por ultimo el código completo del handler seria este: &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh4.ggpht.com/_e_QYGLfOt1I/TaTbzTjuspI/AAAAAAAABWs/sGWxXPQDwN4/s1600-h/handler7%5B4%5D.jpg&quot;&gt;&lt;img alt=&quot;handler7&quot; border=&quot;0&quot; height=&quot;250&quot; src=&quot;http://lh4.ggpht.com/_e_QYGLfOt1I/TaTbz3KgBXI/AAAAAAAABWw/1hYbw9XBzaw/handler7_thumb%5B2%5D.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;handler7&quot; width=&quot;299&quot; /&gt;&lt;/a&gt; &lt;/div&gt;El poder del código solo es completo, si tenemos el conocimiento de como usarlo.</content><link rel='replies' type='application/atom+xml' href='http://msaspnetmvc2.blogspot.com/feeds/470916074637583011/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://msaspnetmvc2.blogspot.com/2011/04/image-handler-mvc-y-webforms.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3367264543642289030/posts/default/470916074637583011'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3367264543642289030/posts/default/470916074637583011'/><link rel='alternate' type='text/html' href='http://msaspnetmvc2.blogspot.com/2011/04/image-handler-mvc-y-webforms.html' title='Image Handler (MVC y WebForms)'/><author><name>jose ojeda</name><uri>https://plus.google.com/101071729884870810170</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/--xIfvUuN_Vg/AAAAAAAAAAI/AAAAAAAAmFs/5nf-iRGa4Vg/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh5.ggpht.com/_e_QYGLfOt1I/TaTbs0NZnGI/AAAAAAAABVw/BrX_DAjij8c/s72-c/handler1_thumb%5B1%5D.jpg?imgmax=800" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3367264543642289030.post-5292398475969620686</id><published>2011-04-11T11:17:00.001-07:00</published><updated>2011-04-11T11:18:11.754-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Comments"/><title type='text'>Que tanto debo documentar mi código?</title><content type='html'>&lt;div align=&quot;justify&quot;&gt;Al igual que todos aquellos que sintieron curiosidad por este tema, yo también soy Desarrollador, disfruto solucionando problemas, y no me canso de agregar código a mi aplicación…pero si alguien se atreve a pedirme que agregue documentación a mi código, siento que debo levantarme de mi lugar e irme. &lt;img alt=&quot;Sonrisa&quot; class=&quot;wlEmoticon wlEmoticon-smile&quot; src=&quot;http://lh4.ggpht.com/_e_QYGLfOt1I/TaNFubr_HDI/AAAAAAAABSE/SbKdC-63CSw/wlEmoticon-smile%5B2%5D.png?imgmax=800&quot; style=&quot;border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none;&quot; /&gt; &lt;/div&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;div align=&quot;justify&quot;&gt;En serio lo entiendo, casi siempre que le he pedido a algún programador que agregue comentarios (para no usar la palabra documentación) aun que sea a los métodos, puedo ver la inconformidad en el rostro. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&amp;nbsp; &lt;/div&gt;&lt;h4 align=&quot;justify&quot;&gt;Que es lo que pasa?&lt;/h4&gt;&lt;div align=&quot;justify&quot;&gt;La mayoría de nosotros pensamos que documentar es una pérdida de tiempo, no es cierto?. Pensamos que nuestro tiempo es muy valioso y que debería aprovecharse escribiendo código, no documentándolo…además lo que refuerza esta actitud es que casi siempre trabajamos para mostros mismos, por lo que sentimos que esos comentarios en nuestro propio código están de más, no? &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Pero, cuando pasa el tiempo y debemos utilizar de nuevo ese código, y volvemos a abrir el archivo; cuando vemos el código después de tanto tiempo, sentimos que un mínimo de comentarios nos ayudarían en ese momento, para no tener que leer de nuevo las líneas y tratar de acordarnos que fue lo que hicimos. Y perder el tiempo tratando de recordar. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Y si el código es de otro programador, entonces ahí si queremos comentarios, cuando algunos comentarios estamos agradecidos, ya que una línea donde se explica es mejor que no tener nada. Tal vez sea cuestión de orgullo, de pensar que no necesitamos documentar nuestro código, pero la verdad es que si se necesita. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&amp;nbsp; &lt;/div&gt;&lt;h4 align=&quot;justify&quot;&gt;Como se agrega?&lt;/h4&gt;&lt;div align=&quot;justify&quot;&gt;El Visual Studio nos ofrece tanto a quienes programamos en C# o en VB, la posibilidad de agregar comentarios de una forma simple y fácil de usar. &lt;/div&gt;El VB solo debemos escribir tres apostrofes (‘’’) para ver algo como esto: &lt;br /&gt;&lt;a href=&quot;http://lh4.ggpht.com/_e_QYGLfOt1I/TaNFuxLRyII/AAAAAAAABSI/Zy1ddCjl6J4/s1600-h/comments1%5B3%5D.jpg&quot;&gt;&lt;img alt=&quot;comments1&quot; border=&quot;0&quot; height=&quot;102&quot; src=&quot;http://lh3.ggpht.com/_e_QYGLfOt1I/TaNFvRtqEWI/AAAAAAAABSM/DPsOr8ot0rM/comments1_thumb%5B1%5D.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;comments1&quot; width=&quot;390&quot; /&gt;&lt;/a&gt; &lt;br /&gt;Este comentario es visible cuando estamos en la IDE y usamos el método, el intellisense nos presenta esta información que nos puede servir de guía: &lt;br /&gt;&lt;a href=&quot;http://lh4.ggpht.com/_e_QYGLfOt1I/TaNFv6QhLJI/AAAAAAAABSQ/d9GZD0OqvUQ/s1600-h/comments2%5B3%5D.jpg&quot;&gt;&lt;img alt=&quot;comments2&quot; border=&quot;0&quot; height=&quot;58&quot; src=&quot;http://lh5.ggpht.com/_e_QYGLfOt1I/TaNFwQck2GI/AAAAAAAABSU/JDeQSDC9IPM/comments2_thumb%5B1%5D.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;comments2&quot; width=&quot;451&quot; /&gt;&lt;/a&gt; &lt;br /&gt;&lt;div align=&quot;justify&quot;&gt;Si estamos escribiendo nuestro código en C#, debemos usar tres barras diagonales ( ///). &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Es muy fácil e incluso hace que nuestro código se vea más profesional, este simple detalle nos hace sentir seguros, y le inspira confianza a quien use nuestro código. Animo solo deben comentar el mínimo necesario, no más! &lt;img alt=&quot;Guiño&quot; class=&quot;wlEmoticon wlEmoticon-winkingsmile&quot; src=&quot;http://lh6.ggpht.com/_e_QYGLfOt1I/TaNFwyLn48I/AAAAAAAABSY/AlU4_EApMhQ/wlEmoticon-winkingsmile%5B2%5D.png?imgmax=800&quot; style=&quot;border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none;&quot; /&gt; &lt;/div&gt;&lt;h5&gt;Para mayor referencia pueden visitar estas direcciones (están en ingles):&lt;/h5&gt;Para c#: &lt;a href=&quot;http://msdn.microsoft.com/en-us/magazine/cc302121.aspx&quot;&gt;http://msdn.microsoft.com/en-us/magazine/cc302121.aspx&lt;/a&gt; &lt;br /&gt;Para VB: &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/ms172653(v=VS.80).aspx&quot;&gt;http://msdn.microsoft.com/en-us/library/ms172653(v=VS.80).aspx&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://msaspnetmvc2.blogspot.com/feeds/5292398475969620686/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://msaspnetmvc2.blogspot.com/2011/04/que-tanto-debo-documentar-mi-codigo.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3367264543642289030/posts/default/5292398475969620686'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3367264543642289030/posts/default/5292398475969620686'/><link rel='alternate' type='text/html' href='http://msaspnetmvc2.blogspot.com/2011/04/que-tanto-debo-documentar-mi-codigo.html' title='Que tanto debo documentar mi código?'/><author><name>jose ojeda</name><uri>https://plus.google.com/101071729884870810170</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/--xIfvUuN_Vg/AAAAAAAAAAI/AAAAAAAAmFs/5nf-iRGa4Vg/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/_e_QYGLfOt1I/TaNFubr_HDI/AAAAAAAABSE/SbKdC-63CSw/s72-c/wlEmoticon-smile%5B2%5D.png?imgmax=800" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3367264543642289030.post-339641565349273134</id><published>2011-04-07T07:17:00.001-07:00</published><updated>2011-04-07T07:18:26.368-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Interfaces"/><category scheme="http://www.blogger.com/atom/ns#" term="Yield"/><title type='text'>Diferentes objetos una sola colección</title><content type='html'>&lt;div align=&quot;justify&quot;&gt;A veces nos hacemos una idea y nos aferramos a ella, a veces creemos que algo es posible y nos sentimos motivados cuando avanzamos en la solución y vemos que lo que nos imaginamos se va materializando frente a nuestros ojos. A veces este tipo de situaciones crean un espejismo que nos impide ver lo que en realidad estamos haciendo. Hoy me enfrasque en una tarea que me llevo a codificar un ejemplo para verificar que si era posible lo que me estaba imaginando. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&amp;nbsp; &lt;/div&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;div align=&quot;justify&quot;&gt;&lt;/div&gt;&lt;h4 align=&quot;justify&quot;&gt;Requerimientos&lt;/h4&gt;&lt;div align=&quot;justify&quot;&gt;El proyecto en el que estoy trabajando contiene internamente varios componentes que generan &lt;b&gt;&lt;i&gt;información de diferente tipo&lt;/i&gt;&lt;/b&gt;, el problema es que debo devolver esta información de diferente tipo &lt;b&gt;&lt;i&gt;por medio de una sola clase&lt;/i&gt;&lt;/b&gt;. El reto consiste en poder almacenar cualquier tipo de dato, que pudiera ser agregado a la colección para ser devuelto posteriormente y manipulado en donde se reciba. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&amp;nbsp; &lt;/div&gt;&lt;h4 align=&quot;justify&quot;&gt;Análisis&lt;/h4&gt;&lt;div align=&quot;justify&quot;&gt;Para poder almacenar objetos de diferentes tipos en una colección podemos usar Arreglos, sin embargo la implementación es muy pobre y deja poco margen de maniobra, así que me decidí por usar un diccionario. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&amp;nbsp; &lt;/div&gt;&lt;h4 align=&quot;justify&quot;&gt;Solución Aparente&lt;/h4&gt;&lt;div align=&quot;justify&quot;&gt;Solo necesite dos clases para poder llevar a cabo esta prueba. Una Clase que contuviera internamente los diccionarios de tipos de dato y de objetos. Y otra más para poder exponer los elementos de forma individual. La primera clase se llamo Colección y estaba codificada de esta forma: &lt;/div&gt;Declaraciones y propiedades: &lt;br /&gt;&lt;a href=&quot;http://lh6.ggpht.com/_e_QYGLfOt1I/TZ3HHasn-5I/AAAAAAAABO4/NA4R7iTu_Xw/s1600-h/dif1%5B3%5D.jpg&quot;&gt;&lt;img alt=&quot;dif1&quot; border=&quot;0&quot; height=&quot;128&quot; src=&quot;http://lh4.ggpht.com/_e_QYGLfOt1I/TZ3HH37rTdI/AAAAAAAABO8/ItIkhaW4rVI/dif1_thumb%5B1%5D.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;dif1&quot; width=&quot;240&quot; /&gt;&lt;/a&gt; &lt;br /&gt;Constructor: &lt;br /&gt;&lt;a href=&quot;http://lh4.ggpht.com/_e_QYGLfOt1I/TZ3HIYKtM-I/AAAAAAAABPA/oAaZQoEY_Lw/s1600-h/dif2%5B3%5D.jpg&quot;&gt;&lt;img alt=&quot;dif2&quot; border=&quot;0&quot; height=&quot;72&quot; src=&quot;http://lh5.ggpht.com/_e_QYGLfOt1I/TZ3HIq1hPtI/AAAAAAAABPE/xIYgPIOvi6c/dif2_thumb%5B1%5D.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;dif2&quot; width=&quot;240&quot; /&gt;&lt;/a&gt; &lt;br /&gt;Métodos para agregar y para obtener un elemento: &lt;br /&gt;&lt;a href=&quot;http://lh4.ggpht.com/_e_QYGLfOt1I/TZ3HJIiS2gI/AAAAAAAABPI/ANQGoDDUyWg/s1600-h/dif3%5B4%5D.jpg&quot;&gt;&lt;img alt=&quot;dif3&quot; border=&quot;0&quot; height=&quot;164&quot; src=&quot;http://lh5.ggpht.com/_e_QYGLfOt1I/TZ3HJih9cQI/AAAAAAAABPM/QayEsI0X9xc/dif3_thumb%5B2%5D.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;dif3&quot; width=&quot;320&quot; /&gt;&lt;/a&gt; &lt;br /&gt;Para el método que se emplea en el For Each, se creo una clase que se llamo Par y esta codificada de esta manera: &lt;br /&gt;&lt;a href=&quot;http://lh5.ggpht.com/_e_QYGLfOt1I/TZ3HKKd7-jI/AAAAAAAABPQ/AqPv8OuHgjg/s1600-h/dif4%5B3%5D.jpg&quot;&gt;&lt;img alt=&quot;dif4&quot; border=&quot;0&quot; height=&quot;102&quot; src=&quot;http://lh4.ggpht.com/_e_QYGLfOt1I/TZ3HKg3oJDI/AAAAAAAABPY/bJeDYGBlqrQ/dif4_thumb%5B1%5D.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;dif4&quot; width=&quot;240&quot; /&gt;&lt;/a&gt; &lt;br /&gt;Y por ultimo un método para emplear con el &lt;b&gt;For Each&lt;/b&gt; &lt;br /&gt;&lt;strong&gt;&lt;a href=&quot;http://lh5.ggpht.com/_e_QYGLfOt1I/TZ3HLHS3omI/AAAAAAAABPc/nzeZpL7OqNg/s1600-h/dif10%5B4%5D.jpg&quot;&gt;&lt;img alt=&quot;dif10&quot; border=&quot;0&quot; height=&quot;94&quot; src=&quot;http://lh3.ggpht.com/_e_QYGLfOt1I/TZ3HLh0X08I/AAAAAAAABPg/KfONbgCOfD0/dif10_thumb%5B2%5D.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;dif10&quot; width=&quot;308&quot; /&gt;&lt;/a&gt;&lt;/strong&gt; &lt;br /&gt;Para probarla use una aplicación de consola como siempre: &lt;br /&gt;&lt;a href=&quot;http://lh3.ggpht.com/_e_QYGLfOt1I/TZ3HMR8oD8I/AAAAAAAABPk/cCNcCfrK3R0/s1600-h/dif5%5B5%5D.jpg&quot;&gt;&lt;img alt=&quot;dif5&quot; border=&quot;0&quot; height=&quot;208&quot; src=&quot;http://lh5.ggpht.com/_e_QYGLfOt1I/TZ3HN6DwIEI/AAAAAAAABPo/t9h1W9kNOtA/dif5_thumb%5B3%5D.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;dif5&quot; width=&quot;433&quot; /&gt;&lt;/a&gt; &lt;br /&gt;El resultado es: &lt;br /&gt;&lt;a href=&quot;http://lh4.ggpht.com/_e_QYGLfOt1I/TZ3HOjocrNI/AAAAAAAABPs/4Lb96T5ybFQ/s1600-h/dif6%5B4%5D.jpg&quot;&gt;&lt;img alt=&quot;dif6&quot; border=&quot;0&quot; height=&quot;93&quot; src=&quot;http://lh6.ggpht.com/_e_QYGLfOt1I/TZ3HPWDP_vI/AAAAAAAABPw/SalGTMVdYZU/dif6_thumb%5B2%5D.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;dif6&quot; width=&quot;327&quot; /&gt;&lt;/a&gt; &lt;br /&gt;&lt;h4&gt;&amp;nbsp;&lt;/h4&gt;&lt;h4&gt;Revisión de la solución aparente&lt;/h4&gt;&lt;div align=&quot;justify&quot;&gt;A pesar que aparentemente soluciona nuestro problema, no es la forma correcta de hacerlo. En .NET se han creado todo tipo de colecciones para que puedan ser tipificadas, por lo que hacer algo que use objetos no específicos, es ir en contra de la evolución. Para recuperar objetos es necesario saber de antemano el tipo de objeto que queremos obtener. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;En situaciones como esta lo que debemos hacer es detenemos un momento a pensar en los requerimientos, analizarlos con cuidado, si nos fijamos en el texto podemos identificar donde se creó el espejismo, fue en la parte que dice: “&lt;b&gt;&lt;i&gt;información de diferente tipo… por medio de una sola clase”&lt;/i&gt;&lt;/b&gt;; esto no quiere decir que nosotros debamos implementar un código para manejar objetos de diferente tipo en una misma clase. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&amp;nbsp; &lt;/div&gt;&lt;h4 align=&quot;justify&quot;&gt;Interfaces al rescate&lt;/h4&gt;&lt;div align=&quot;justify&quot;&gt;Dentro del .NET podemos crear interfaces, que son un elemento muy valioso para proyectos con este tipo de complejidades. Si creamos una interface que contenga las propiedades que son comunes a todos los componentes, las que deben ser expuestas y verificamos que todos los componentes que creemos la implementen, entonces podremos crear una sola colección que reciba diferentes objetos pero que al implementar la misma interface, pueden ser tratados como uno mismo tipo. &lt;/div&gt;&amp;nbsp; &lt;br /&gt;&lt;h4&gt;Solución apropiada&lt;/h4&gt;Se requiere una interface y una colección que reciba objetos que implementen esta interface. &lt;br /&gt;La interface quedo así: &lt;br /&gt;&lt;a href=&quot;http://lh6.ggpht.com/_e_QYGLfOt1I/TZ3HP1gNH4I/AAAAAAAABP0/kw1d3Q1Vcy8/s1600-h/dif7%5B3%5D.jpg&quot;&gt;&lt;img alt=&quot;dif7&quot; border=&quot;0&quot; height=&quot;142&quot; src=&quot;http://lh3.ggpht.com/_e_QYGLfOt1I/TZ3HQo-jE7I/AAAAAAAABP4/XA-eEXRn-K4/dif7_thumb%5B1%5D.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;dif7&quot; width=&quot;240&quot; /&gt;&lt;/a&gt; &lt;br /&gt;Nuestra colección quedo de esta forma: &lt;br /&gt;Declaraciones y propiedades: &lt;br /&gt;&lt;a href=&quot;http://lh3.ggpht.com/_e_QYGLfOt1I/TZ3HRTrogaI/AAAAAAAABP8/WtRkRsn_dcQ/s1600-h/dif8%5B4%5D.jpg&quot;&gt;&lt;img alt=&quot;dif8&quot; border=&quot;0&quot; height=&quot;140&quot; src=&quot;http://lh5.ggpht.com/_e_QYGLfOt1I/TZ3HSKeXT_I/AAAAAAAABQA/TdqXeyLU9RQ/dif8_thumb%5B2%5D.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;dif8&quot; width=&quot;256&quot; /&gt;&lt;/a&gt; &lt;br /&gt;Constructor: &lt;br /&gt;&lt;a href=&quot;http://lh4.ggpht.com/_e_QYGLfOt1I/TZ3HSzxzqgI/AAAAAAAABQE/ekXF4MNfa3k/s1600-h/dif13%5B3%5D.jpg&quot;&gt;&lt;img alt=&quot;dif13&quot; border=&quot;0&quot; height=&quot;57&quot; src=&quot;http://lh4.ggpht.com/_e_QYGLfOt1I/TZ3HTtXUrvI/AAAAAAAABQI/hZUg46niVGU/dif13_thumb%5B1%5D.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;dif13&quot; width=&quot;240&quot; /&gt;&lt;/a&gt; &lt;br /&gt;Métodos para agregar y para obtener un elemento: &lt;br /&gt;&lt;a href=&quot;http://lh4.ggpht.com/_e_QYGLfOt1I/TZ3HUZbV9FI/AAAAAAAABQM/a_KuyLvBy2A/s1600-h/dif9%5B5%5D.jpg&quot;&gt;&lt;img alt=&quot;dif9&quot; border=&quot;0&quot; height=&quot;293&quot; src=&quot;http://lh5.ggpht.com/_e_QYGLfOt1I/TZ3HVhgxzQI/AAAAAAAABQQ/SiYuc9mF-_U/dif9_thumb%5B3%5D.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;dif9&quot; width=&quot;401&quot; /&gt;&lt;/a&gt; &lt;br /&gt;Podemos observar que nuestros métodos esperan la interface. &lt;br /&gt;La clase para el método &lt;b&gt;GetCurrent&lt;/b&gt; se llamo Pair y esta codificada de esta manera: &lt;br /&gt;&lt;a href=&quot;http://lh5.ggpht.com/_e_QYGLfOt1I/TZ3HWXrSJlI/AAAAAAAABQU/-xdOgdZkhK8/s1600-h/dif15%5B3%5D.jpg&quot;&gt;&lt;img alt=&quot;dif15&quot; border=&quot;0&quot; height=&quot;83&quot; src=&quot;http://lh6.ggpht.com/_e_QYGLfOt1I/TZ3HXGpMGmI/AAAAAAAABQY/asKLE2iRXgc/dif15_thumb%5B1%5D.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;dif15&quot; width=&quot;240&quot; /&gt;&lt;/a&gt; &lt;br /&gt;Un método para emplear con un &lt;b&gt;For Each:&lt;/b&gt; &lt;br /&gt;&lt;a href=&quot;http://lh5.ggpht.com/_e_QYGLfOt1I/TZ3HXxtkggI/AAAAAAAABQc/O_4iurHHw5w/s1600-h/dif11%5B4%5D.jpg&quot;&gt;&lt;img alt=&quot;dif11&quot; border=&quot;0&quot; height=&quot;103&quot; src=&quot;http://lh5.ggpht.com/_e_QYGLfOt1I/TZ3HYc8CyNI/AAAAAAAABQg/RdVASG2aM94/dif11_thumb%5B2%5D.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;dif11&quot; width=&quot;339&quot; /&gt;&lt;/a&gt; &lt;br /&gt;Las clases deben implementar nuestra Interface, este es el ejemplo de una de ellas: &lt;br /&gt;&lt;a href=&quot;http://lh6.ggpht.com/_e_QYGLfOt1I/TZ3HZMisQeI/AAAAAAAABQk/6q9YdQEL1d8/s1600-h/dif17%5B4%5D.jpg&quot;&gt;&lt;img alt=&quot;dif17&quot; border=&quot;0&quot; height=&quot;205&quot; src=&quot;http://lh5.ggpht.com/_e_QYGLfOt1I/TZ3HZumJk7I/AAAAAAAABQo/EiM1R6T4Sgs/dif17_thumb%5B2%5D.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;dif17&quot; width=&quot;297&quot; /&gt;&lt;/a&gt; &lt;br /&gt;Para probarla use una aplicación de consola como siempre: &lt;br /&gt;&lt;a href=&quot;http://lh6.ggpht.com/_e_QYGLfOt1I/TZ3HadCz3NI/AAAAAAAABQs/KRtXVb9ZR9g/s1600-h/dif12%5B4%5D.jpg&quot;&gt;&lt;img alt=&quot;dif12&quot; border=&quot;0&quot; height=&quot;130&quot; src=&quot;http://lh3.ggpht.com/_e_QYGLfOt1I/TZ3HbOz5P1I/AAAAAAAABQw/GcABAqzLnRs/dif12_thumb%5B2%5D.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;dif12&quot; width=&quot;310&quot; /&gt;&lt;/a&gt; &lt;br /&gt;El resultado es: &lt;br /&gt;&lt;a href=&quot;http://lh4.ggpht.com/_e_QYGLfOt1I/TZ3Hb_4r23I/AAAAAAAABQ0/j7ZMEdA0PnU/s1600-h/dif14%5B3%5D.jpg&quot;&gt;&lt;img alt=&quot;dif14&quot; border=&quot;0&quot; height=&quot;116&quot; src=&quot;http://lh6.ggpht.com/_e_QYGLfOt1I/TZ3HdJ50GMI/AAAAAAAABQ4/btCAFUzbJP4/dif14_thumb%5B1%5D.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;dif14&quot; width=&quot;272&quot; /&gt;&lt;/a&gt; &lt;br /&gt;&lt;h4&gt;&amp;nbsp;&lt;/h4&gt;&lt;h4&gt;Conclusión&lt;/h4&gt;Siempre es importante que nos cuestionemos si lo que estamos haciendo es lo correcto, una solución aparente puede traernos muchos problemas con el tiempo.</content><link rel='replies' type='application/atom+xml' href='http://msaspnetmvc2.blogspot.com/feeds/339641565349273134/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://msaspnetmvc2.blogspot.com/2011/04/diferentes-objetos-una-sola-coleccion.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3367264543642289030/posts/default/339641565349273134'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3367264543642289030/posts/default/339641565349273134'/><link rel='alternate' type='text/html' href='http://msaspnetmvc2.blogspot.com/2011/04/diferentes-objetos-una-sola-coleccion.html' title='Diferentes objetos una sola colección'/><author><name>jose ojeda</name><uri>https://plus.google.com/101071729884870810170</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/--xIfvUuN_Vg/AAAAAAAAAAI/AAAAAAAAmFs/5nf-iRGa4Vg/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/_e_QYGLfOt1I/TZ3HH37rTdI/AAAAAAAABO8/ItIkhaW4rVI/s72-c/dif1_thumb%5B1%5D.jpg?imgmax=800" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3367264543642289030.post-3315561083312252125</id><published>2011-04-05T13:44:00.001-07:00</published><updated>2011-04-05T13:45:17.079-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="DropDownList"/><category scheme="http://www.blogger.com/atom/ns#" term="ViewEngine"/><category scheme="http://www.blogger.com/atom/ns#" term="ViewModels"/><title type='text'>DropDownList en MVC</title><content type='html'>&lt;div align=&quot;justify&quot;&gt;Desde que empecé a trabajar con las versiones beta de MVC, me tope con un reto que no le encontraba ni pies ni cabeza. Algo que siempre fue simple en ASP, resulto ser complicado en MVC. O al menos a si lo parecía. Así es, llenar un combo o Lista desplegable en MVC requería pasos extra, para poder completarse. Cuando vienes de un entorno donde todo se basa en controles y nos limitamos a llenarlos con el resultado de una consulta, el entorno MVC resulta confuso al principio. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;div align=&quot;justify&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;h4 align=&quot;justify&quot;&gt;Views&lt;/h4&gt;&lt;div align=&quot;justify&quot;&gt;En MVC las páginas no existen como en WebPages, lo que se crea se denomina View; las Views son archivos que se limitan a presentar la información que el controller le proporciona al ViewEngine. Una View Tipificada está relacionada a una entidad para poder realizar esta tarea. O sea, cada elemento que se presenta como un control HTML esta en relación a una propiedad de esta clase o entidad. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Dentro del Código que define nuestra View, el Model es nuestra entidad principal, se define en las directivas al principio del código, por lo que podemos acceder a sus propiedades por medio de él. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Si queremos presentar una lista desplegable, entonces debemos proporcionarle al Engine esta información, y esto debe llevarse a cabo desde el controller, ya que según el patrón, el engine no debe realizar ninguna llamada al Model. Debido a esta limitante es necesario recurrir a una estructura que nos permita enviarle al engine la entidad y nuestra lista desplegable. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&amp;nbsp; &lt;/div&gt;&lt;h4 align=&quot;justify&quot;&gt;ViewModel&lt;/h4&gt;&lt;div align=&quot;justify&quot;&gt;Para esta tarea debemos crear una clase especial que se conoce como ViewModel, este término resulta ser uno de los aspectos centrales de la arquitectura MVC. He encontrado muchos artículos donde lo comentan y según vi crea mucha polémica, pero como yo no quiero, mejor veamos cómo se usa. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Se debe crear una clase, con la estructura de datos que requiere nuestra view para poder crearse, se le debe proporcionar la entidad como una de estas propiedades y si queremos una lista desplegable, será necesario agregarle una lista genérica de la entidad que usaremos para llenar nuestro DropDownList. Es importante que le agreguemos una propiedad por medio de la cual se recibirá el ID que el usuario seleccione de la lista: &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh6.ggpht.com/_e_QYGLfOt1I/TZt-arlc2NI/AAAAAAAABNo/6ECwkjHCw5w/s1600-h/vm1%5B3%5D.jpg&quot;&gt;&lt;img alt=&quot;vm1&quot; border=&quot;0&quot; height=&quot;102&quot; src=&quot;http://lh4.ggpht.com/_e_QYGLfOt1I/TZt-bVuP6zI/AAAAAAAABNs/0XXRMcdyksA/vm1_thumb%5B1%5D.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;vm1&quot; width=&quot;240&quot; /&gt;&lt;/a&gt; &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Una vez que se ha creado esta clase, debemos compilar el proyecto para que la nueva clase aparezca en nuestro asistente de View y podamos usar el ViewModel para nuestra vista tipificada. De esta forma nuestra View heredara de nuestra Clase ViewModel. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Al hacer esto nuestro Model contendrá un nivel extra para poder acceder a las propiedades de nuestra entidad: &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh5.ggpht.com/_e_QYGLfOt1I/TZt-bxXO0fI/AAAAAAAABNw/nUlK8XnaivQ/s1600-h/vm2%5B5%5D.jpg&quot;&gt;&lt;img alt=&quot;vm2&quot; border=&quot;0&quot; height=&quot;110&quot; src=&quot;http://lh6.ggpht.com/_e_QYGLfOt1I/TZt-cUpBrgI/AAAAAAAABN0/Yh5f5-8iMcU/vm2_thumb%5B3%5D.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;vm2&quot; width=&quot;389&quot; /&gt;&lt;/a&gt; &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Además será necesario llenar el ViewModel antes de enviárselo al Engine y que se cree nuestra View: &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh4.ggpht.com/_e_QYGLfOt1I/TZt-cxk5RvI/AAAAAAAABN4/4eI9gQAdeng/s1600-h/vm3%5B3%5D.jpg&quot;&gt;&lt;img alt=&quot;vm3&quot; border=&quot;0&quot; height=&quot;84&quot; src=&quot;http://lh5.ggpht.com/_e_QYGLfOt1I/TZt_Dc049hI/AAAAAAAABN8/l6EQQZ-naYU/vm3_thumb%5B1%5D.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;vm3&quot; width=&quot;240&quot; /&gt;&lt;/a&gt; &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&amp;nbsp; &lt;/div&gt;&lt;h4 align=&quot;justify&quot;&gt;Código en View&lt;/h4&gt;&lt;div align=&quot;justify&quot;&gt;En el código del View usaremos un helper: &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh3.ggpht.com/_e_QYGLfOt1I/TZt_EYfm7xI/AAAAAAAABOA/saAugd_fH2s/s1600-h/vm4%5B4%5D.jpg&quot;&gt;&lt;img alt=&quot;vm4&quot; border=&quot;0&quot; height=&quot;84&quot; src=&quot;http://lh6.ggpht.com/_e_QYGLfOt1I/TZt_E_nXl-I/AAAAAAAABOE/G1A0Sx4xD7I/vm4_thumb%5B2%5D.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;vm4&quot; width=&quot;390&quot; /&gt;&lt;/a&gt; &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;La sintaxis del Helper requiere que le enviemos el nombre del elemento, así como nuestra lista Genérica como un enumerable, la siguiente propiedad es el value de la lista desplegable, seguida del texto que se presentara en la lista y por último la propiedad del model donde se almacenara el id seleccionado. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;En la pagina se vería de este modo: &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh6.ggpht.com/_e_QYGLfOt1I/TZt_FQIBqoI/AAAAAAAABOI/mM-i90lJZmA/s1600-h/vm5%5B3%5D.png&quot;&gt;&lt;img alt=&quot;vm5&quot; border=&quot;0&quot; height=&quot;73&quot; src=&quot;http://lh5.ggpht.com/_e_QYGLfOt1I/TZt_Fv__cAI/AAAAAAAABOM/51Mnc9JDz78/vm5_thumb%5B1%5D.png?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;vm5&quot; width=&quot;240&quot; /&gt;&lt;/a&gt; &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;El valor seleccionado regresara a la acción por medio del automatic Binding y podrá ser accesible desde nuestra variable: &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh3.ggpht.com/_e_QYGLfOt1I/TZt_GI2_zYI/AAAAAAAABOQ/x2mIyqzklqU/s1600-h/vm6%5B3%5D.jpg&quot;&gt;&lt;img alt=&quot;vm6&quot; border=&quot;0&quot; height=&quot;166&quot; src=&quot;http://lh4.ggpht.com/_e_QYGLfOt1I/TZt_GiOerYI/AAAAAAAABOU/qaPEVC5FWCg/vm6_thumb%5B1%5D.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;vm6&quot; width=&quot;240&quot; /&gt;&lt;/a&gt; &lt;/div&gt;El poder del código solo es completo, si tenemos el conocimiento de como usarlo.</content><link rel='replies' type='application/atom+xml' href='http://msaspnetmvc2.blogspot.com/feeds/3315561083312252125/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://msaspnetmvc2.blogspot.com/2011/04/dropdownlist-en-mvc.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3367264543642289030/posts/default/3315561083312252125'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3367264543642289030/posts/default/3315561083312252125'/><link rel='alternate' type='text/html' href='http://msaspnetmvc2.blogspot.com/2011/04/dropdownlist-en-mvc.html' title='DropDownList en MVC'/><author><name>jose ojeda</name><uri>https://plus.google.com/101071729884870810170</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/--xIfvUuN_Vg/AAAAAAAAAAI/AAAAAAAAmFs/5nf-iRGa4Vg/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/_e_QYGLfOt1I/TZt-bVuP6zI/AAAAAAAABNs/0XXRMcdyksA/s72-c/vm1_thumb%5B1%5D.jpg?imgmax=800" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3367264543642289030.post-7438154333340155848</id><published>2011-04-01T08:55:00.001-07:00</published><updated>2011-04-01T08:57:13.413-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Controller"/><category scheme="http://www.blogger.com/atom/ns#" term="EF"/><category scheme="http://www.blogger.com/atom/ns#" term="Model"/><category scheme="http://www.blogger.com/atom/ns#" term="Partial View"/><category scheme="http://www.blogger.com/atom/ns#" term="Reglas de Negocio"/><category scheme="http://www.blogger.com/atom/ns#" term="Reglas de Validación"/><category scheme="http://www.blogger.com/atom/ns#" term="ViewModels"/><title type='text'>Validación</title><content type='html'>&lt;div align=&quot;justify&quot;&gt;Ya que hemos emprendido este camino de tratar de hacer las cosas de la mejor forma, no hay vuelta atrás. A partir de que cruzamos esa línea, nos cuestionaremos todo; sin embargo no es malo, por el contrario, resulta ser un proceso de madurez que al ser acompañado por aprendizaje, resulta motivador. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;A veces los temas son conceptuales, y colisionan con nuestros conocimientos y principios sobre algo que ya sabemos, con lo que hemos estado trabajando desde siempre y que de repente se ve inmerso en una lista de dudas; por ejemplo ayer en una plática con el equipo de desarrollo, surgió la pregunta… &lt;/div&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;div align=&quot;justify&quot;&gt;&amp;nbsp; &lt;/div&gt;&lt;h4 align=&quot;justify&quot;&gt;Donde ponemos la validación?&lt;/h4&gt;&lt;div align=&quot;justify&quot;&gt;Y esta pregunta no se origino por el desconocimiento o por no saber cómo hacerlo, simplemente la duda surge porque la arquitectura del proyecto está formada por capas (basada en el patrón MVC), que tiene claramente definidas sus responsabilidades y que pueden realizar el proceso de validación todas y cada una de ellas. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&amp;nbsp; &lt;/div&gt;&lt;h4 align=&quot;justify&quot;&gt;Capas&lt;/h4&gt;&lt;div align=&quot;justify&quot;&gt;UI.- Es la capa que da la cara al mundo, es por medio de esta capa que se recibe la información del usuario. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Controladores.-Hay dos diferentes tipos de clases que son el único medio de acceso a nuestro Framework, son las Clases Controladores o las Clases para atender Servicio. Ambas tienen acceso a un nivel que se encarga de realizar las validaciones, tanto de lógica de negocios como de datos. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Repositorios.- Envía la información recibida a la Capa de Acceso a datos, esta clase implementa el patrón de repositorio y es la única clase que saber cómo se realiza el acceso a datos, o sea encapsula dicha comunicación, para aislar a las capas superiores del origen de datos. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Model.- en este nivel encontramos el Entity Framework, el cual representa el Model y es el que en realidad realiza la plomería de comunicación al almacén de datos, ya sea para hacer persistentes los cambios o para recuperar información. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Base de datos: En la última capa encontramos a la base de datos, con las reglas de información, relaciones y datos que deben proporcionarse. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&amp;nbsp; &lt;/div&gt;&lt;h4 align=&quot;justify&quot;&gt;Tipos de validación&lt;/h4&gt;&lt;div align=&quot;justify&quot;&gt;Aclaremos de ante mano que dentro de la validación común encontramos dos tipos las que son reglas de negocio, que resultaran altamente volátiles y la validación de datos, que muy pocas veces se modifica. Nos concentraremos en la validación de datos, ya que las reglas de negocio son un tema por sí mismas. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Si partimos de la idea que nuestra arquitectura fue diseñada para que las capas puedan ser reutilizas, para que no sean cohesivas y que puedan interconectarse en el futuro con clases nuevas que surjan en las capas anteriores y posteriores a ellas, no es recomendable caer en un escenario donde la validación sea obviada o excesiva. En situaciones como esta la validación de los datos debe hacerse lo más cerca de los datos en sí, de ser posible dentro de ellos mismos, como ocurre en la base de datos; de esta forma cuando usemos estos, sus reglas de validación estarían íntimamente relacionadas y serian reutilizables, por todo aquel que deba emplear estos. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&amp;nbsp; &lt;/div&gt;&lt;h4 align=&quot;justify&quot;&gt;Donde es más recomendable?&lt;/h4&gt;&lt;div align=&quot;justify&quot;&gt;Estamos hablando de la Base de datos y de las entidades, las reglas de la base de datos se incorporan al Model, o sea nuestro EF, el cual efectúa estas validaciones. Sin embargo en nuestra arquitectura estamos usando Clases parciales, para poder extender las entidades del EF, con propiedades que no requerimos incluir en las entidades para que sean persistentes, pero que se requieren para la codificación, y los ViewModels que son una especie de entidades virtuales. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;En estos dos casos, las propiedades nuevas que se añaden a las clases parciales y a los ViewModels, no tiene reglas de validación de los datos, nosotros debemos implementar el mecanismo correspondiente para que las reglas de validación de estos datos, se puedan reutilizar. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&amp;nbsp; &lt;/div&gt;&lt;h4 align=&quot;justify&quot;&gt;Solo ahí se pueden poner las validaciones?&lt;/h4&gt;&lt;div align=&quot;justify&quot;&gt;En realidad, la preocupación principal es determinar si debemos hacer validación en todas las capas, o en cada capa solo debemos hacer un tipo de validación? Debemos asumir que la capa anterior cumplió con su tarea? &lt;/div&gt;&lt;h5 align=&quot;justify&quot;&gt;Hay otros puntos en relación con el tema que se deben tomar en consideración:&lt;/h5&gt;&lt;div align=&quot;justify&quot;&gt;En la UI, para asegurarnos que la información proporcionada por el usuario sea la mínima necesaria, se requiere validar tipos de datos, formato adecuado, y datos requeridos. Esto se puede llevar a cabo con controles de captura. Nuevamente debemos aprender a separa las reglas de negocio de este tipo validaciones, las reglas de negocio no se deben poner en un control. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;En el nivel de las clases controladoras, podemos aplicar un mínimo de validación solo por ser asertivos, verificando que nuestra clase reciba lo mínimo necesario para poder trabajar, sin embargo cuando se pueda debemos apoyarnos en la arquitectura de nuestro proyecto, esta tarea le correspondería a las clases de validación y de reglas de negocio. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;En el repositorio no es necesario ya que este trabaja en intima relación con las controladoras o de servicios, y además el repositorio no puede ser accedido si no es a través de las a clases antes mencionadas, ya que su acceso está restringido, solo a clases dentro de nuestro Framework. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;El ultimo bastión, la base de datos, aquí se deben establecer las reglas de tipos, datos que no deben ser nulos y datos que deben estar relacionados, ya sea por una relación maestro detalle, o por una relación de llaves foranes. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;En un post próximo hablaré de las reglas de negocio.&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://msaspnetmvc2.blogspot.com/feeds/7438154333340155848/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://msaspnetmvc2.blogspot.com/2011/04/validacion.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3367264543642289030/posts/default/7438154333340155848'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3367264543642289030/posts/default/7438154333340155848'/><link rel='alternate' type='text/html' href='http://msaspnetmvc2.blogspot.com/2011/04/validacion.html' title='Validación'/><author><name>jose ojeda</name><uri>https://plus.google.com/101071729884870810170</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/--xIfvUuN_Vg/AAAAAAAAAAI/AAAAAAAAmFs/5nf-iRGa4Vg/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3367264543642289030.post-7447582370809736124</id><published>2011-03-30T12:41:00.001-07:00</published><updated>2011-03-30T12:45:18.154-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="EF"/><category scheme="http://www.blogger.com/atom/ns#" term="RefreshMode"/><title type='text'>RefreshMode en el EF</title><content type='html'>&lt;div align=&quot;justify&quot;&gt;El EF es una de las herramientas más poderosas con las que he tenido que trabajar usando tecnologías de Microsoft, sus alcances son muy interesantes, nos ofrece innumerables funcionalidades y mecanismos; a tal grado que cada día podemos descubrir algo nuevo, algo que no sabíamos, pero también puede ser un dolor de cabeza cuando no sabemos por dónde empezar. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;La mayor parte del tiempo, damos por sentado que la herramienta hará todo por nosotros y pocos somos lo que nos interesamos en saber como lo hace. &lt;/div&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;div align=&quot;justify&quot;&gt;Ayer se presento un problema en el proyecto en que estamos trabajando, mismo que fue solucionado después de investigar y leer sobre el tema. &lt;/div&gt;&amp;nbsp; &lt;br /&gt;&lt;h4&gt;Problema&lt;/h4&gt;&lt;div align=&quot;justify&quot;&gt;En el proyecto se tiene una relación Master-Detail, en esta relación es necesario agregar entidades al detalle, mismas que ya existen en la base de datos, sin embargo, es necesario validar la información antes de guardar, ya que si no cumple con las reglas de validación no se debe guardar. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;En aquellos casos en los que la información no cumple, deben permitirnos repetir el proceso una vez que los datos se actualicen; pero al momento de repetirlo (aparentemente) y realizar la validación por segunda vez, resulta que el detalle que agregamos la primera vez nunca se descargó ni tampoco volvió a cargar los datos originales desde la base de datos, tal parece que existiera algún cache o que se conservan en memoria, esto provoca que se sigan agregando los mismos datos de forma repetida, o que a la información que no cumplió las reglas (que aun esta en nuestro data context), se le puedan agregar nuevos datos que se almacenaran cuando la entidad se logre grabar, siempre y cuando no haya reglas en la base de datos que estén siendo violadas por la información que no debería salvarse. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Tal parece que con eliminar los datos que no cumplieron las reglas, se solucionaría el problema, sin embargo esto tampoco puede ser, ya que a estas alturas&amp;nbsp;no sabe que se tenía originalmente. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&amp;nbsp; &lt;/div&gt;&lt;h4&gt;Análisis&lt;/h4&gt;&lt;div align=&quot;justify&quot;&gt;El problema podría solucionarse si pudiéramos revertir los cambios o si pudiéramos volver a cargar la información original. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;El EF lleva un seguimiento de los cambios realizados en memoria, por ese motivo cuando se recuperan de nuevo los registros, el comportamiento default del EF descarta aquellos registros que ya hayan sido cargados previamente, para evitar que los cambios hasta el momento realizados, se pudieran perder; este mecanismo está basado en únicamente en las EntityKeys ( o sea los identificadores de la tabla), debido a esto, cuando se recuperan los datos, solo se verifica si los EntityKeys (id) existen, si existen, entonces la información cargada, no se modificara. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;El comportamiento default es correcto, si no queremos sobre escribir los cambios hechos; pero, que pasa si queremos sobre escribirlos? &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&amp;nbsp; &lt;/div&gt;&lt;h4&gt;Solución&lt;/h4&gt;&lt;div align=&quot;justify&quot;&gt;Para sobre escribir los cambios es necesario cambiar el comportamiento del objectContext. Sin embargo esto debe realizarse con mucho cuidado, ya que si no lo tenemos en cuanta, esto podría afectar a toda la aplicación. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;Para no afectar a toda la aplicación, lo recomendable es que se modifique el comportamiento del objectContext, únicamente en donde se requiera. &lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;La actualización puedes llevarse a cabo usando dos posibles modos: &lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;div align=&quot;justify&quot;&gt;&lt;b&gt;ClientWins&lt;/b&gt;: Los cambios hechos, se conservan hasta que se llame Save.&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div align=&quot;justify&quot;&gt;&lt;b&gt;StoreWins&lt;/b&gt;: Los cambios son sustituidos por la información del almacén de datos.&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div align=&quot;justify&quot;&gt;Nuestra solución fue, agregar un nuevo método a nuestro repositorio. Este método realiza una actualización de la información, solo que establece el modo a StoreWins. &lt;/div&gt;El código del método es: &lt;br /&gt;&lt;a href=&quot;http://lh6.ggpht.com/_e_QYGLfOt1I/TZOHRODqCqI/AAAAAAAABL4/5fnplBSySIY/s1600-h/refresh1%5B4%5D.jpg&quot;&gt;&lt;img alt=&quot;refresh1&quot; border=&quot;0&quot; height=&quot;57&quot; src=&quot;http://lh3.ggpht.com/_e_QYGLfOt1I/TZOHR-aEn5I/AAAAAAAABL8/yH8qmcrHywg/refresh1_thumb%5B2%5D.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;refresh1&quot; width=&quot;400&quot; /&gt;&lt;/a&gt; &lt;br /&gt;&lt;h5&gt;Como se debe usar&lt;/h5&gt;&lt;b&gt;&lt;/b&gt;&lt;br /&gt;&lt;a href=&quot;http://lh3.ggpht.com/_e_QYGLfOt1I/TZOHSaQWl6I/AAAAAAAABMA/ISAhX_zSVOo/s1600-h/refresh2%5B4%5D.jpg&quot;&gt;&lt;img alt=&quot;refresh2&quot; border=&quot;0&quot; height=&quot;56&quot; src=&quot;http://lh3.ggpht.com/_e_QYGLfOt1I/TZOHS2SowWI/AAAAAAAABME/aaJ6BxCtCe8/refresh2_thumb%5B2%5D.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;refresh2&quot; width=&quot;435&quot; /&gt;&lt;/a&gt; &lt;br /&gt;En este ejemplo, se obtiene una entidad solicitud existente en la base de datos. El valor del cupón almacenado es 456, se modifica a 325, al llamar el nuevo método Refresh, se restaura el valor del cupón al original, que era 456. &lt;br /&gt;Este post se realizo con la colaboración de un integrante del equipo de trabajo, &lt;b&gt;Julio Ávila&lt;/b&gt;. Gracias.</content><link rel='replies' type='application/atom+xml' href='http://msaspnetmvc2.blogspot.com/feeds/7447582370809736124/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://msaspnetmvc2.blogspot.com/2011/03/refreshmode-en-el-ef.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3367264543642289030/posts/default/7447582370809736124'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3367264543642289030/posts/default/7447582370809736124'/><link rel='alternate' type='text/html' href='http://msaspnetmvc2.blogspot.com/2011/03/refreshmode-en-el-ef.html' title='RefreshMode en el EF'/><author><name>jose ojeda</name><uri>https://plus.google.com/101071729884870810170</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/--xIfvUuN_Vg/AAAAAAAAAAI/AAAAAAAAmFs/5nf-iRGa4Vg/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/_e_QYGLfOt1I/TZOHR-aEn5I/AAAAAAAABL8/yH8qmcrHywg/s72-c/refresh1_thumb%5B2%5D.jpg?imgmax=800" height="72" width="72"/><thr:total>0</thr:total></entry></feed>