<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type='text/xsl' href='http://lucasontivero.spaces.live.com/mmm2008-07-24_12.50/rsspretty.aspx?rssquery=en-US;http%3a%2f%2flucasontivero.spaces.live.com%2fcategory%2fCAB%2ffeed.rss' version='1.0'?><rss version="2.0" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:msn="http://schemas.microsoft.com/msn/spaces/2005/rss" xmlns:live="http://schemas.microsoft.com/live/spaces/2006/rss" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:cf="http://www.microsoft.com/schemas/rss/core/2005" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Lucas Ontivero: CAB</title><description /><link>http://lucasontivero.spaces.live.com/?_c11_BlogPart_BlogPart=blogview&amp;_c=BlogPart&amp;partqs=catCAB</link><language>en-US</language><pubDate>Fri, 15 Aug 2008 15:15:42 GMT</pubDate><lastBuildDate>Fri, 15 Aug 2008 15:15:42 GMT</lastBuildDate><generator>Microsoft Spaces v1.1</generator><docs>http://www.rssboard.org/rss-specification</docs><ttl>60</ttl><cf:parentRSS>http://lucasontivero.spaces.live.com/blog/feed.rss</cf:parentRSS><live:type>blogcategory</live:type><live:identity><live:id>3988747590285877710</live:id><live:alias>lucasontivero</live:alias></live:identity><cf:listinfo><cf:group ns="http://schemas.microsoft.com/live/spaces/2006/rss" element="typelabel" label="Type" /><cf:group ns="http://schemas.microsoft.com/live/spaces/2006/rss" element="tag" label="Tag" /><cf:group element="category" label="Category" /><cf:sort element="pubDate" label="Date" data-type="date" default="true" /><cf:sort element="title" label="Title" data-type="string" /><cf:sort ns="http://purl.org/rss/1.0/modules/slash/" element="comments" label="Comments" data-type="number" /></cf:listinfo><item><title>Composite UI Application Block - Conceptos</title><link>http://lucasontivero.spaces.live.com/Blog/cns!375AE0CCD1AF61CE!241.entry</link><description>Voy a comenzar una serie de tutoriales básicos sobres el desarrollo de &lt;a href="http://en.wikipedia.org/wiki/Smart_client"&gt;smart client applications&lt;/a&gt; utilizando el &lt;a href="http://msdn.microsoft.com/practices/guidetype/AppBlocks/default.aspx?pull=/library/en-us/dnpag2/html/CAB.asp"&gt;CAB (Compisite UI Application Block)&lt;/a&gt; del equipo de Patterns&amp;amp;Practices de Microsoft. Como todo tutorial, este pretende solo brindar un entendimiento general de las potencialidades del CAB y algunos elementos prácticos iniciales para facilitar la introducción a este Application Block (en adelante AB) que muchos consideran dificultoso de entender y que es uno de los AB centrales del Smart Client Software Factory (SCSF).   
&lt;h5&gt; &lt;/h5&gt;
&lt;h5&gt;Objetivo del CAB&lt;/h5&gt;
&lt;p&gt;El CAB, como su nombre lo indica, es un application block diseñado para ayudar en la tarea de desarrollo de aplicaciones Windows Form-based. Esto gracias a que provee una serie de patrones comunmente encontrados en aplicaciones windows front-end. Uno de los mas importantes objetivos es permitir el desarrollo de módulos totalmente independientes pero a la vez colaborativos. 
&lt;p&gt;
&lt;h5&gt;Lo que el CAB &lt;b&gt;NO&lt;/b&gt; es &lt;/h5&gt;
&lt;p&gt;Es importante aclarar que el CAB no es:
&lt;ul&gt;
&lt;li&gt;Una libreria de controles  
&lt;li&gt;Una herramienta para diseñar formularios  
&lt;li&gt;Un producto propiedad de microsoft &lt;/ul&gt;
&lt;h3&gt; &lt;/h3&gt;
&lt;h5&gt;Pros y Contras&lt;/h5&gt;
&lt;p&gt;Las ventajas de su uso se obtienen si se trabaja en equipo donde distintas personas desarrollan módulos independientes de una aplicación smart client form-based en donde la complejidad de la interface de usuario es elevada. Es indispensale contar con un conocimiento profundo del AB antes de embarcarse en un proyecto con este pues los subsistemas de inyección de dependencias y eventbroker, sumados a los cambios en el paradigma de desarrollo de aplicaciones windows que introduce el CAB pueden hacer fracasar el proyecto o colaborar en la definición de una arquitectura erronea. 
&lt;p&gt;El CAB introduce cierta complejidad a los proyectos por cuanto es rico en conceptos nuevos que deben dominarse y en partes componentes de los módulos. Además las aplicaciones desarrolladas con este son un poco mas difíciles de depurar.
&lt;h5&gt;Comenzamos&lt;/h5&gt;
&lt;p&gt;Primero voy a definir algunos términos que verán en forma recurrente en este y en cualquier artículos sobre el tema. Estas definiciones serán muy sencillas con el objetivo de brindar un entendimiento rápido de aquellos que definen los componentes de la arquitectura proporcionada por el CAB. Con esta sencillez se pierde un poco de realismo pero iré profundizando los conceptos a medida que avance y requiera mayor precisión.  Mostraré primero aquellos términos que son facilmente identificables por ser visibles o estar directamente relacionados a la composición de los formularios windows.
&lt;ul&gt;
&lt;li&gt;Smartpart: Sencillamente se trata de un UserControl. Por ejemplo un Smartpart de datos de clientes o formulario de pedido.  
&lt;li&gt;View: es otro nombre utilizado en forma intercambiable por Smartpart. Este cobra mayor sentido cuando se encuentra en el contexto de la implementación del patrón Model-View-Controller.  
&lt;li&gt;Workspace: Es un Control contenedor muy similar a un Panel que se utiliza para armar el layout de los forms de la aplicación. Estos workspaces (contenedores) contendrán los Smartparts que se visualizarán. 
&lt;li&gt;UIElements: son, y perdonen la obviedad, elementos de la interface de usuario comunes a toda una aplicación. Por ejemplo los menues, barra de estados y barra de herramientas. Estos elementos deben compartirse entre lós módulos de la aplicación. 
&lt;li&gt;SmartPartPlaceholders: es solo un control que actua como contenedor de un SmartPart. 
&lt;li&gt;Layouts: son UserControls que mediante Workspaces y/o SmartPartPlaceholders determinan la distribución de los SmartParts en el formulario. 
&lt;li&gt;Shell: la diferencia entre Shell y Modules la explico mas adelante.&lt;/ul&gt;
&lt;p&gt; &lt;img height=453 src="http://tk4.storage.msn.com/x1pAdjo0uCo2H2T6M0BZ-Ft1eIknYtk8CLToS6eJUBdTpBxEuOuAxFAdmAc1QwVBgpdkRcxI6P-ECuBjp5vwhd455TtvrjeDrBI6N4bklDlAyFeGWEcwh_ci9LrtIc-x0AlUtQPFHjcu2yC_nVg1G45GtOUUSKOCvz5" width=640&gt; 
&lt;p&gt; 
&lt;p&gt; &lt;img height=238 src="http://tk4.storage.msn.com/x1pAdjo0uCo2H2T6M0BZ-Ft1eIknYtk8CLToS6eJUBdTpBMPDxm-H4uAmnySDf74ktuB_KtiqEYUqy6CTPhQzYgJuJH9n3CcmZ-brqFLBVuHhR5Fv6K76Qd5LB5Veh3Wbitn9qwGQuojy17dt058tOzXQ" width=297&gt;
&lt;ul&gt;
&lt;li&gt;Modules: son assembies que contienen los necesario (Workitems, Smartparts, Controllers, States, Services, etc) para implementar una funcionalidad específica. Por ejemplo, módulo de clientes, módulo de facturación, módulo de stock, etc. 
&lt;li&gt;Workitem: entendamoslo como una &amp;quot;pieza de trabajo&amp;quot;. Es &amp;quot;SOLO un contenedor&amp;quot; que aloja todos los componentes necesarios para cumplir con una pieza de trabajo. Es decir, contiene los Smartparts, Controllers, States, Services, Commands, Items, Workspaces  y otros Workitems. Es como una gran bolsa donde guardamos todo lo necesario para realizar una tarea. Por lo general es util pensar en la pieza de trabajo como un Use Case, así por ejemplo podemos pensar el un workitem &lt;em&gt;AltaPacienteWorkItem, RechazoPolizaWorkItem o ConsultaCreditoWorkItem&lt;/em&gt; aunque no tiene por qué corresponder si o si a un caso de uso. 
&lt;li&gt;Controllers: son simplemente los controladores en el caso de una implementación del patrón Model-View-Controller. 
&lt;li&gt;States: cada workitem contiene una colección no tipada de objetos (es decir, una colección que puede tener objetos de cualquier tipo) para guardar aquellos objetos necesarios para realizar la tarea. Por ejemplo, si el workitem es PagoServicioWorkItem (un workitem creado por nosotros para realizar el pago de un servicio cualquiera como agua, luz, gas, iternet, etc), la colección States de este workitem contendrá las instancias de los objetos que intervienen en el pago de un servicios como son, el usuario del servicios, el prestador, el recibo, el contrato, y algunos otros mas.&lt;/ul&gt;
&lt;p&gt;Hemos dividido estas definiciones en dos grupos, los que tienen relación diracta con la composición de los formularios y los que no. Esto es porque el CAB se compone de tres assemblies:
&lt;ul&gt;
&lt;li&gt;Microsoft.Practices.CompositeUI.WinForms.dll - el primer grupo 
&lt;li&gt;Microsoft.Practices.CompositeUI.dll - el segundo grupo 
&lt;li&gt;Microsoft.Practices.ObjectBuilder.dll -recomiendo que lean el último post relacionado &lt;a href="http://xx/"&gt;Dependency Injection with ObjectBuilder&lt;/a&gt;&lt;/ul&gt;
&lt;h5&gt; &lt;/h5&gt;
&lt;h5&gt;Shell y Modules&lt;/h5&gt;
&lt;p&gt;Supongo que el concepto de módulo es lo bastante intuitivo y/o familiar como para definirlo. Solo diré que una aplicación se puede dividir en móulos. Por ejemplo un CRM puede dividirse en Contactos, Productos, Leads, Oportunidades, Actividades, Casos, etc.
&lt;p&gt;Ahora, el Shell es la aplicación marco que contiene los elementos de interface de usuario común a todos los módulos y que es la encargada de cargar los módulos. Por esto, toda solución en la que se utilice el CAB contendrá al menos dos proyectos, uno ejecutable (el Shell .exe) y al menos un módulo class library (el/los módulo/s .dll).
&lt;p&gt; &lt;a href="http://tk4.storage.msn.com/x1pAdjo0uCo2H2T6M0BZ-Ft1eIknYtk8CLToS6eJUBdTpCt894XOzK3bG7mkXmxf-d0675YtcJM5khV3IFVaLbFTt0DJyYxJYlkixj8KS_tGY8jwepZUTRMUv7hE0uJUows12rpb6VsE1whzgvzHi6x4CNZg9um80hR"&gt;&lt;img height=334 src="http://tk4.storage.msn.com/x1pAdjo0uCo2H2T6M0BZ-Ft1eIknYtk8CLToS6eJUBdTpC_dR217orOfFS3iXQBwRyBgpiree6z_RMMhHBjF3ETqsPB86YWKM7hs1Cwy2qptIgoni8IYGouMp8eQVgSaVVe-oQpgNAuYYH0Modvy0wwtkTug3IFdY0W" width=640&gt;&lt;/a&gt; 
&lt;p&gt;La idea detrás de esto es no solo la separación e independencia de los módulos entre si, sino también la posibilidad de que distintos equipos desarrollen módulos en forma paralela.
&lt;p&gt;Un excelente documento para  profundizar estos conceptos es: &lt;a href="http://msdn.microsoft.com/library/default.asp?url"&gt;http://msdn.microsoft.com/library/default.asp?url=...&lt;/a&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=3988747590285877710&amp;page=RSS%3a+Composite+UI+Application+Block+-+Conceptos&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=lucasontivero.spaces.live.com&amp;amp;GT1=lucasontivero"&gt;</description><comments>http://lucasontivero.spaces.live.com/Blog/cns!375AE0CCD1AF61CE!241.entry#comment</comments><guid isPermaLink="true">http://lucasontivero.spaces.live.com/Blog/cns!375AE0CCD1AF61CE!241.entry</guid><pubDate>Fri, 22 Dec 2006 14:05:55 GMT</pubDate><slash:comments>6</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://lucasontivero.spaces.live.com/blog/cns!375AE0CCD1AF61CE!241/comments/feed.rss</wfw:commentRss><wfw:comment>http://lucasontivero.spaces.live.com/Blog/cns!375AE0CCD1AF61CE!241.entry#comment</wfw:comment><dcterms:modified>2007-01-11T19:13:36Z</dcterms:modified></item></channel></rss>