60
Diseñadores de controles • Extenders Providers en Tiempo de Diseño • Estado actual de reutilización de software • Interoperabilidad. Yo interopero, tu interoperas,... ¡interoperemos todos! dotNetManía nº22 enero 2006 • 6,50 (España) Visual Basic • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System dotNetManía www.dotnetmania.com Dedicada a los profesionales de la plataforma .NET

Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Windows Communication Foundation (WCF) es el nuevo modelo de programación unificado para el desarrollo de comunicaciones

  • Upload
    vanthuy

  • View
    229

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Windows Communication Foundation (WCF) es el nuevo modelo de programación unificado para el desarrollo de comunicaciones

Diseñadores de controles • Extenders Providers enTiempo de Diseño • Estado actual de reutilizaciónde software • Interoperabilidad. Yo interopero,tu interoperas,... ¡interoperemos todos!

dotNetManíanº

22 e

nero

200

6 •

6,50

€(E

spañ

a)Visual Basic • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System

dotNetManíawww.dotnetmania.com Dedicada a los profesionales de la plataforma .NET

Page 2: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Windows Communication Foundation (WCF) es el nuevo modelo de programación unificado para el desarrollo de comunicaciones
Page 3: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Windows Communication Foundation (WCF) es el nuevo modelo de programación unificado para el desarrollo de comunicaciones

Bienvenido al número 22, de enerode 2006, de dotNetManía. ¡Espero queestén todos recuperados de los excesosnavideños!

Con este número cerramos el volumen2 y nos preparamos para empezar nuestrotercer año. ¡Y van 2 años, quién lo diría!

En este número continuamos con laserie de introducción a la programacióncon WinFX que comenzamos en octu-bre. Ahora le toca el turno a WinFS,digo a WSF (Windows Storage Foun-dation), de la mano de Aurelio Porras,a quien damos la bienvenida por ser laprimera vez que colabora con nosotros.WSF necesitará de dos partes. En éstemes empezamos con la teoría y nosreservamos un enfoque más práctico, concódigo fuente, para el siguiente.

David Solís , miembro del Club.NET de Sevilla también se estrena estemes con el artículo “Diseñadores de con-troles”, junto con Juan Llorens y JoséMiguel Fuentes de la empresa dTinffabricantes de la herramienta swREUSERy que lo hacen con su “Estado actual dereutilización de software”.

La entrevista de este mes es al aus-tríaco Ingo Rammer, de Thinktecture,consultor, ponente, autor de artículos ylibros como “Advanced .NET Rem-oting” entre otros, y al suizo BeatSchwegler, Architect de MicrosoftEMEA, aprovechando su paso porMadrid como ponentes en uno de losúltimos foros de arquitectos organiza-dos por Microsoft Ibérica. Más que unaentrevista fue una charla agradable yamena.

En lasección dnm.labora-

torio.net evaluamos elnuevo Compuware DevPartner FaultSimulator 1.5, que nos permite locali-zar defectos del software mediante lasimulación de errores y la monitoriza-ción de la respuesta, de reciente apari-ción junto con Compuware DevPart-ner Studio 8.0.

En la sección dnm.comunidad.net sepresenta la iniciativa de Huelva Impulsapor la que un grupo de personas hanencontrado en .NET una forma de cre-arse un futuro laboral.

En el momento de escribir esta edi-torial estamos dando los últimos reto-ques al segundo Cuaderno Técnico dedotNetManía: “Diseño de informes conSQL Server Reporting Services” de LuisMiguel Blanco. Esperemos que antesde acabar este mes de enero podamostenerlo disponible. ¡Estén atentos!

Por supuesto, dentro hay más.Espero que le guste.

dotN

etM

anía

<<

3

...y van 2

dotNetManíaDedicada a los profesionales de la plataforma .NET

Vol. II •Número 22 • Enero 2006Precio: 6,50€

EditorPaco Marín

([email protected])

AdministraciónPilar Pérez

([email protected])

Asesor TécnicoMarino Posadas

([email protected])

RedactoresAntonio Quirós, Dino Esposito, Guillermo

'guille' Som, Jorge Serrano, José ManuelAlarcón, Lorenzo Ponte, Luis Miguel Blanco,

Miguel Katrib (Grupo Weboo).

Colaboradores habitualesÁngel Esteban, Braulio Díez, Daniel Mazzini,

Eladio Rincón, Erich Bühler, FernandoNogueras, José Miguel Torres, Miguel Egea,

Octavio Hernández, Pablo Abbate, PepeHevia, Rodrigo Corral, Salvador Ramos y

Sergio Vázquez.

Además colaboran en este númeroAurelio Porras, David Solís, Francisco JavierCarbajosa, Francisco José Díaz, José Miguel

Fuentes, Juan Llorens, Mario del Valle yMiguel J. Rodríguez

Edición y Suscripciones.netalia

c/ Robledal, 13528529 Rivas-Vaciamadrid (Madrid)

Tf. (34) 91 666 74 77Fax (34) 91 499 13 64

PublicidadMediadev

Sophie Mancini ([email protected])Tf. 93 426 22 57 - 670 99 74 64

Fax. 93 423 11 40

ImprimeGráficas Vallehermoso

www.graficasvallehermoso.com

ISSN1698-5451

Depósito LegalM-3.075-2004

>>

<<

dnm.editorial

Page 4: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Windows Communication Foundation (WCF) es el nuevo modelo de programación unificado para el desarrollo de comunicaciones

22dnm.sumario

dnm

.sum

ario

Entrevista a Ingo Rammer y Beat Schwegler 10-13Con motivo de uno de los últimos Foros de Arquitectos de Software organizado porMicrosoft Ibérica, tuvimos ocasión de charlar con dos de los “evangelistas” máspopulares del momento en estas materias: Ingo Rammer, de sobra conocido comoconferenciante en Tech-Ed, PDC y otros eventos, así como autor de una de las obrasmás populares sobre .NET Remoting y Beat Schwegler, Architect de Microsoft EMEA,radicado en Suiza.

Diseñadores de controles 14-20Cuando implementamos un control, además de su funcionalidad en tiempo de ejecución,es importante que disponga de un buen soporte en tiempo de diseño, consiguiendo asíun aspecto y comportamiento mucho más profesional.

Primeros pasos con Windows Storage Foundation (I) 22-29Windows Communication Foundation (WCF) es el nuevo modelo de programaciónunificado para el desarrollo de comunicaciones punto-a-punto y Arquitecturas Orientadasa Servicios (SOA) en .NET. Recoge lo mejor de Remoting, Servicios Web,System.Messaging y los .NET Enterprises Services en un único framework que formaráparte de WinFX.

Extenders Providers en Tiempo de Diseño 30-34En este trabajo se ilustra cómo usando el diseñador de Visual Studio se pueden aplicarextensiones a componentes y controles .NET con solo arrastrarlos desde el Toolbox.

Estado actual de reutilización de software 35-40Con el paso del tiempo, afortunadamente, la ingeniería del software está dejando de serun arte y se está convirtiendo realmente en ingeniería. Eso implica nuevas técnicas ynuevas herramientas. Por lo tanto, el concepto de reutilización también ha de evolucionar.La herramienta swREUSER y su metodología iRM apuntan en esta nueva dirección.

InteroperabilidadYo interopero, tu interoperas,... ¡interoperemos todos! 41-46

La interoperabilidad bien entendida hace referencia a cómo utilizar clases de códigono administrado desde aplicaciones de .NET y viceversa. Cuando hablamos de códigono administrado, nos estamos refiriendo a código que no está generado con loscompiladores de la plataforma .NET. El concepto de interoperabilidad lo ampliaremosun poco para aplicarlo también a los ensamblados creados con .NET, de forma quepodamos usar las librerías creadas con un lenguaje de .NET desde otro lenguajetambién de la familia .NET, típicamente con C# y Visual Basic.

dnm.laboratorio.net 47-49DevPartner Fault Simulator

dnm.comunidad.net 50-53SIO y .NET. Creando futuros

dnm.todotnet.qa 54-56Servicios Web y más...

dnm.biblioteca.net 57.NET Compact Framework Programming with C# (Paul Yao y David Durant)Programming the .NET Compact Framework (Wei Meng Lee y Brian Jepson)

dnm.desvan 58

Page 5: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Windows Communication Foundation (WCF) es el nuevo modelo de programación unificado para el desarrollo de comunicaciones
Page 6: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Windows Communication Foundation (WCF) es el nuevo modelo de programación unificado para el desarrollo de comunicaciones

Compuware ha lanzado nue-vas versiones de dos de sus pro-ductos pertenecientes a la fami-lia DevPartner (CompuwareDevPartner Studio 8.0 yDevPartner Fault Simulator1.5. La compañía ha hecho esteanuncio dentro del evento de pre-sentación de Microsoft VisualStudio 2005). Los dos nuevosproductos de Compuware ofre-cen total integración con VisualStudio 2005, permitiendo a losequipos de desarrollo encontrary aislar defectos en una fase mástemprana del ciclo de vida de lasaplicaciones y aplicando las mejo-res prácticas, con el claro objeti-vo de mejorar la calidad y maxi-mizar la productividad de losdesarrolladores mediante ayudasde desarrollo experto.

DevPartner Studio 8.0, aho-ra plenamente integrado conVisual Studio 2005, permite cons-truir aplicaciones, componentesy servicios Web fiables y de altorendimiento. Esta nueva versiónintegra Performance Expert, aña-diendo así una nueva dimensióna las capacidades de análisis deesta herramienta, mediante unavisión del rendimiento muchomás amplia y con mayor capaci-dad para localizar, diagnosticar ycorregir problemas de rendi-miento en aplicaciones.

DevPartner Studio 8.0 tam-bién incluye el nuevo DevPart-ner Fault Simulator SE, que

provee capacidades de simulaciónque convierten la depuración delcódigo de manejo de errores enuna simple extensión de las téc-nicas corrientes de depuración.La solución también incluye unanueva herramienta que posibilitaa los desarrolladores comparar anivel de sistema configuracionesde la aplicación a lo largo deltiempo para identificar defectosdebidos a esas configuraciones.Igualmente, la solución tambiénintegra una nueva prestación deexportación de datos que posibi-lita a los usuarios salvar datosdetallados de cobertura y rendi-miento en formato XML, quepueden ser accedidos y utilizadospor una variada gama de herra-mientas externas de DevPartnerStudio.

Según la consultora Forres-ter Research, “aunque la mayo-ría de los desarrolladores entien-den que el coste de reparar fallosen las aplicaciones crece expo-nencialmente a media que seavanza en el ciclo de vida de lasmismas, muy pocos saben lo quepueden hacer para identificar loserrores de manera temprana. Para

mejorar la calidad de sus códigosincluso antes de que comience lafase formal de pruebas, los desa-rrolladores pueden poner en mar-cha pruebas unitarias, análisisestático, análisis de rendimientosy pruebas de seguridad. Losentornos de desarrollo integra-dos incluyen muchas, pero notodas las funcionalidades que losdesarrolladores necesitan paracumplir estos objetivos”.

En este mismo númeroencontrará una evaluación delnuevo DevPartner Fault Si-mulator 1.5 que permite a losdesarrolladores localizar rápida-mente defectos de software en elcódigo de manejo de errores,mediante la simulación de erro-res y la monitorización de la res-puesta, tanto en plataformas.NET como en aplicaciones nati-vas Windows.

DevPartner Studio 8.0 yDevPartner Fault Simulator1.5 son sólo las primeras de otrasmuchas soluciones que Com-puware tiene previsto puedansoportar Visual Studio 2005 yVisual Studio 2005 TeamSystem.

dotN

etM

anía

<<

6

dnm.noticias<<

Compuware lanza nuevas versiones de la suiteDevPartner

no

ticia

s.n

oti

cia

s.n

oti

cia

s.n

oti

cia

s.n

oti

cia

s.n

oti

cia

s

DevPartner Studio 8.0 y Fault Simulator 1.5, con total capacidad de integracióncon Microsoft Visual Studio 2005

Rick LaPlante Director General de Visual Studio 2005 en Microsoft Corporation en unmomento de su entrevista con dotNetManía en el pasado mes de mayo.

“Los dos nuevos productos deCompuware son un excelentecomplemento a Visual Studio

2005 Team System y permiten alos equipos de desarrollo

proporcionar aplicaciones demayor calidad y listas para entrar

en producción, además de ponerlasen marcha con confianza a lo largo

de todo el ciclo de desarrollo”

Page 7: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Windows Communication Foundation (WCF) es el nuevo modelo de programación unificado para el desarrollo de comunicaciones

dnm.noticias

dnm.noticias

dotN

etM

anía

<<

7

ILOG anuncia el lanzamientode ILOG Rules for .NET 2.0 -elprimer Sistema de Gestión de Reglasde Negocio (BRMS) que aprovecha

Microsoft Office Excel 2003 como herramienta para las apli-caciones empresariales de desarrollo y gestión de reglas denegocio. Ahora, con sólo conocer MS Word y MS Excel2003, los responsables de negocio pueden crear y editar polí-ticas empresariales dentro de este familiar entorno, ahorran-do tiempo y consultando las reglas de un simple vistazo.

ILOG anuncia también la integración entre ILOGRules for .NET, oferta clave en la línea de productosBRMS de ILOG, y Microsoft BizTalk Server, para quelos usuarios puedan automatizar y gestionar procesos denegocio complejos a lo largo de múltiples aplicaciones.

Curva de aprendizaje reducida

Para complementar su integración existente conMicrosoft Word, ILOG Rules for .NET ofrece ahora alos usuarios de negocio la opción de autorizar o editar lasreglas de negocio utilizando tablas de decisión dentro deExcel 2003; o componer reglas textuales en un lenguajeif-then-else en Microsoft Word, por ejemplo: si unacompañía adquiere varios productos y gasta más de unacantidad especificada, entonces recibirá un descuentoespecial; o bien pagará una cantidad estándar. Las nue-vas tablas de decisión de ILOG Rules for. NET facilita-rán también el poder compartir las reglas entre desarro-lladores y usuarios de negocio, a través de un interfaceweb especial que puede alertar a los participantes en elproceso cuando una regla sea modificada. Esto se consi-gue gracias al soporte que ofrece a la colaboración elmódulo Rule Team Server for Sharepoint.

Desde el módulo Rule Studio for .NET, los desarrolla-dores pueden aprovechar Visual Studio para la imple-

mentación de reglas, localizando los cambios más fácil-mente, gestionando conjuntos de reglas complejas e imple-mentando reglas de manera más rápida.

Diagramas del flujo de reglas

Como complemento para las nuevas característicasde tablas de decisiones, el nuevo soporte para Flujos deReglas da a los desarrolladores una vía más precisa paraorganizar gráficamente las tareas de reglas. Los desa-rrolladores, así, pueden manipular las tablas de deci-sión y los flujos de reglas directamente desde su entor-no de desarrollo integrado preferido, Visual Studio.Los diagramas del flujo de reglas se pueden visualizartambién a través de la Web, para que los usuarios denegocio puedan utilizar el Flujo de Reglas para enten-der mejor la secuencia de ejecución durante la aplica-ción de las reglas.

Integración con BizTalk Server

ILOG Rules for .NET supone también la primeraintegración de un sistema BRMS con Microsoft BizTalkServer. Al utilizar ambos productos a la vez, las compa-ñías permiten a sus usuarios de negocio gestionar direc-tamente grandes volúmenes de reglas incluidas en los pro-cesos de negocio automatizados por BizTalk Server. Lasolución conjunta es muy adecuada para aseguradoras,banca y para el sector público, con políticas de negociomultifacéticos. La misma permite que sean los usuariosde negocio, y no necesariamente el personal de TI, quiengestione los conjuntos de reglas distribuidas a lo largo demúltiples procesos de negocio.

ILOG Rules for .NET 2.0 está disponible desde fina-les de otoño. Para más información sobre las novedades queincorpora el producto, visite http://www.ilog.com/products/rulesfornet.

ILOG anuncia el lanzamiento de ILOG Rules for .NET 2.0Rules for .NET 2.0 permite que las políticas de negocio complejas se puedan modificar directamente desdeMicrosoft Office Excel

DevForce Express es una solución de pro-ductividad de desarrolladores para .NET que está

totalmente integrada con Microsoft Visual Studio parael desarrollo de aplicaciones datos cliente/servidorintensivas. La solución es una de “las obligadas” parael desarrollo .NET (según el fabricante, claro).Mejorará su productividad e incrementará la calidadde la aplicación desde el desarrollo hasta el despliegue.Esto asegura que cumpla con las necesidades de sususuarios, reduzca el coste global y acelere el tiempohasta la venta.

DevForce Express incluye un núcleo framework RAD,un ORM (Object-Relational Mapping) integrado, UIDataBinding avanzado, arquitectura MVC y despliegue y ver-sionado “one-click”. Esto incluye toda la documentación delproducto incluyendo tutoriales “QuickStart” y demos.

Las aplicaciones DevForce Express puede ser desarro-lladas, desplegadas y vendidas libres de royalties.

DevForce Express requiere Microsoft .NET Framework2.0 y Microsoft Visual Studio .NET 2005.

Recomendado por MSDN Flash. Más información en:http://www.ideablade.com.

IdeaBlade anuncia DevForce Express completamente gratis

Page 8: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Windows Communication Foundation (WCF) es el nuevo modelo de programación unificado para el desarrollo de comunicaciones

dotN

etM

anía

<<

8

dnm.noticias<<

dnm.noticias

Microsoft Corporation ha anun-ciado la beta 1 de Microsoft Exchange"12" -el nombre en clave para la pró-xima versión de Microsoft ExchangeServer-, Exchange “12" reducirá cos-tes y complejidad del sistema de men-sajes gracias a un mayor control de losadministradores de sistemas, más valory acceso ampliado a los buzones decorreo para los usuarios finales y unincremento de la seguridad para lasorganizaciones.

Soporte para desarrolladores

Exchange “12” mejora la programa-bilidad y el acceso a datos para los desa-rrolladores profesionales. Exchange WebServices es un nuevo API basado en

estándares para acceder a los datos delos buzones de entrada que simplifica eldesarrollo y ayuda a las organizacionesa desarrollar líneas de negocio ricas yaplicaciones orientadas a servicios queintegran con Exchange.

Esta beta 1 se distribuirá sólo a losparticipantes del Technology AdoptionProgram (TAP). Este programa está dise-ñado, como otros programas de beta-testing, con el fin de obtener el feedbackreal de los clientes.

La beta 2 estará disponible en elverano de 2006, mientras que la versiónfinal estará disponible a principios de2007. Más información acerca deExchange “12” en: http://www.micro-soft.com/exchange/preview.

Microsoft anuncia Exchange “12” Beta 1La próxima versión de Exchange Server ofrecerá más control de los administradores, un accesoampliado a los usuarios y una mejor protección

Windows Server 2003 R2

Windows Server 2003 R2 es una actua-lización basada en Windows Server 2003 SP1,aporta nuevas capacidades y valor para losclientes en áreas de gestión de branch-office,gestión de identidad y acceso, virtualización,almacenamiento de datos y tecnologías deplataforma Web. El producto estará disponi-ble mayoritariamente para febrero de 2006.

Asimismo, Microsoft anuncia la dispo-nibilidad de dos productos relacionados conéste: Windows Storage Server 2003 R2,que aparece simultáneamente a WindowsServer 2003 R2 y Windows SmallBusiness Server 2003 R2 que estará dis-ponible en el segundo cuarto de 2006.

Si desea evaluar el Windows Server 2003R2 hágalo desde: http://www.microsoft.com/win-dowsserver2003/evaluation/trial.

Microsoft ha liberado la CTP dediciembre de Windows Vista para clien-tes y socios. La tercera después de la pre-sentación de la beta 1 en el PDC 2005.La nueva edición añade nuevas capacida-des de seguridad, como una mayor inte-gración con Windows Defender, BitLockerDrive Encryption para proteger los datos,y control paterno en la navegación y algu-nos ajustes del interfaz de usuario, asícomo un nuevo módulo de desfragmen-tación, entre otros y según han informa-do algunos de los probadores.

Si bien en un principio las edicionesCTP de Windows Vista serían mensua-les, a partir de ahora serán menos pre-decibles, como una forma de aportarmayor calidad a éstas. La fecha para laversión final se mantiene estimada parala segunda mitad de este año 2006.

El número de build de esta CTP es,para no perdernos, es la 5270. Para seguirde cerca la evolución del que será nuevosistema operativo, un buen sitio es:http://www.longhornblogs.com.

Más información en el sitio oficial deMicrosoft para Windows Vista:http://msdn.microsoft.com/windowsvista yen español: http://www.microsoft.com/spain/windowsvista.

Windows Vista Build 5270

ILMerge es una utilidad para unirmúltiples ensamblados de .NET en unúnico ensamblado .NET. Trabaja sobreejecutables y DLL por igual y viene convarias opciones para controlar el proce-sado y formato de la salida.

ILMerge toma un conjunto deensamblados de entrada y los une enun ensamblado destino. El primerensamblado de la lista de ensambladosde entrada es el ensamblado primario.Cuando el ensamblado primario es unejecutable, entonces el ensamblado des-tino es creado como un ejecutable conel mismo punto de entrada que elensamblado primario.

ILMerge está empaquetado comouna aplicación de consola, pero toda sufuncionalidad está disponible programá-ticamente. Visual Studio 2005 permiteañadir una referencia a un ejecutable, loque le permite escribir un cliente escri-to en C# que use ILMerge como unalibrería.

ILMerge corre en el runtime 2.0de .NET pero también está disponi-ble para unir ensamblados de las ver-siones 1.x.

Para más información: http://rese-arch.microsoft.com/~mbarnett/ILMerge.aspx

Actualización de ILMerge

Microsoft ha anunciado la disponibilidad de laedición RTM del Windows Server 2003 R2

DSL Tools CTP de noviembre

Microsoft ha anunciado la disponibi-lidad de la edición CTP de noviembre desu DSL (Domain-Specific Language) Tools.

Más información en: http://msdn.microsoft.com/vstudio/teamsystem/works-hop/DSLTools.

Más CTP de diciembre para desarrollo conWindows Vista build 5270

Estas actualizaciones incluyen:WinFX Runtime Components (RTC),Windows SDK y Visual Studio CodeName “Orcas” CTP WinFX Develop-ment Tools.

Más información en: http://msdn.microsoft.com/windowsvista/getthebeta.

NetAdvantage 2005 Volumen 3 para VisualStudio 2005

Infragistics ha puesto a disposi-ción la nueva versión, ya anunciada,de su suite de componentes para lacapa de presentación: NetAdvantage2005 Volumen 3 para VisualStudio 2005.

Más información en: http://www.infragistics.com.

Además...

Page 9: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Windows Communication Foundation (WCF) es el nuevo modelo de programación unificado para el desarrollo de comunicaciones
Page 10: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Windows Communication Foundation (WCF) es el nuevo modelo de programación unificado para el desarrollo de comunicaciones

Entrevista a Ingo Rammer yBeat Schwegler

Con motivo de uno de los últimos Foros de Arquitectos de Software organizadopor Microsoft Ibérica, tuvimos ocasión de charlar con dos de los “evangelistas”más populares del momento en estas materias: Ingo Rammer, de sobra conoci-do como conferenciante en Tech-Ed, PDC y otros eventos, así como autor de unade las obras más populares sobre .NET Remoting y Beat Schwegler,Architectde Microsoft EMEA, radicado en Suiza.

se deriva del contenido de vuestraexposición. Ha sido precisa y esclarecedora, peroen algunos momentos me parecía dirigida a la granempresa, no a la PYME. ¿Creéis que existe la mis-ma concienciación en las Pymes sobre la necesi-dad de una arquitectura bien diseñada?

Beat Schwegler: Tal y como yo lo veo, lasPymes que tienen éxito realmente, se preocupanacerca de la arquitectura. Probablemente, no lohacen de la misma forma, ya que si estás en unagran organización pueden existir múltiples nive-les de organización en la propia empresa que seven reflejados en la arquitectura de sus solucio-nes. Pero, creo que aquellos que tiene éxito síque se implican en ello. De una forma general,podríamos decir que si estás intentando resolverun problema primero conceptualmente, enton-ces te estás moviendo en la dirección de la arqui-tectura.

En tu sitio Web apuntas que la arquitectura de lasaplicaciones tiene que ser algo asumido en su totali-dad desde el comienzo mismo del ciclo de vida. Queno se puede esperar para poner esos principios en fun-cionamiento a que la aplicación haya alcanzado otrasfases. Al tiempo, comentas la importancia de las herra-mientas para los arquitectos de software. ¿Puedes pro-fundizar algo más en todo esto?

B.S: Sí. Una arquitectura viva, tiene amplias con-secuencias, en ambas direcciones. Y tiene unas con-secuencias de amplio rango en el devenir de la apli-cación, así que la mayor parte de las decisiones debie-ran de tomarse en la fase inicial. Respecto a las herra-mientas, tal y como demostraremos en nuestras demos

de esta tarde, la resolución del problema pasa por divi-dir éste en partes más manejables que puedan estarbajo control. Además, como suele decir Ingo, uno delos problemas que se presentan es la comunicación deese paquete estructural al equipo de desarrollo, y esoes lo que algunas de estas herramientas permiten.

¿Esas herramientas se relacionan, complementano de alguna forma pertenecen a VSTS (Visual StudioTeam System)?

B.S: Están en el medio, podríamos decir. Las DSLToolkits son realmente parte de Visual Studio. Parala Guidance Automation Toolkit, de hecho existenmuchas posibilidades de que se encuentre dentro deVisual Studio en un futuro próximo.

Marino Posadas

dnm.directo.entrevistas

Marino Posadas esasesor técnico y

redactor dedotNetManía, MVP de

C# y formador deAlhambra-Eidos

<< Mi primera pregunta

Ingo Rammer y Beat Schwegler

Page 11: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Windows Communication Foundation (WCF) es el nuevo modelo de programación unificado para el desarrollo de comunicaciones

Estas infraestructuras por otro lado,parecen tener una fuerte dependenciade Internet, en casi todos sus aspectos.Sin embargo, cuando viajas a África, tedas cuenta que allí existe un problemaprimario de comunicaciones y que laadopción de estas ideas tiene que retra-sarse por fuerza. ¿No lo veis así?

B.S: Es cierto que parece existir laidea de que la arquitectura orientada aservicios (SOA) tiene una fuerte depen-dencia de Internet, pero yo no lo veoasí, o al menos, no tanto. O al menos notiene por qué ser así. Lo que realmen-te significa SOA es un pensamiento entérminos de servicios que se ofertan auna serie de clientes, externa e interna-mente. E intentas hacer corresponderestos servicios con sus tecnologías sub-yacentes. Yo casi diría que no está vin-culado a ninguna tecnología, sino quemás bien, es una forma de pensar. Deforma que SOA, en la manera en la queyo la veo actualmente, tiene más que vercon Intranets, y conexiones rápidas enla propia empresa. Y solo en ciertosescenarios, como los propuestos porAmazon o eBay, se requerirá Internetpara obtener una respuesta.

¿Y qué sucede con las soluciones quedependen de algún sistema deExtranets?

B.S: Nosotros hemos ayudado en laimplantación de alguna solución impor-tante de ese tipo como es el caso de laAgencia Internacional para la EnergíaAtómica, y ellos -al principio- tenían laidea de una aplicación Web, pero ense-guida cambiaron de idea hacia un enfo-que Smart Client, ya que la instalación deun sistema de estos tiene todas las venta-

jas de la instalación Web, pero el clienteno adolece de la pobreza inherente a lasaplicaciones Web. De cualquier forma, losproblemas de ancho de banda o de insta-laciones, te los encuentras en cualquierparte, incluso también en Europa.

Otro aspecto en el que suelo hacerhincapié es el de la importancia de losestándares para Internet. ¿Piensas queesa importancia está debidamente reco-

nocida por todos o es preciso seguirhaciendo un esfuerzo en ese sentido?Especialmente en lo que concierne a lasExtensiones de los Servicios Web…

B.S: El problema en este caso es queno se refiere únicamente a un únicodocumento de especificación como pue-de ser CORBA, u otro modelo. La ideaha sido la de crear documentos máspequeños que puedan ser objeto de unaconstrucción mayor, a la manera de ladri-llos de una especificación más amplia.

Desde el punto de vista de laInteroperabilidad creo que las cosas estánfuncionando adecuadamente. Sobre sipodrían existir especificaciones en com-petencia que no fueran inter-operables,creo que, al final, será el mercado el quedecida. Especialmente, los que estánimplicados en el Comité WS-I (Web-Services Interoperability Comittee).

La mayor parte de estos estándares seconvierten en un elemento real del soft-ware a partir del concepto de contrato deservicios Web (el soporte WSDL y la des-cripción en él contenida). Háblanos algomás acerca de ese tema, que sabemos quees uno de tus favoritos…

B.S: Es cierto, me gustan especial-mente. Porque ¿qué es un contrato? ¿Yqué tipos de contratos existen en este con-texto? Además existen varios niveles decontexto en un contrato, porque nos espe-cifica aspectos semánticos, pero tambiénestablece restricciones, y explica distintosniveles de interacción. En una de mis últi-mas charlas sobre esto, recuerdo quecomentábamos -no lo que indica semán-ticamente el contrato- sino sus conse-cuencias más estructurales: la forma enque ese contrato se negocia, o hasta quépunto ambas partes van a asumir un con-junto de conceptos comunes. Es comonosotros, en esta conversación: amboshablamos otras lenguas de forma nativa,pero, si acordamos una entrevista, pareceobvio que la lengua de comunicación entreambos sea el inglés. Y los dos asumimosun cierto conocimiento de esa lengua parapoder comunicarnos.

Lo que realmente significa SOA es un pensamiento en términos de servicios que se ofertan a una serie de clientes, externa e internamente. E intentas hacer corresponder estos servicios con sus tecnologías

subyacentes.Yo casi diría que no está vinculado a ningunatecnología, sino que más bien, es una forma de pensar

dotN

etM

anía

<<

11

dnm.directo.entrevistas<<

Marino Posadas, Ingo Rammer y Beat Schwegler

Page 12: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Windows Communication Foundation (WCF) es el nuevo modelo de programación unificado para el desarrollo de comunicaciones

Bien, sé que tienes una exposición enpocos minutos, así que para ir conclu-yendo, ¿puedes darme tu impresión acer-ca de la siguiente versión de WSE 3.0?

B.S: Para mí el aspecto clave va a serla seguridad. Ahora se van a poder esta-blecer políticas de seguridad para el con-junto del escenario pregunta-respuesta,y no sólo en función del tipo de pre-gunta. Es una aproximación holística alproblema de seguridad. El otro aspec-to clave es que va a ser compatible en sutotalidad con el futuro WindowsCommunication Foundation (antesIndigo), de forma que si haces ahora elmovimiento hacia esta versión te vas agarantizar la compatibilidad y el mane-jo de las cosas en la forma en que van aestar hechas en WFC. Todo esto, ade-más de las consideraciones de distribu-ción de las aplicaciones que van a poderaprovechar la nueva arquitectura de for-ma mucho más segura.

Y ya que hablamos de WFC, ¿pue-des subrayar lo más relevante del futu-ro de esta tecnología?

B.S: Creo que va a ser un cambio fun-damental en la forma en que concebimosy construimos las comunicaciones.Muchos de estos conceptos vinculados ala tecnología orientada a los servicios novan a ser necesarios, dado que WFC losincluirá por defecto. Podremos centrar-nos muchísimo más en el aspecto denegocio de las aplicaciones, sin necesi-dad de consideraciones particulares delsoporte de un mecanismo en concreto.

En suma, creo que va a cambiar la for-ma en que vemos y hacemos comunica-ciones hoy en día.

En el último Tech-Ed en Ámsterdamestuviste comentando cosas acerca de esca-labilidad, disponibilidad y rendimiento ypor otro lado te conocemos por tus obrasy artículos sobre Remoting. ¿Cuál es y vaser tu línea de proyección futura? ¿Temueves hacia el mundo SOA?

Ingo Rammer: Bueno no es que meesté “moviendo” en ese sentido. Yo loveo más como una evolución pragmáti-ca hacia el mundo de las arquitecturasque ya me interesaba en Remoting, comotú has visto. Pero no es un abandonocreo, sino un seguimiento de las ten-dencias que sigue la tecnología.

Volviendo a tu presentación enTech-Ed, ¿cuál de los tres aspectos (esca-labilidad, disponibilidad y rendimiento)es más crítico y por qué?

I.R: Verás, el rendimiento es fácil dedefinir y de medir. Siempre puedes esta-blecer mecanismos de medida para larespuesta. Y siempre que lo puedesmedir exactamente, lo puedes optimi-zar. Pero la escalabilidad es diferente.¿Cómo lo mides? Para ser capaz demedir una cosa así necesitas realmenteescalar el sistema. Tienes que probarloen situación real, y eso cuesta muchodinero. Si pensamos en los proyectos ensu totalidad, probablemente, podríamosdecir que el 50% de los proyectos notiene la necesidad de escalarse en abso-luto. Por ejemplo una aplicación conunos 100 usuarios, no necesita conside-rar ese tipo de cosas. El segundo aspec-to, es cuando necesitas escalar, peroconoces exactamente el máximo núme-ro potencial de usuarios. No resulta unproblema especialmente difícil porquesiempre puedes planearlo. El único retopodría ser, pongamos en el caso de un

banco, que se produjese una fusión. Yyo evalúo ese dato en más o menos un47%. Y, por último, tenemos el caso del3% restante, que no pueden conocer apriori la cantidad máxima de usuarios.Por ejemplo, compra de entradas on-line, apuestas, y cosas similares.

El problema, por tanto no está aquísino en las aplicaciones que se concibencomo pertenecientes al primer grupo,pero, posteriormente, se convierten enel segundo. Cuando hablo sobre esca-labilidad, me suelo centrar por tanto enla forma de crear el segundo grupo deaplicaciones.

¿Cual es el peor enemigo de los 3?I.R: La escalabilidad, cuando se pre-

senta repentinamente. Si piensas conantelación en los problemas potencia-

dotN

etM

anía

<<

12

dnm.directo.entrevistas<<

WSE 3.0 va a ser compatible en su totalidad con el futuro Windows Communication Foundation (antes Indigo),de forma que si haces ahora el movimiento hacia esta

versión te vas a garantizar la compatibilidad y el manejo delas cosas en la forma en que van a estar hechas en WFC

Beat Schwegler en un momento de su ponencia

Page 13: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Windows Communication Foundation (WCF) es el nuevo modelo de programación unificado para el desarrollo de comunicaciones

les, muchas veces te ves obligado a rea-lizar una decisión en un sentido anta-gónico. Típicamente contra el rendi-miento. Si no te preocupa demasiado elrendimiento, puedes implantar escala-bilidad, más sencillamente. Te puedocomentar lo que hace Amazon, porejemplo: si tú ves un libro allí con unaoferta de 2 ejemplares en reserva, pro-bablemente, esa información no escorrecta. Corresponde con un caché queellos han creado y que se actualiza cadavarias horas. Incluso si compras un libro,en la mayoría de los sitios, la transac-ción tiene lugar en poco más de unsegundo, mientras que en su caso, sim-plemente, la petición se sitúa en unacola, y será procesada cuando le toqueel turno.

Eso implica unos flujos de trabajodifíciles de optimizar muchas veces…

I.R: Exacto. En escenarios como ése,los análisis de rendimiento son difícilesde llevar a cabo y hay que tomar unadecisión en un sentido (rendimiento) oen otro (escalabilidad). Sin embargo,para una aplicación normal, el rendi-miento está muchas veces relacionadocon el rendimiento que se obtiene de labase de datos.

Y otras veces hacemos considera-ciones erróneas cuando valoramos latecnología: por ejemplo, decimos quealgo va lento con servicios Web y quemejor vamos a usar Remoting. La dife-rencia es de 5 milisegundos en Remotinga 20 milisegundos en servicios Web. Noconozco ningún cliente capaz de apre-

ciar esa diferencia en una apli-cación. Lo que importa no eseso, sino el número de llamadasque se están procesando. Peroes un problema de la aplicación,no del protocolo.

Otro problema al que hací-as mención era la latencia(Latency). ¿Puedes explicarnoseste concepto?

I.R: Si piensas en la arquitec-tura, los dos factores en una lla-mada remota que implican ren-dimiento son el ancho de banday la latencia. El primero se hamejorado tremendamente en losúltimos años. Pero el segundo nocambia apenas. Podríamos decirque la latencia es el tiempo aso-

ciado a una llamada ping a un sistema. Ycada llamada implica un tiempo de laten-cia. Digamos que es algo que no va a opti-mizarse, ya que es básicamente depen-diente de la propia velocidad de la luz.

Sigamos optimizando. ¿Cuál es másimportante? ¿Seleccionar el algoritmoadecuado o el mejor conjunto de clasesen la jerarquía?

I.R: Creo que es parte del mismoproblema. Creo que les daría un igualporcentaje de importancia.

Y eso que hoy no necesitamos utili-zar ciertos algoritmos (como los deordenación) ya que están implícitos enla arquitectura de las jerarquías de cla-ses…

I.R: Así es. Hoy pensamos en pro-blemas diferentes. Por ejemplo, nadiese plantea ahora cómo implementarQuickSort. Si hoy una aplicación esdemasiado lenta, no va a ser a causa deningún algoritmo en concreto. Estarárelacionado con la base de datos, o conlo que sea, pero no con algo así.

Otro concepto del que hablas en tupresentación es del “proceso correctode configuración”. ¿Puedes explicarnosalgo más este punto?

I.R: Esto tiene que ver con proble-ma común, tal cual es el de la incorrec-ta configuración de IIS. Si tienes un ser-vidor Web, con un cortafuegos en elmedio, hay que considerar que el pro-tocolo HTTP está pensado, pongamos,para 100.000 usuarios por servidor. Sino cambias la configuración, el servidorestá predeterminado a unas pocas cone-xiones.

La última pregunta tiene que ver conIndigo, naturalmente. ¿Cuál es la granpromesa de esta tecnología?

Yo diría que lo más notable deIndigo es que se trata de una tecnolo-gía capaz de permitirnos crear aplica-ciones de forma totalmente indepen-diente del mecanismo de transporte queutilice. En Remoting, teníamos monto-nes de posibilidades, pero estábamos

constreñidos a la utilización de la pla-taforma .NET. La construcción deIndigo, supone mecanismos de intero-perabilidad entre plataformas que noestaba presente en Remoting. Disponesde canales para poder optimizar lascomunicaciones en la mejor forma. Siestamos hablando de Indigo hablandocon Indigo, puedes usar named pipes, porejemplo, pero si quieres comunicarte enotras formas, puedes usar SOAP 1.1, tie-nes especificaciones de seguridad inhe-rentes al sistema. Puedes construir laaplicación sin pensar en la forma en quese va a comunicar con otros sistemas,pudiendo ser independiente de eso.

Pues muchas gracias por tus res-puestas y por las conferencias.

A ti y a dotNetManía, por vuestrointerés en mi trabajo.

dotN

etM

anía

<<

13

dnm.directo.entrevistas<<

Ingo Rammer en un momento de su ponencia

lo más notable de Indigo es que se trata de una tecnología capaz de permitirnos crear aplicaciones de

forma totalmente independiente del mecanismo de transporte que utilice

Page 14: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Windows Communication Foundation (WCF) es el nuevo modelo de programación unificado para el desarrollo de comunicaciones

Diseñadores de controles

Cuando implementamos un control, además de su funcionalidad en tiempo deejecución, es importante que disponga de un buen soporte en tiempo de dise-ño, consiguiendo así un aspecto y comportamiento mucho más profesional.

<<

Cuando hablamos de soporte en tiempo dediseño, nos estamos refiriendo a las facilidades quenos brinda el entorno de desarrollo. Entre éstasse encuentran el cuadro de herramientas, la ven-tana de propiedades y los diseñadores que nos pro-porcionan múltiples facilidades a la hora de pro-gramar.

Hay que tener en cuenta que disponemos de dostipos de controles: los controles Web y los controles deWindows. La diferencia entre unos y otros radica prin-cipalmente en su renderización: los controles Webgeneran HTML, mientras que los controles deWindows usan GDI+. Trataremos en este artículolos controles Web, pero los conceptos aquí vistospueden ser igualmente aplicados a los controles deWindows.

El Frame-work .NETproporcionaun conjuntode clases yatributos paradar soporteen tiempo dediseño a ues-tros controlespersonaliza-dos. Con es-tas clases po-demos imple-mentar (verfigura 1):

• Diseñadores.• Convertidores de tipos.• Editores de valores.• Editores de componentes.

En primer lugar debemos apreciar que elsoporte en tiempo de diseño no es parte del entor-no de desarrollo, sino más bien parte del compo-nente. Por ejemplo, si arrastramos un DataGriddentro de un formulario en Visual Studio .NETy abrimos el gestor de propiedades, obtendremosel mismo editor que si lo abrimos con Web Matrixo en SharpDevelop. Para que exista comunicaciónentre el entorno y los controles, el Frameworkproporciona una serie de servicios. Entre éstospodemos encontrar servicios que nos avisan, porejemplo, de cuando nuestro control se ha añadi-do a un formulario, cuando ha sido modificado oeliminado, y nos dan la posibilidad de personali-zar el entorno, por ejemplo, mostrando formula-rios y cuadros desplegables para dar un mejorsoporte a nuestro control.

Arquitectura en tiempo de diseño

David Solís

dnm.plataforma.net

David Solíses Ingeniero Técnico de

Sistemas,Desarrollador Web yWindows en Sevilla Ingenieros y

miembro del Club .NET de Sevilla.

La diferencia entre los controlesWeb y los controles Windows radicaprincipalmente en su renderización.

Figura 1

Page 15: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Windows Communication Foundation (WCF) es el nuevo modelo de programación unificado para el desarrollo de comunicaciones

El control RssControl

Para mostrar cada una de las características ante-riores, implementaremos el soporte en tiempo de dise-ño del control RssControl. Este control personaliza-do toma una o varias direcciones de documentos RSSy devuelve la unión de cada una de las entradas encon-tradas en dichas direcciones ordenadas por fechas. Conél podremos construir lo que comúnmente se conocecomo un mundo de blogs (figura 2 izquierda) y sim-plemente proporcionar un servicio de noticias en nues-tra Web desde varias fuentes (figura 2 derecha).

Cada una de estas entradas (items RSS 2.0) poseeuna serie de elementos como son el título, el autor, lacategoría, etc. Le podremos indicar al control qué ele-mentos se mostrarán, en qué orden y además, aplicar-le un estilo a cada uno de ellos, para lo cual el controldispone de la propiedad ElementsItem del tipoRssControlElementList, que no es más que una listade objetos RssControlElement, los cuales indican dequé elemento se trata y el estilo aplicado. Por ejem-plo, supongamos que queremos que se muestren eltítulo, la categoría, la descripción y el enlace en esteorden y aplicarle un estilo a cada uno de ellos. En estecaso tendríamos que escribir el siguiente código:

RssControl1.ElementsItem.Add( new RssControlElement( NameRSSItemElement.title, "cssRssTitle" ) );

RssControl1.ElementsItem.Add( new RssControlElement( NameRSSItemElement.category, "cssRssCategory" ) );

RssControl1.ElementsItem.Add( new RssControlElement( NameRSSItemElement.description, "cssRssDescription" ) );

RssControl1.ElementsItem.Add( new RssControlElement( NameRSSItemElement.link, "cssRssLink" ) );

Lo ideal sería disponer de una interfaz en la quepodamos indicar todos estos parámetros y así evitarescribir líneas de código para configurar el control.Además, le daremos al control un aspecto más indi-cado y profesional en tiempo de diseño. Comen-zaremos implementando el diseñador.

Diseñadores

Los diseñadores nos permiten diferenciar entre elaspecto que tendrá nuestro control en tiempo de diseñoy el que tendrá en tiempo de ejecución. La interfazSystem.ComponetModel.Design.IDesigner define la fun-cionalidad de un diseñador y la clase ComponentDesignerimplementa la funcionalidad base. Debido a las diferen-cias, ya comentadas, a la hora de renderizar entre los con-troles Web y los controles de Windows se proporcionandos clases más específicas: System.Windows.Forms.Design.ControlDesigner y System.Web.UI.Design.ControlDesigner. Para implementar un diseñador per-sonalizado debemos derivar de una de las clases anterio-res y sobrescribir los métodos mostrados en la tabla 1.

En la figura 3 podemos ver un ejemplo del aspec-to en tiempo de diseño del control cuando tiene pro-piedades configuradas y cuando no. El código del dise-ñador del control RssControl quedaría como se mues-tra en el fuente 1.

dotN

etM

anía

<<

15

dnm.plataforma.net<<

Figura 2

Métodos a sobrescribir Descripción

GetDesignTimeHtmlDevuelve el código HTML que representa el con-trol en tiempo de diseño.

GetEmptyDesignTimeHtml

Devuelve el código HTML cuando la renderiza-ción anterior es una cadena vacía. Esto ocurre,por ejemplo, cuando no se han definido los pará-metros del control.

GetErrorDesignTimeHtmlDevuelve el código HTML cuando se produce unerror en la renderización.

InitializeEste método se invoca cuando el diseñador esinstanciado.

Tabla 1.Métodos principales a sobrescribir al implementar un diseñador.

public class RssControlDesigner : System.Web.UI.Design.ControlDesigner{

public override void Initialize(IComponent component){

if (!(component is RssControl)){

throw new ArgumentException("Control inválido.", "component");}((RssControl)component).EnTiempoDeDiseño = true;base.Initialize (component);

}protected override string GetEmptyDesignTimeHtml(){

string strHtml = "¡ Atención ! El control no ha" + "sido configurado.";return strHtml;

}public override string GetDesignTimeHtml(){

StringWriter writer = new StringWriter();HtmlTextWriter htmlWriter = new HtmlTextWriter(writer);RssControl ctrl = (RssControl)Component;ctrl.RenderControl(htmlWriter);return writer.ToString();

}}

Fuente 1. Implementación de un diseñador

Page 16: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Windows Communication Foundation (WCF) es el nuevo modelo de programación unificado para el desarrollo de comunicaciones

En el método Initialize controlamos qué tipode componente está haciendo uso del diseñador. Enel caso de no ser un RssControl elevamos una excep-ción. Además, vemos que RssControl posee una pro-piedad interna, EnTiempoDeDiseño. De esta formapodemos dejar que sea el control el que realice la ren-derización, como se puede apreciar en el métodosobrescrito GetDesignTimeHtml.

Una vez que tenemos nuestro diseñador debe-mos enlazarlo al control. Para ello disponemos delatributo Designer al que únicamente se le indica eltipo del diseñador:

[Designer( typeof(RssControlDesigner) )]

public class RssControl :

System.Web.UI.WebControls.WebControl

Convertidores de tipo

Los valores de las propiedadesse guardan en texto como parte delas etiquetas HTML. Los converti-dores de tipo son los encargados derealizar conversiones de un tipo aotro. En tiempo de diseño se suelenusar para realizar conversiones acadena, además de otras como la

conversión a InstanceDescriptor. Un InstanceDescriptor es capaz de crear la ins-

tancia de una clase. Por ejemplo, supongamos quetenemos una clase Punto, que posee un construc-tor con dos parámetros enteros, x e y. Si tenemoseste objeto seriado y necesitamos recrearlo pode-mos usar un InstanceDescriptor como se muestraen el fuente 2.

La clase InstanceDescriptor necesita un objetoConstructorInfo, que representa el constructor y unamatriz de parámetros. Mediante el método Invoke,obtenemos la instancia buscada.

En ocasiones se le pedirá a nuestro convertidorde tipo que proporcione un InstanceDescriptor pararecrear el objeto, por lo que está obligado implemen-tar esta conversión, al igual que la conversión de nues-tro tipo a cadena y viceversa.

Para implementar un convertidor de tipo debe-mos extender la clase System.ComponentModel.TypeConverter. Los métodos más importantes deésta y que deben ser sobrescritos se muestran enla tabla 2:

dotN

etM

anía

<<

16

dnm.plataforma.net<<

Con los diseñadores podemos darle un aspecto más indicado a nuestro control

en tiempo de diseño.

Figura 3

ConstructorInfo constructor = typeof(Punto).GetConstructor( new Type[] { typeof(int), typeof(int));

InstanceDescriptor instancia = new InstanceDescriptor( constructor, new object[] { x, y } );

Punto p = instancia.Invoke();

Fuente 2.Uso de InstanceConverter.

Métodos a sobrescribir Descripción

CanConvertFromIndica si se puede convertir desde el tipo indica-do a nuestro tipo.

CanConvertToIndica que se puede convertir desde nuestro tipoal tipo indicado.

ConvertFromRealiza la conversión desde el tipo indicado a nues-tro tipo.

ConvertToRealiza la conversión desde nuestro tipo al tipoindicado.

Tabla 2.Métodos principales a sobrescribir al implementar un convertidor de tipos.

Page 17: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Windows Communication Foundation (WCF) es el nuevo modelo de programación unificado para el desarrollo de comunicaciones

En nuestro caso queremos que lapropiedad ElementsItem pueda ser edi-tada mediante la ventana de propieda-des o desde el editor HTML (figura 4).Para ello debemos implementar un con-vertidor de tipo. En el fuente 3 vemosla implementación de CanConvertTo yConvertTo. En CanConvertTo únicamen-te comprobamos si el tipo al que se estáintentando convertir es una cadena o unInstanceDescriptor, que son las conver-siones permitidas.

Para enlazar el convertidor connuestro tipo usamos el atributoTypeConverter, que recibe como pará-metro el tipo del convertidor. Este atri-buto podemos aplicarlo tanto a la clasecomo a una propiedad de la clase. Si elatributo es aplicado directamente a laclase, no será necesario aplicarlo a losatributos por separado.

Editores de valores

Los editores de valores, nos dan laposibilidad de mostrar una interfaz deusuario desde la ventana de propieda-des para editar una propiedad en con-creto. Por ejemplo, cuando seleccio-namos la propiedad Columns de unDataGrid nos aparece un botón conpuntos suspensivos (“...”) que al pul-sarlo nos proporcionará un formula-rio desde el cual podremos configurarlas columnas de éste. Un editor devalores se hace necesario cuando edi-tar la propiedad en modo texto es muyengorroso. En nuestro caso, el usua-rio, deberá saber qué elementos decada item existen y además tener sumocuidado de no equivocarse en el nom-bre de éstas y el formato de la propie-dad. Por tanto, es más interesante pro-porcionarle una interfaz que le facili-te el trabajo.

dotN

etM

anía

<<

17

dnm.plataforma.net<<

public class RssElementListConverter : System.ComponentModel.TypeConverter{

public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType){

if ((destinationType == typeof(string)) || (destinationType == typeof(InstanceDescriptor))){

return true;}return base.CanConvertTo(context, destinationType);

}

public override object ConvertTo( ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)

{if (value != null){

if (!(value is RssControlElementList)){

throw new ArgumentException("Tipo no válido.", "value");}

}

if (typeof(string) == destinationType){

if (value == null){

return String.Empty;}

RssControlElementList rssElementList = (RssControlElementList)value;

TypeConverter elementConverter = TypeDescriptor.GetConverter( typeof(RssControlElement));

// Cada elemento estará separado por comas.string strRssElementList = "";foreach ( RssControlElement element in rssElementList ){

//Usamos el convertidor de cada elemento.strRssElementList += elementConverter.ConvertTo(element,typeof(string))+ ";";}if( strRssElementList.Length > 0 ) strRssElementList =

strRssElementList.Substring(0,strRssElementList.Length-1);

return strRssElementList;}else if (destinationType == typeof(InstanceDescriptor) ){

if( value == null) return null;

MemberInfo memberInfo = null;object[] memberParameters = null;RssControlElementList lElement = (RssControlElementList)value;if( lElement.Count == 0 ){//constructor sin parámetrosmemberInfo = typeof(RssControlElementList).GetConstructor(new Type[0]);

}else{//constructor que recibe como parámetro//una matriz de RssControlElementType mRssControlElementType = typeof(RssControlElement[]);memberInfo = typeof(RssControlElementList).GetConstructor(

new Type[] { mRssControlElementType });

//construimos el parametroRssControlElement[] mRssControlElement = new RssControlElement[lElement.Count];for( int i=0; i < lElement.Count; i++)

mRssControlElement [i] = lElement[i];memberParameters = new object[] { mRssControlElement };

}if( memberInfo != null ){return new InstanceDescriptor( memberInfo, memberParameters );

}}return base.ConvertTo(context, culture, value, destinationType);

}}

}

Fuente 3. Implementación de un convertidor de tipos.

Figura 4

[TypeConverter(typeof(RssElementListConverter))]

public class RssControlElementList : IEnumerable

Page 18: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Windows Communication Foundation (WCF) es el nuevo modelo de programación unificado para el desarrollo de comunicaciones

Con los editores de valores pode-mos mostrar un formulario o un cua-dro desplegable donde dibujar la inter-faz. Para crear un editor de valoresdebemos heredar de System.Drawing.Design.UITypeEditor y sobrescribir losmétodos EditValue y GetEditStyle.Este último especifica el tipo de edi-tor que se mostrará. Para ello devuel-ve un valor de la enumeración UITypeEditorStyle:

• Modal. Muestra un formulariomodal.

• DropDown. Muestra un cuadro dedesplegable.

• None. No proporciona interfazgráfica.

El método EditValue posee tresparámetros:

ITypeDescriptorContext nos pro-porciona información contextual sobrenuestro componente. Podemos obte-ner una referencia al contenedor (pro-piedad Container) del control en tiem-po de diseño o información sobre la pro-piedad editada (propiedad PropertyDescriptor).

En el inicio de este artículo habla-mos sobre los servicios proporciona-dos por el Framework. La interfazIServiceProvider define el mecanis-mo para obtener estos servicios.Mediante ésta podemos obtener unservicio IWindowsFormsEditorServiceque nos permite mostrar un formula-rio usando el método ShowDialog o uncuadro desplegable mediante el méto-do DropDownControl.

En nuestro caso vamos a mostrarun formulario igual al que aparece enla figura 5. En el código fuente pode-mos ver la implementación de los dosmétodos. Como podemos ver, es muysencilla. El caso de mostrar un cuadrodesplegable lo dejamos como tarea allector, basta sobrescribir DropDownControl.

Como en los anteriores casos, unavez implementado el editor, debemos

enlazarlo a nuestro tipo o campo de laclase. Se dispone del atributo Editor, alque se le proporciona el tipo del editory el de su clase base.

[Editor(typeof(RssElementsItemEditor),

typeof(UITypeEditor))]

El Framework proporciona múlti-ples convertidores de tipo y editores depodemos utilizar.

Editores de componentesLos editores de componentes son

similares a los editores de valores, puestambién muestran una interfaz perso-nalizada, sólo que en este caso nos per-mite editar varias propiedades del con-trol (no sólo una de ellas como era elcaso de los editores de valores). Estainterfaz es análoga a las páginas de pro-piedades disponibles en algunos contro-les ActiveX.

Para el control RSSControl hemosdiseñado una interfaz (figura 6) en la que además de la propiedadElementsItem, podemos editar otras

dotN

etM

anía

<<

18

dnm.plataforma.net<<

public virtual object EditValue(

ITypeDescriptorContext,

IServiceProvider, object);

public class RssElementsItemEditor : UITypeEditor {

public override object EditValue( ITypeDescriptorContext context, IServiceProvider provider, object value)

{//si estamos en tiempo de diseñoif ((context != null) && (provider != null )){

//obtenemos el servicio que nos va a permitir//mostrar un formulario haciendo uso del proveedorIWindowsFormsEditorService editorService =

(IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));

//creamos el formularioElementsItemEditorDlg form = new ElementsItemEditorDlg();form.ElementsItem = (RssControlElementList)value;

//lo mostramosDialogResult result = editorService.ShowDialog(form);

//si se ha aceptado el resultado lo actualizamosif(result == DialogResult.OK ){

value = form.ElementsItem;}

}return value;

}

public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)

{if( context != null){

return UITypeEditorEditStyle.Modal;}return base.GetEditStyle(context);

}

}

Fuente 4. Implementación de un editor de valores.

Figura 5

Page 19: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Windows Communication Foundation (WCF) es el nuevo modelo de programación unificado para el desarrollo de comunicaciones

como el almacenamiento en caché, elnúmero de entradas a mostrar o el ele-mento HTML usado en la renderiza-ción.

Para desarrollar un editor de com-ponentes debemos derivar de System.Windows.Forms.Design.WindowsFormsComp

onentEditor. Esta clase implementa lafuncionalidad base para los editores queutilizan un formulario como página depropiedades. Debemos sobrescribir elmétodo EditComponent que recibe comoparámetros un descriptor de contexto,el objeto a editar y una ventana que debeser la propietaria del editor.

En el fuente número 5 vemos laimplementación del método EditComponent. El proveedor de servicioslo obtenemos mediante la propiedadSite del control. A partir del provee-dor de servicios, obtenemos el servi-cio de IDesignerHost, para administrarlas transacciones, y el servicioIComponentChangeService, que nos per-mitirá avisar al diseñador si se hanproducido cambios en nuestro con-trol.

El despliegue de editores de com-ponentes se realiza mediante unaopción del menú contextual del con-trol o mediante las opciones que apa-recen bajo la ventana de propiedades(figura 7). Para agregar estos coman-dos, debemos añadir verbos. Los ver-bos asocian un elemento de menú conun controlador de eventos. Estos ver-bos quedan definidos mediante la pro-piedad Verbs de nuestro diseñador, porlo que tendremos que añadir nuestronuevo verbo a esta colección. En elfuente 6 se muestra cómo agregar uncomando y su correspondiente con-trolador.

dotN

etM

anía

<<

19

dnm.plataforma.net<<

Figura 6

public override bool EditComponent(ITypeDescriptorContext context, object component,IWin32Window parent)

{//Comprobamos que es un componente RssControl

if ( !(component is RssControl) ){

throw new ArgumentException("Debe ser un componente RSSControl", "component");}

//Obtenemos un proveedor de servicios IServiceProvider svrPrvSite = ((RssControl)component).Site;IComponentChangeService changeSrvc = null;

DesignerTransaction trans = null;bool changed = false;

try{

//Si disponemos de proveedor de servicios lo usamos para//obtener el host y el servicio de cambios del componenteif (svrPrvSite != null){

IDesignerHost designerHost = (IDesignerHost)svrPrvSite.GetService(typeof(IDesignerHost));

trans = designerHost.CreateTransaction("Property Builder");

changeSrvc = (IComponentChangeService)svrPrvSite.GetService(typeof(IComponentChangeService));

if (null != changeSrvc){

try{changeSrvc.OnComponentChanging( (RssControl)component, null);

}catch (CheckoutException err) {if (err == CheckoutException.Canceled)

return false;throw err;

}}

}

try{

//Creamos y mostramos el editorRssControlEditorDlg form = new RssControlEditorDlg();form.ElementItems = ((RssControl)component).ElementsItem;

if (form.ShowDialog(parent) == DialogResult.OK){

changed = true;}

}finally{

//si hay cambios los comunicamosif (changed && (null != changeSrvc)) {

changeSrvc.OnComponentChanged((RssControl)component, null, null, null);}

}}finally{

//cerramos las transacciones según correspondaif (trans != null){

if (changed){

trans.Commit();}else{

trans.Cancel();}

}}

return changed;}

Fuente 5. Implementación el método EditComponent de un editor de componentes.

Page 20: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Windows Communication Foundation (WCF) es el nuevo modelo de programación unificado para el desarrollo de comunicaciones

Conclusión

Cuando implementamos un control para terce-ros, es muy importante darle profesionalidad a nues-tro trabajo. En este artículo se ha tratado el sopor-te en tiempo de diseño, pero existen más aspectosa tener en cuenta, como son una fácil instalación,buena documentación y ejemplos de código de sufuncionalidad.

Además hay otros muchos aspectos más fáciles deaplicar mediante atributos, como indicar el icono denuestro control en la ventana de herramientas, agre-garle ItelliSense, definir la categoría de nuestras pro-piedades, etc.

dotN

etM

anía

<<

20

dnm.plataforma.net<<

public class RssControlDesigner : ControlDesigner{

private DesignerVerbCollection _verbs;

public RssControlDesigner(){

_verbs = new DesignerVerbCollection();_verbs.Add( new DesignerVerb("Configurar el control",

new EventHandler(this.ConfigurarControl)));}

public override DesignerVerbCollection Verbs{

get { return _verbs; }}

private void ConfigurarControl(object sender, EventArgs e){

RssControlEditor editor = new RssControlEditor();editor.EditComponent( Component );

}

...

...

...}

Fuente 6.Agregar comandos a través del diseñador.

Figura 7

Si no quieres quedarte con ninguna duda, éste es el más completo de todos.Trata tanto los controles Windows como Web y explica con bastante claridad

toda la arquitectura propuesta en el Framework.

Developing Microsoft ASP.NETServer Controls And ComponentsNikhil/Datye,V. Kothari,Nikhil Kothari,Vandana DatyeEditorial: Microsoft PressPáginas: 752 ISBN: 0735615829 Publicado en agosto de 2002Idioma: Inglés

bibliografía

User Interfaces in VB .NET:Windows Forms and CustomControlsMatthew MacDonald Editorial: ApressPáginas: 580ISBN: 1590590449 Publicado en julio de 2002 Idioma: Inglés

Building ASP.NET Server ControlsRob Cameron,Dale Michalk Editorial: ApressPáginas: 880 ISBN: 1590591402 Publicado en diciembre de 2003Idioma: Inglés

Developing .NET Custom Controls& Designers using C#James HenryEditorial: BlueVisionPáginas: 500ISBN: 0972317910 Publicado en septiembre de 2002Idioma: Inglés

Page 21: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Windows Communication Foundation (WCF) es el nuevo modelo de programación unificado para el desarrollo de comunicaciones

❑ Deseo suscribirme a dotNetManía por un año (11 números) por un precio de 65,00€ IVA incluido y recibir el CDVolumen 1 con los 11 primeros ejemplares en formato PDF de alta calidad de forma gratuita. Si su dirección está fuera de Españael precio es de 65,00€ transporte incluido (más información sobre envíos internacionales en www.dotnetmania.com)

❑ Deseo que me envíen los números atrasados marcados según el precio de portada. Otros:

FORMA DE PAGO❑ Talón nominativo a nombre NETALIA, S.L.❑ Transferencia bancaria a nombre de NETALIA, S.L. a:

La Caixa - Número de cuenta 2100 4315 48 2200014696 (Indique su nombre en la transferencia)

❑ Domiciliación Bancaria (con renovación automática, previo aviso)Indique su número de cuenta:

❑ Tarjeta de crédito❑ VISA ❑ MASTERCARDNúmero de su tarjeta: Fecha de caducidad: / (imprescindible)

Firma y/o sello

a de de 2006

DATOS DE ENVÍO

CIF/NIF. . . . . . . . . . . . . . . . . . . . Empresa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Nombre y apellidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Dirección . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Población . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Código Postal . . . . . . . . . . . . . . . . . . . Provincia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Teléfono . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Fax . . . . . . . . . . . . . . . . . . . . . . . . . . . email . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

DATOS DE FACTURACIÓN (sólo si son distintos a los datos de envío)

CIF/NIF. . . . . . . . . . . . . . . . . . . . Empresa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Nombre y apellidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Dirección . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Población . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Código Postal . . . . . . . . . . . . . . . . . . . Provincia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Teléfono . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Fax . . . . . . . . . . . . . . . . . . . . . . . . . . . email . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Usted autoriza a la mecanizaciónde estos datos. El responsable ydestinatario de éstos es Netalia,S.L. Usted tiene derecho a acce-der a sus datos, modificarlos ycancelarlos cuando lo desee. Susdatos no serán cedidos en ningu-na de las formas posibles a terce-ras partes y no se utilizarán másque para el buen funcionamien-to de su suscripción a la revistadotNetManía y para informar-le de las actividades comercialesque realice la editorial Netalia,S.L. Si no desea recibir informa-ción comercial de dotNetManíamarque la casilla siguiente ❑Puede enviar sus datos por Fax al 91 499 13 64, o por teléfono al 91 666 74 77,

o por email a la dirección [email protected], o también puedeenviarlos por correo postal a la siguiente dirección:

Netalia, S.L.C/ Robledal, 13528529- Rivas Vaciamadrid (Madrid)

❑ Nº9 (6,00€) ❑ Nº11 (6,00€) ❑ Nº12 (6,00€) ❑ Nº13 (6,00€) ❑ Nº14 (6,00€)❑ Nº10 (6,00€)

Suscríbase y llévese el CD Volumen 1 GRATIS

Oferta válida hasta el 31 de enero de 2006 o hasta agotar existencias

¡Últimas unidades!

❑ Nº8

❑ Nº15 (6,00€) Nº16 (6,00€)

AGOTADO

❑ Nº18 (6,00€) ❑ N19 (6,00€) ❑ Nº20 (8,50€)Nº17 (6,00€) ❑ Nº21 (6,00€)

Page 22: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Windows Communication Foundation (WCF) es el nuevo modelo de programación unificado para el desarrollo de comunicaciones

Primeros pasos conWindows Storage Foundation (I)

En el PDC 2005,Microsoft sorprendió a propios y extraños anunciando el lanzamien-to de la versión Beta 1 de su nuevo sistema de ficheros relacional, bautizado con elnombre Windows Storage Foundation y más conocido desde el PDC 2003 por su nom-bre en clave WinFS (Windows Future Storage). La sorpresa fue desvelar el doble secre-to que se guardaba.Como decía mi abuela:“¿No querías sopa? Toma dos platos”.Trataréde explicar porqué sorprendió tanto y cuál era ese doble secreto, pero para eso ten-dré que contar toda la historia...

<<

Aurelio Porras

dnm.plataforma.net

Aurelio PorrasEs Developer Evangelist en la

División de Desarrollo yPlataforma (DPE) de Microsoft

Ibérica, Su objetivo es ayudar a losdesarrolladores y empresas

españolas en la adopción de laplataforma de desarrollo .NET

La idea de un sistema de ficheros relacional noes nueva ni semi-nueva. Muchos proyectos deMicrosoft, más o menos conocidos, han estadogirando en torno a esta idea y podemos remontar-nos hasta casi tres lustros atrás para encontrar elgénesis. Yo he tenido que desempolvar algunos incu-nables, pero los más viejos del lugar recordarán,allá a principios de los 90, un proyecto llamadoCairo a cargo del equipo de Windows NT y queincluía un nuevo sistema de ficheros relacional lla-mado OFS (Object File System). OFS sería capaz desoportar seudo-carpetas que contuvieran vistas dedatos almacenados físicamente en diferentes volú-menes, locales en el disco de la máquina o remotosen carpetas compartidas de otras máquinas. El pro-yecto Cairo, muy ambicioso y demasiado comple-jo de realizar, desembocó en Windows NT 4.0 yOFS no pudo ver la luz aunque el trabajo en estesubproyecto continuaría. A mediados de los 90, OFSvuelve a emerger con el proyecto Storage+, uno delos tres pilares del modelo COM (Component ObjectModel), junto con COM+ y Forms+ (dejo al lectorque saque el curioso paralelismo). Storage+ seríaun nuevo sistema de ficheros relacional y orienta-do a objetos y pretendía sustituir al sistema de fiche-ros NTFS, basándose en el motor relacional de laentonces futura versión 7.0 de la base de datos SQLServer. Pero el hecho de que este SQL Server sereescribiera desde cero hizo que Storage+ sufrieraretrasos. A principios del 2000, Storage+ se rebau-

tizó con el nombre RFS (Relational File System),pero tampoco vería la luz ya que el mercado exigióa Microsoft focalizar esfuerzos en mejorar sus pro-ductos relacionados con almacenes de datos;OFS/Storage+/RFS volvió a retrasarse para fechasfuturas.

Hasta el ya famosísimo PDC 2003, donde Microsoftpresentó su siguiente versión de Windows, llamado enclave Longhorn, y sus tres pilares principales conoci-dos por sus nombres en clave: un nuevo subsistema depresentación llamado Avalon; un nuevo subsistema decomunicaciones llamado Indigo; y un nuevo subsiste-ma de almacenamiento llamado WinFS (WindowsFuture Storage). WinFS tomaba el testigo de los traba-jos realizados en Storage+/RFS, pero no sustituiría aNTFS sino que funcionaría sobre él, de forma similaral proyecto original OFS.

Un poco de historia

WinFS tomaba el testigo de los trabajos realizados en Storage+/RFS,pero no sustituiría a NTFS sino quefuncionaría sobre él, de forma similar

al proyecto original OFS.

Page 23: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Windows Communication Foundation (WCF) es el nuevo modelo de programación unificado para el desarrollo de comunicaciones

© Caricatura por Yamil Hernández

Cuando todo apuntaba que, por fin, tras más deuna década, la idea de un sistema de ficheros rela-cional se iba a convertir en realidad, a finales delverano del 2004Microsoft anunció cam-bios en su plan paraWindows Longhorn:retrasaba su lanzamiento,pero a cambio tres de sustecnologías clave estarí-an disponibles paraWindows XP y WindowsServer 2003: Avalon,Indigo y las API gestio-nadas de WinFX(Windows Framework)necesarias para soportarlas dos primeras. ¿YWinFS? Se retrasaba sudisponibilidad sin fechadeterminada, para des-pués del lanzamiento de Windows Longhorn pre-visto a mediados de 2006. Este anuncio evocó en lamente de muchos una conclusión muy natural:“Como sus proyectos antecesores, WinFS ha muer-to. Requiescat In Pace”.

Pero, en el PDC 2005, salta la gran sorpresa aldesvelarse el doble secreto celosamente guardado porMicrosoft Corporación: WinFS tiene continuidad bajoel nombre Windows Storage Foundation como tec-nología clave para Windows Vista (Longhorn). Esteanuncio sorprendió a propios porque ni los que tra-bajamos en esta casa conocíamos su estado tras el apa-rente abandono que sufrió en el verano del 2004; ysorprendió a extraños porque muchos pensaban queWinFS se había, permitidme la expresión, “vaporwa-reizado”. Y además, el secreto era doble porque aligual que los otros dos pilares de Windows Vista,

Windows Presentation Foundation (Avalon) y WindowsCommunication Foundation (Indigo), Windows StorageFoundation (WinFS) estará también disponible paraWindows XP y Windows Server 2003. Esto tiene unefecto mucho más importante de lo que pueda pare-cer ya que todas estas tecnologías clave de WindowsVista podrán alcanzar a un público mucho más amplio,lo que animará a comenzar cuanto antes el desarrollode aplicaciones con WinFX.

Larga y tortuosa ha sido la historia del sistema deficheros relacional, aunque con final feliz: WindowsStorage Foundation (en adelante WSF) saldrá a mer-cado después del lanzamiento de Windows Vista, comoun componente Windows con su versión correspon-diente del API WinFX y con soporte para WindowsXP y Windows Server 2003.

Para dar los primeros pasos con esta tecnología uti-lizaremos los bits de la versión Beta 1 de WSF anun-ciada en el PDC 2005 (aún utiliza el nombre WinFS),que está disponible para Windows XP SP2 y que pode-mos probar a nivel de desarrollo utilizando la versionesBeta 2 de Visual Studio 2005 y .NET Framework 2.0.

Estos primeros bits se pue-den descargar de MSDNOnline en http://msdn.microsoft.com/data/winfs.Tenga presente el lectorque estas versiones preli-minares están en continuaevolución, por lo que losejemplos que se muestrenno funcionarán, casi contoda seguridad, en versio-nes futuras.

A mediados del 2006,con el lanzamiento deWindows Vista, está pre-visto liberar la versiónBeta 2.

Principales limitaciones de un sistema deficheros tradicional

Con un sistema de ficheros tradicional, como FATo NTFS, el usuario está restringido a organizar suscontenidos almacenándolos en ficheros dentro de unajerarquía de directorios o carpetas. Esta restricciónlimita al usuario a la hora de buscar el contenido quese desea encontrar ya que la única forma de identifi-car un determinado contenido es a través de su nom-bre de fichero y su path o ruta de acceso a través delos directorios. Aunque estamos muy acostumbradosa trabajar con esta limitación, no es una forma muynatural manejar contenidos identificándolos por elnombre del fichero que guarda el chorro de datos ostream; es mucho más natural identificar un conteni-do por su tipo y sus atributos o “propiedades”: un

dotN

etM

anía

<<

23

dnm.plataforma.net<<

En el PDC 2005, salta la gran sorpresaal desvelarse el doble secreto

celosamente guardado por MicrosoftCorporación:WinFS tiene continuidad

bajo el nombre Windows StorageFoundation como tecnología clave

para Windows Vista

Page 24: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Windows Communication Foundation (WCF) es el nuevo modelo de programación unificado para el desarrollo de comunicaciones

documento se identifica con su título o su autor y unmensaje de correo electrónico con su asunto o su remi-tente. Como los sistemas de ficheros tradicionales noson capaces de soportar las propiedades que puedenidentificar los diferentes tipos de contenidos, estaspropiedades suelen estar embebidas como “metada-tos” en el propio fichero (en el propio stream), comoel título y el autor de un documento Word, o en unelemento dentro de un almacén de datos (que tam-bién es a su vez un fichero), como el asunto y el remi-tente de un mensaje de correo electrónico que a suvez está archivado en un almacén de mensajes deOutlook.

Además, para un mismo tipo de contenido pue-den existir diversos formatos, con lo que acceder a laspropiedades y a los datos de los contenidos se com-plica: un documento de Word y un documento deAcrobat son documentos de texto pero con unos for-matos propietarios bien distintos. Una aplicación quequiera utilizar un deter-minado formato deberáconocer perfectamente elformato correspondientedel fichero o del almacénde datos para ser capaz deacceder las propiedades ylos datos que contiene.Normalmente, para ayu-dar al usuario en la identi-ficación de los diferentesformatos se utilizan exten-siones de ficheros “bienconocidas”: .DOC paradocumentos Word; .MP3para contenidos de audioen formato MP3 (MPEG-1 Audio Layer 3); .JPGpara imágenes en formatoJPEG (Joint Photographic Experts Group); .PST paraalmacenes de mensajes en formato Outlook; etc.Aunque estemos acostumbrados a entender las exten-siones de ficheros, no es tampoco natural trabajar concontenidos a este nivel.

Hasta aquí, las dos limitaciones descritas son bienconocidas. A partir de ahora dejemos volar un poco laimaginación y pidamos deseos. A la hora de trabajar concontenidos, con información, ¿qué es lo que me gusta-ría que el sistema de ficheros fuera capaz de hacer?

En el mundo real, los contenidos que utilizamosestán relacionados entre sí de un modo u otro: un men-saje tiene un remitente que puede ser un contacto demi agenda y además puede ser el autor de documentosque utilizo en el proyecto que estoy trabajando. Unsistema de ficheros tradicional es incapaz de soportareste tipo de asociaciones entre contenidos. Por lo tan-to, los distintos tipos y formatos de contenidos conlos que trabajamos se comportan como “islas de infor-

mación”, inconexas entre sí. Somos nosotros, con osin ayuda de aplicaciones, los que relacionamos loscontenidos.

Tampoco es raro que manejemos distintas apli-caciones que utilizan los mismos tipos de conteni-dos. Los contactos son un ejemplo de tipo de conte-nido compartido por diferentes aplicaciones: losusamos, por ejemplo, en nuestra aplicación decorreo electrónico, en nuestra aplicación de men-sajería instantánea y en nuestro teléfono móvil.Cada aplicación define su propio esquema del tipocontacto, según los datos que necesite: en el correoelectrónico los datos de un contacto giran en tor-no a su dirección de correo electrónico; en la men-sajería instantánea alrededor de su dirección demensajería; y en el teléfono móvil alrededor delnúmero de teléfono. Al final, el mismo contactoestá definido de tres formas distintas, está almace-nado con tres formatos distintos y en tres sitios dis-

tintos. En cuanto cam-bie un dato compartidodesde una de las aplica-ciones, como el nombredel contacto por ejem-plo, tendré un problemade consistencia.Naturalmente, este pro-blema no le tendría sipudiera definir de algúnmodo esquemas comu-nes de tipos de conteni-dos compartidos y dis-poner de un único lugardonde almacenar loscontenidos compartidospor las diferentes aplica-ciones. Pero esto no escapaz de soportarlo un

sistema de ficheros tradicional, que no sabe qué esun esquema ni un tipo de contenido.

Siguiendo con el mismo ejemplo de los contactoscompartidos y el problema de la consistencia, otraposible solución sería que el sistema de ficheros fue-ra capaz de propagar los cambios que realicemos sobrecontenidos de tipos compartidos, sincronizando loscontenidos independientemente de las ubicacionesfísicas y de los formatos de contenidos. Pero un sis-tema de ficheros tradicional es incapaz de hacerlo. Enel mejor de los casos, son las aplicaciones las que man-tienen actualizados los datos de mis contenidos “com-partidos” a través de mecanismos de sincronización ode importación/exportación.

Y por último, un sistema de ficheros tradicional esincapaz de actuar con los contenidos, de reaccionar si secumplen determinadas condiciones sobre los conteni-dos, de convertir, al fin y al cabo, los contenidos en infor-mación práctica. Por ejemplo, si he recibido por correo

dotN

etM

anía

<<

24

dnm.plataforma.net<<

un sistema de ficheros tradicional esincapaz de actuar con los contenidos,

de reaccionar si se cumplen determinadas condiciones sobre

los contenidos, de convertir,al fin y al cabo, los contenidos en

información práctica

Page 25: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Windows Communication Foundation (WCF) es el nuevo modelo de programación unificado para el desarrollo de comunicaciones

electrónico un documento que esperaba y no me encuen-tro conectado me gustaría recibir un aviso en mi móvily que automáticamente se reserve tiempo en mi agendapara trabajar sobre el documento recibido y para teneruna reunión posterior con mi equipo. Es la persona quetrabaja con la información, en ocasiones asistida por lasaplicaciones, la que se encarga de organizar, filtrar y cla-sificar los contenidos manualmente. Parte de esas tare-as suelen ser acciones mecánicas que realizamos con loscontenidos y que se podrían automatizar a nivel de sis-tema de ficheros si éste lo soportara de algún modo.

Como veremos, hay herramientas que se apoyanen sistema de ficheros tradicionales y con las que sepueden superar algunas de las limitaciones descritas,pero estas herramientas no son inherentes al sistemade ficheros. Aunque superar todas las limitaciones enu-meradas aquí pueda parecer ciencia ficción, WSF pre-tende superarlas todas.

El sistema de ficheros de Windows VistaWindows Vista saldrá al mercado antes que WSF

esté finalizado, por lo que incorporará los sistemas deficheros tradicionales (FAT, NTFS). En cambio,Windows Vista mejora notablemente el modo de inte-ractuar con nuestros contenidos, más allá de estar res-tringido al uso de carpetas como único modo paraorganizarlos. ¿Cómo lo hará si WSF aún no estarádisponible?

Windows Vista Search y Windows Vista Explorer

Lo hará gracias al nuevo buscador Windows VistaSearch que traerá incorporado e integrado con el nue-vo explorador de ficheros Windows Vista Explorer. Sí,es una tecnología de indexación de contenidos. Y granparte de la culpa la tiene el tremendo empuje de lastecnologías de búsqueda de información en Internetcomo Google Search o MSN Search. Los increíbles avan-ces que se han ido produciendo en este campo indu-jeron la pregunta retórica lanzada desde la propiaMicrosoft ¿Porqué puedo encontrar información tanrápidamente en Internet cuando se tarda tantísimo enencontrar información en nuestro propio PC?”. Larespuesta a esta pregunta fue Windows DesktopSearch, que se basa en las tecnologías de indexaciónque se utilizaban en MSN Search y que fueron adap-tadas al PC. Una versión renovada de este buscadorse ha incorporado a Windows Vista y se compone bási-camente de: un subsistema de propiedades, que utili-za manejadores de ficheros y de almacenes de datospara leer y escribir los datos y los metadatos de los dis-tintos formatos de contenidos que se soportan; unmotor de indexación, que etiqueta los datos y los meta-datos de esos contenidos; y un subsistema de consul-tas, que se encarga de resolver las búsquedas sobre losdatos y los metadatos indexados.

Desde el punto de vista del usuario, Windows Vistaintroduce nuevos conceptos como carpetas virtuales,pilas, agrupamientos y filtrados que permitirán acce-der a los contenidos almacenados en el sistema deficheros de una forma mucho más natural: vamos apoder realizar búsquedas textuales sobre los datos ylos metadatos de los contenidos y refinar esas bús-quedas; vamos a poder filtrar los contenidos según loscriterios de búsqueda que queramos determinar y guar-dar esos criterios o filtros a modo de “vistas” del sis-tema de ficheros, como “carpetas virtuales”; y todasestas búsquedas serán más rápidas que las búsquedasen versiones Windows actuales. Desde el exploradorpodremos realizar estas búsquedas y filtrados y podre-mos visualizar los contenidos agrupándolos o apilán-dolos por las propiedades que determinemos (por tipode contenido, por autor, por fecha de creación, etc.);dispondremos de una rica visualización previa de losdatos y los metadatos de nuestros contenidos; podre-mos modificar los metadatos directamente desde elexplorador; y podremos añadir palabras clave a loscontenidos para clasificarlos y facilitar búsquedas pos-teriores (ver imágenes agrupadas en la figura 1).

Desde el punto de vista del desarrollador, WindowsVista proporcionará mecanismos de extensibilidad deforma que podremos añadir nuevos formatos de con-tenidos para que puedan ser “indexables” y “busca-bles” por Windows Vista Search y podremos añadir laforma de previsualizar estos nuevos contenidos en

Figura 1. Imágenes de Windows Vista relacionadas con Windows Vista Explorer y Search

dotN

etM

anía

<<

25

dnm.plataforma.net<<

Page 26: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Windows Communication Foundation (WCF) es el nuevo modelo de programación unificado para el desarrollo de comunicaciones

Windows Vista Explorer. También podremos utilizarlas API de Windows Vista Search para incorporar lascapacidades de búsqueda de contenidos en nuestraspropias aplicaciones (eso sí, estas API son nativas, noson gestionadas de .NET).

Más información en sobre estas tecnologías deWindows Vista en http://msdn.microsoft.com/windowsvista/discoverable.

Entonces, ¿para qué necesitaré WSF?

Con Windows Vista Search y Windows Vista Explorer,el nombre del fichero y la ubicación dentro del siste-ma de ficheros empieza a dar lo mismo. La organiza-ción jerárquica de mis contenidos no importará tan-to si tenemos un potente mecanismo de búsqueda yfiltrado que me permita encontrar el contenido quebusco. Tampoco tengo problemas a la hora de mane-jar diferentes formatos de un mismo tipo de conteni-do (por ejemplo, pistas deaudio en formato WMA oen formato MP3) ya queel subsistema de propieda-des y sus manejadores deficheros me abstraen deesta variedad de formatosextrayendo un esquema depropiedades común al tipode contenido (pista deaudio).

Entonces, ¿para quénecesitaré WSF? En pri-mer lugar, a pesar de lastecnologías de indexación,seguimos teniendo algunas limitaciones al seguir ata-dos a un sistema de ficheros tradicional: no tenemosun lugar donde almacenar contenidos compartidospor diferentes aplicaciones; nuestros contenidos sigueninconexos, aislados unos de otros, sin posibilidad deestablecer relaciones o asociaciones entre contenidos;tampoco es posible sincronizar contenidos con otrossistemas externos a nivel de sistema de ficheros; y, porsupuesto, tampoco es posible que el sistema de fiche-ros actúe y reaccione con los contenidos. Y en segun-do lugar, analicemos lo complicado que se está vol-viendo trabajar con la información. La capacidad dealmacenamiento está creciendo espectacularmente yno será raro en pocos años tener equipos portátilescon 1 terabyte de disco. La generación de contenidosdigitales también está creciendo en la misma propor-ción y los resultados de un estudio de la Universidadde Berkeley asustan: en el año 2002 se generaron 5millones de Terabytes (5 Exabytes) de informacióndigital nueva; gran parte de ésta almacenada en dis-cos de máquinas cliente; y se enviaron y almacenaron400.000 Terabytes de correo electrónico. Y por últi-mo, según la consultora IDC, las personas que traba-

jamos con la información gastamos entre el 15% y el30% del tiempo buscándola y al menos el 50% de lasbúsquedas en la Web no consiguen su objetivo, datoque podemos extrapolar a las búsquedas de conteni-dos en nuestros discos utilizando tecnologías de inde-xación. Todo parece apuntar que está creciendo espec-tacularmente la complejidad a la hora administrar loscontenidos digitales que se crean, se almacenan y sebuscan cada día.

Para superar las limitaciones descritas sobre lossistemas de ficheros tradicionales y para hacer frentea esta complejidad creciente de trabajar con la infor-mación, Microsoft apuesta por WSF.

Qué es Windows Storage FoundationPor lo dicho en líneas anteriores, WSF se puede

considerar un nuevo sistema de ficheros relacional,aunque no es del todo exacto. Es más bien un siste-

ma de almacenamientoque un sistema de fiche-ros porque, como vere-mos, los “ficheros” estánimplícitos en las unidadesde almacenamiento deWSF. Y por otro lado,aunque efectivamente esun sistema de almacena-miento relacional, es másbien un sistema de alma-cenamiento genérico yaque es capaz de soportartanto datos que habitual-mente se almacenan en

bases de datos relacionales como ficheros que habi-tualmente se almacenan en sistemas de ficheros tra-dicionales. A bote pronto, da la impresión que WSFtrata de unir el mundo de los sistemas de ficheros yel mundo de las bases de datos. Y además trata de unir-los unificando los esquemas de contenidos comparti-dos por las aplicaciones, definiendo esquemas comu-nes a todas ellas para que los contenidos sean direc-tamente compartibles entre las aplicaciones que usenWSF. Digamos entonces, más exactamente, que WSFes un sistema de almacenamiento unificado.

Gracias a esta unificación, WSF facilita una orga-nización de contenidos más flexible que un sistema deficheros tradicional. Seguimos teniendo la capacidadorganizar físicamente los contenidos a través de jerar-quías de contenedores (como veremos, el concepto“contenedor” es algo más amplio que el concepto de“carpeta”), pero además podemos organizarlos lógi-camente, de una forma más natural y más rica, aso-ciando unos contenidos con otros a través de un mode-lo de relaciones.

En este sentido, WSF no pretende ser el mejormotor de búsqueda y competir contra las tecnologí-

dotN

etM

anía

<<

26

dnm.plataforma.net<<

WSF se puede considerar un nuevosistema de ficheros relacional, aunque

no es del todo exacto. Es más bienun sistema de almacenamiento

que un sistema de ficheros

Page 27: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Windows Communication Foundation (WCF) es el nuevo modelo de programación unificado para el desarrollo de comunicaciones

as de indexación, pero sí pretende mejorar la preci-sión a la hora de encontrar la información. Al sopor-tar las relaciones entre contenidos, la búsqueda no serála única forma de encontrar la información, sino quela navegación a través de las relaciones será otra for-ma probablemente más intuitiva y, en muchas oca-siones, más directa. Las relaciones se pueden graficary por lo tanto podremos ofrecer vistas de contenidosrelacionados, lo que abrirá nuevos caminos para laexploración de información.

También WSF hará más fácil la vida del usuariogracias a los servicios que proporcionará: servicios deficheros que mantienen automáticamente la consis-tencia entre las unidades de información relacionalesy los datos y metadatos de los ficheros que estas uni-dades puedan tener asociados; servicios para realizarcopias de respaldo y restaurarlas; servicios de sincro-nización de información con otros soportes de con-tenidos; y servicios que automatizarán tareas comoorganizar, filtrar, categorizar y clasificar los conteni-dos, de forma que sólo la información relevante acu-da a nuestra atención y así dominemos la sobrecargade información.

Y naturalmente, ofrecerá unos APIs y un conjun-to de herramientas auxiliares para que construyamosnuestras aplicaciones WSF-compatibles.

WSF es más de lo que parece en un principio.Rompe con los esquemas mentales preestablecidosque todos tenemos al estar acostumbrados a mane-jar ficheros y datos en sistemas de almacenamien-to tradicionales. Si tiene éxito este proyecto que aúnestá en Beta 1, éxito que está condicionado por queel sistema operativo y las aplicaciones acompañeny adopten WSF, cambiará el modo en el que el hom-bre interactúa con la máquina: de pensar a nivel defichero y formato de fichero o a nivel de registro ytabla, a pensar en unidades de información y en rela-ciones entre estas unidades; podrá ser un cambiodiferencial en nuestra forma de trabajar con conte-nidos digitales. Pero antes de dejar volar la imagi-nación veamos cuáles son los fundamentos tecno-lógicos que hay bajo el capó de WSF y con quépodemos jugar en su versión Beta1, como usuarioy como desarrollador.

Arquitectura de Windows Storage Foundation

WSF consta de cinco componentes (ver figura2): 1. Núcleo (Core): está constituido por el motor de base

de datos SQL Server, el sistema de ficheros NTFSy el entorno de ejecución CLR. Los dos primeroshacen que WSF sea un sistema de almacenamien-to unificado, capaz de soportar cualquier tipo decontenido, ya sean datos relacionales o ficheros.El tercero proporciona a WSF el sustrato paraconstruir sus API y servicios en código gestiona-do .NET.

2. Modelo de Datos (Data Model): El modelo de datosrelacional de WSF está formado básicamente por 3entidades: Ítem (Item), que determina la unidad míni-ma de información con la que operar y puede sub-sumir o no un fichero; Asociación (Association), quedefine explícitamente la relación entre unidades deinformación y constituye el detalle realmente inno-vador de WSF con respecto a sistemas de ficherostradicionales; y Extensión (Extension), que posibilitala ampliación del modelo extendiendo las definicio-nes existentes de ítems y de asociaciones.

3. Esquemas (Schemas): determinan los tipos de datos ode contenidos soportados por WSF. Por defecto,WSF facilitará esquemas predefinidos de informa-ción usual, llamados Tipos de Windows (Windows Types),como son Contactos, Mensajes, Citas, Documentos o

dotN

etM

anía

<<

27

dnm.plataforma.net<<

Figura 2

WSF no pretende ser el mejor motorde búsqueda y competir contra las

tecnologías de indexación, pero sí pretende mejorar la precisión a lahora de encontrar la información

Page 28: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Windows Communication Foundation (WCF) es el nuevo modelo de programación unificado para el desarrollo de comunicaciones

Multimedia aunque, como el modelo de datos losoporta, se facilitan mecanismos de extensibilidadque permiten ampliar los esquemas predefinidos ydefinir unos nuevos. Los tipos de Windows estarándiseñados para que sean independientes de las apli-caciones y puedan ser compartidos por todas ellas.

4. Servicios (Services): WSF proveerá servicios, y en sucaso frameworks y API específicas para construir ser-vicios, que harán más fácil la vida del trabajador dela información:4.1 Manejadores de Metadatos de Ficheros (Metadata

File Handlers): como las unidades de informa-ción pueden embeber ficheros, estos maneja-dores garantizarán la consistencia entre los datosde los ítems y los metadatos de los ficheros aso-ciados. WSF facilitará manejadores de los for-matos de ficheros más representativos y unmodelo de programación para que los desa-rrolladores puedan construir sus propios mane-jadores.

4.2 Copia de Respaldo/Restauración (Backup/Restore):se dispondrá de una plataforma para copias derespaldo de la información contenida en alma-cenes WSF y las aplicaciones de backup delsistema operativo se integrarán con esta pla-taforma.

4.3 Sincronización (Sync): con mecanismos de sin-cronización podremos compartir la infor-mación almacenada en WSF con otros siste-mas. Se proporcionará un servicio de sincro-nización entre almacenes WSF y un conjun-to de API y servicios integrados con WSFque facilitarán la construcción de adaptado-res para la sincronización de información conotros sistemas “no-WSF”, con aplicacionesy con dispositivos.

4.4 Reglas (Rules): a través de reglas vamos a podermanipular de la información almacenada enWSF y disparar acciones en nuestras aplica-ciones automáticamente. WSF proporcionaráun framework para crear reglas, una API paraque nuestras aplicaciones hagan uso de las reglasy una plataforma que evaluará las reglas y devol-verá los resultados.

5. API: Naturalmente, el API de WSF formará partedel modelo de programación WinFX que estará dis-ponible para Windows Vista, Windows XP yWindows Server 2003. En su versión final, el APIde WSF estará integrado con ADO.NET, ya queconceptualmente tiene más sentido que el desarro-llador use ADO.NET para acceder a cualquier sis-tema de almacenamiento relacional, entre los que seincluye WSF. En el bloque de código de ejemplopodemos ver cómo el modelo de programación deWSF será similar al modelo de programación quese usa cuando accedemos a una base de datos conADO.NET (ver fuente 1).

Esta integración con el API de ADO.NET aca-rreará otras ventajas para WSF, como aprovechar lostrabajos que se están realizando en el proyecto DLinq(Data Language Integrated Query) en relación conel acceso a datos, el mapeo de objetos con modelosrelacionales (O/R mapping) y las ampliaciones opor-tunas de los lenguajes .NET. Como veremos más ade-lante, el API actual de WSF en su versión Beta 1 noestá integrado con ADO.NET, pero le falta poco.

WinFS Beta 1 para el usuarioPara el usuario, WinFS Beta 1 no ofrece mucho.

Tengamos en cuenta que se están terminando de cons-truir los cimientos, la arquitectura y el API, piezas nece-sarias para desarrollar los servicios y aplicaciones dirigi-das al usuario final que se ejecutarán encima.

Su instalación sólo se aplica en sistemas WindowsXP SP2 basados en NTFS y exige que esté instaladauna versión específica de .NET Framework 2.0 (ver-sión Beta 2, en concreto 2.0.50215.322). Tras la ins-talación se dispone de un nuevo objeto de alto nivelbajo mi PC llamado WinFS Stores (es una extensióndel espacio de nombres de la shell de Windows) y pordefecto contiene un almacén llamado DefaultStore. Yya podemos jugar.

WinFS Stores es como una unidad de almacenamientomás del sistema, aunque en su primero nivel sólo puedecontener almacenes WinFS. Desde Windows Explorerpodemos crear más almacenes WinFS y podemos borrar-los. Cada almacén se crea además como una unidad com-partida de la máquina y se puede acceder al mismo a tra-vés la red; como en WinFS se puede utilizar las con-venciones de nombres UNC (\\maquina\almacen[\car-

dotN

etM

anía

<<

28

dnm.plataforma.net<<

Imports System.StorageImports System.Data.Objects…

' Crear una conexion con WinFSDim wc As WinFSConnection = New WinFSConnection(“\\localhost\defaultstore”)

' Crear un contexto de objetos (mapeo de objetos implicito)Dim oc As ObjectContext = New ObjectContext(wc)

' Consultar contactos con apellido “Porras”Dim contacts As DataCommand(Of Contact) = oc.CreateCommand(Of Contacts)

(“SELECT c FROM Contacts as c WHERE c.LastName ='Porras'”)

' Iterar por los resultados de la consultaFor Each contact As Contact In contacts

Console.WriteLine(contact.LastName)Next…' Añadir un nuevo contactoDim c As Contact = New Contact(container, id, fname, lname)oc.SaveChanges()...

Fuente 1

Page 29: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Windows Communication Foundation (WCF) es el nuevo modelo de programación unificado para el desarrollo de comunicaciones

peta][\item]) o URI (winfs://maquina/almacen[/carpe-ta][/item]) para identificar los almacenes y como se utili-za el mismo nombre para el almacén y para la unidadcompartida, el acceso a los almacenes WinFS a través desu nombre no depende de la ubicación local o remotadel mismo, aunque si dependerá de los permisos de segu-ridad que se disponga para acceder a éstos local o remo-tamente.

Dentro de cada almacén hay una carpeta de sistemallamada StoreInformation que contiene un objeto deWinFS con información sobre el almacén. A nivel dealmacén podemos crear las jerarquías de carpetas quequeramos. Desde Windows Explorer puedo crear car-petas, renombrarlas y borrarlas. Y lo que es más impor-tante, puedo mover o copiar contenidos de NTFS aWinFS y viceversa, usando copiar y pegar o arrastrar y sol-tar ya que se preserva la compatibilidad Win32 en cuan-to al formato de los contenidos y las propiedades de loscontenidos almacenadas en los ficheros (autor, título,fecha de último salvado, etc.). Y por supuesto puedoborrar contenidos de WinFS.

A modo de ejemplo he creado las carpetas Users yAURELIOP para tener el árbol WinFS Stores\DefaultStore\Users\AURELIOP. Y he copiado de mi sistema NTFS a estacarpeta los siguientes contenidos: cuatro documentos enformatos Word, Excel, HTML y PDF; un par de con-tactos en formato vCard; un par de mensajes Outlook;un par de imágenes en formatos JPEG y GIF; y un parde canciones en formatos WMA y MP3 (Ejemplo1: verfigura 3).

Todos los contenidos copiados se pueden abrir direc-tamente con doble clic del ratón, por lo que las asocia-ciones de las extensiones de ficheros con los programasoportunos siguen funcionando. Pero lo curioso es obser-var el tipo de los contenidos. De todos los copiados,sólo los documentos Office y HTML y la imagen JPEGhan sido correctamente identificados como documentose imagen respectivamente, mientras que el resto se hanidentificado como fichero genérico, que es el tipo pordefecto para contenidos no identificados que provie-nen de ficheros. ¿Qué es lo que está pasando? Al copiarun fichero en un almacén WinFS entran en juego losManejadores de Metadatos de Ficheros (File MetadataHandlers). Estos manejadores se encargan de mantenerautomáticamente, sin intervención del usuario, la con-

sistencia entre los datos del modelo de ítems de WinFSy los metadatos de los ficheros de NTFS. En la Beta 1de WinFS sólo hay algunos manejadores de ficherosdisponibles: el de imágenes JPEG y los de DocumentosOffice y HTML. De ahí que sólo estos contenidos esténcorrectamente identificados en WinFS. Más adelanteveremos más concretamente qué es lo que hacen estosmanejadores.

WinFS Beta 1 para el desarrolladorPara el desarrollador, en cambio, se abre un gran

abanico de posibilidades, porque lo que sí ofreceWinFS Beta 1 es un conjunto de API bastante com-pletas, unas plantillas de Visual Studio 2005 Beta 2 yunas herramientas de apoyo con las que podemos jugar.Lamentablemente me he quedado sin espacio, perono quiero acabar sin esbozar lo que será la segundaparte de este artículo, centrada exclusivamente en esteapartado, en lo que WinFS Beta 1 proporciona parael desarrollador: se describirán los fundamentos téc-nicos en los que se basa WinFS a través de ejemplosde código y se mostrará cómo WinFS actúa comoalmacén de entidades y como sistema de ficheros; cómopodemos organizar nuestros contenidos, datos y fiche-ros en WinFS más allá de una simple estructura jerár-quica; cómo podemos explorar la información enWinFS más allá de las búsquedas; y qué herramientasofrece WinFS para actuar sobre la información, a tra-vés de la sincronización de contenidos y a través delas reglas para la automatización de tareas.

ConclusiónEspero que esta primera parte haya servido al menos

para despejar algunas dudas en relación con WSF.Recapitulando: hemos podido comprobar la tortuosahistoria del sistema de ficheros relacional de Microsoft,hasta su último anuncio en la conferencia PDC del2005; hemos analizado las limitaciones de los sistemasde ficheros tradicionales; hemos visto qué es lo queincorporará Windows Vista en su lanzamiento parasuperar algunas de esas limitaciones, concretamentepara mejorar las búsquedas de contenidos digitales enel sistema de ficheros mediante tecnologías de indexa-ción; hemos indicado como esta solución se queda unpoco corta para superar todas las limitaciones de los sis-temas de ficheros tradicionales y cómo WSF pretendeser la solución definitiva, manteniendo además la com-patibilidad con el manejo de contenidos digitales al esti-lo de los sistemas de ficheros tradicionales; y hemos vis-to cuáles son las grandes piezas que componen esta nue-va tecnología WSF. Espero que al lector le haya pica-do la curiosidad y desee profundizar un poco más eneste tema. En este caso, estimado lector, le emplazo ala segunda parte de este artículo que saldrá publicadoen el próximo número.

dotN

etM

anía

<<

29

dnm.plataforma.net<<

Figura 3

Page 30: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Windows Communication Foundation (WCF) es el nuevo modelo de programación unificado para el desarrollo de comunicaciones

Extenders Providers en Tiempo de Diseño

En este trabajo se ilustra cómo usando el diseñador de Visual Studio se pue-den aplicar extensiones a componentes y controles .NET con solo arrastrar-los desde el Toolbox.

<<

En el modelo Orientado a Objetos la definición deuna familia de tipos de datos comienza por reunir encada tipo todas las características y funcionalidades quequeremos éste tenga. Para buscar flexibilidad y reusabi-lidad se organizan los tipos en jerarquías. Al estableceruna jerarquía se busca extraer las funcionalidades comu-nes a varios tipos para colocar en los tipos base de la jerar-quía. Aunque hay intentos de herramientas para hacero ayudar en la tal factorización, lo cierto es que la con-secución de una buena jerarquía depende de una buenalabor de diseño y de la capacidad de previsión de los desa-rrolladores.

Un excelente ejemplo de buena, y muy utilizadajerarquía, es la jerarquía de controles .NET que tie-ne como clase base Windows.Forms.Control. Sin embar-go, qué experimentado desarrollador en .NET no haechado en falta alguna que otra funcionalidad no pre-sente en dicha jerarquía pero que hubiese queridoaplicar en sus necesidades específicas.

El problema se presenta cuando surge la nece-sidad de disponer de nuevas funcionalidades que nofueron previstas en la concepción inicial de la jerar-quía. Por ejemplo, supóngase que se desea dotar a

Mario del Valle

dnm.plataforma.net

Las Jerarquías y la Bola de Cristal

Mario del ValleEs desarrollador del grupoWEBOO e instructor del

Departamento de Ciencia de laComputación de la Universidad

de la Habana

Miguel KatribEs Dr. y Catedrático del Depar-

tamento de Ciencia de laComputación de la Universidad

de La Habana y jefe del grupoWEBOO.Es un especialista en

lenguajes de programación yentusiasta de la tecnología .NET y

el lenguaje C#.

Miguel Katrib

© Caricatura por Yamil Hernández

si el arrastre de controles hubiera sido previamente concebido e implementado en la propia clase Control, ahora sería innecesario estar repitiendo el código

anterior ¿Pero quién tiene la tal bola de cristal de la previsión?

Page 31: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Windows Communication Foundation (WCF) es el nuevo modelo de programación unificado para el desarrollo de comunicaciones

una aplicación con interfaz visual del efecto de queel usuario pueda arrastrar algunos controles des-de un área de la aplicación a otra (la figura 1 nosmuestra un ejemplo del efecto deseado). Sin embar-go, la clase base Windows.Forms.Control no tienemétodos ni propiedades que faciliten el arrastre delos controles en una aplicación. Para poder hacer-los funcionar de esta manera es necesario recurrira eventos como normalmente hacemos en las apli-caciones de Windows (fuente 1).

Este fragmento de código del fuente 1 debe resul-tar familiar para quienes han necesitado arrastrar con-troles en una aplicación de Windows. Note que hay queprogramar los eventos y sus manejadores para detectarlos movimientos del mouse y provocar los efectos visua-les del arrastre. Líneas similares de código se repitenuna y otra vez donde quiera que una aplicación quieraañadir tal funcionalidad a un control.

Indudablemente que si el arrastre de controleshubiera sido previamente concebido e implementa-do en la propia clase Control, ahora sería innecesarioestar repitiendo el código anterior ¿Pero quién tie-ne la tal bola de cristal de la previsión?

Durante el desarrollo de un software es comúnque alguna funcionalidad útil quede fuera de la defi-nición de los tipos de la jerarquía inicial, bien por-que no pudo preverse, bien porque al no ser de usomuy frecuente se ha decidido no incluirla para nosobrecargar la jerarquía, o bien porque se consideraque el problema puede ser tratado de modo más efec-tivo en el contexto de la aplicación en la que se usa-rá la tal jerarquía.

Cierto que académicamente se ha escrito bastan-te sobre el concepto de “refactorizar” jerarquías declase y que se han ofrecido prototipos de herramientaspara reestructurar las jerarquías a tono con las nue-vas demandas. Pero pretender aplicar tales refacto-rizaciones en jerarquías profesionales y bien estable-cidas como las de .NET no es viable ni sensato. Acontinuación en este artículo vamos a presentar unrecurso, aún no muy conocido de .NET, que nos per-mite colocar nuevas funcionalidades sin reestructu-rar las jerarquías existentes. Este recurso es el deno-minado Extender Providers (Proveedores deExtensiones).

Extender ProvidersEntre los componentes del namespace Windows.

Forms hay un grupo particular de componentes quepermiten agregar funcionalidad a otros controlesen tiempo de diseño, de forma que la repeticiónde código ya no es necesaria para extender la fun-cionalidad del control. Estos son los llamadosExtender Providers. Entre los más conocidos de estos“proveedores” están el ToolTip, el HelpProvider yel ErrorProvider.

Usando Extender Provider ofertados por VisualStudio

Considere que se está diseñando en Visual Studiouna aplicación en la que se han colocado un controlButton y un control Label. A este control etiquetalabel1 se le ha agregado además un ToolTip (figura2) para que aparezca cuando se pasa por encima dedicha etiqueta (figura 3).

dotN

etM

anía

<<

31

dnm.plataforma.net<<

Figura 1.Arrastrando Toolbar Reviewing

public class Form1 : Form {private void InitializeComponent(){taskButton.MouseDown += new MouseEventHandler(control_MouseDown);taskButton.MouseUp += new EventHandler(control_MouseDown);taskButton.MouseMove += new MouseEventHandler(control_MouseDown);...InboxButton.MouseDown += new MouseEventHandler(control_MouseDown);InboxButton.MouseUp += new EventHandler(control_MouseDown);InboxButton.MouseMove += new MouseEventHandler(control_MouseDown);

}private Control draggingControl;private Point startPos;private void control_MouseDown(object sender, MouseEventArgs e){draggingControl = sender as Control;startPos = new Point(e.X, e.Y);

}private void control_MouseUp(object sender, MouseEventArgs e){draggingControl = null;

}private void control_MouseMove(object sender, MouseEventArgs e){if (draggingControl != null){Point pos = draggingControl.Location;pos.X += e.X - startPos.X;pos.Y += e.Y - startPos.Y;draggingControl.Location = pos;

}}

}

Fuente 1.Código de arrastre para controles

Page 32: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Windows Communication Foundation (WCF) es el nuevo modelo de programación unificado para el desarrollo de comunicaciones

Note cómo al marcar el control label1 VisualStudio agrega en la rejilla de propiedades una nue-va fila: ToolTip on AppToolTip, que representa laextensión del control Label1 que ha sido propor-cionado por el proveedor de extensiones AppToolTip.Visual Studio agrega predeterminadamente estanueva celda a la rejilla de propiedades para todoslos controles que se estén diseñando (es decir quese hayan colocado en la ventana de diseño). Si a estanueva propiedad se le asocia algún valor, por ejem-plo: “Hola .NET”, al ejecutar la aplicación y pasarel mouse sobre el label1 se puede ver como efecti-vamente aparece una ventana ToolTip con el men-saje "Hola .NET" (figura 3).

Esto nos da un efecto similar al de haber añadido esapropiedad a los controles utilizados sin que hubiesentenido que estar incluidos en la jerarquía. ¿Pero real-mente se agregó una nueva propiedad al tipo Label oButton? Por supuesto que no. Lo que ocurre detrás deltelón es que cuando se asocia un nuevo valor a esta pro-piedad en la rejilla de propiedades, Visual Studio gene-ra la línea de código dentro del cuerpo del métodoInitializeComponent del formulario Form1 tal y como semuestra en el fuente 2.

Aquí lo que se hace es aplicar el métodoSetToolTip a través de la variable AppToolTip delformulario. Si el tipo Label realmente tuviera una

nueva propiedad ToolTip la forma de asignar el valorhubiese sido:

Label1.ToolTip = "Hola .NET";

En vez de esto la asignación del valor se hace através del componente AppToolTip proveedor de laextensión:

AppToolTip.SetToolTip(Label1, "Hola .NET");

Análogamente si lo que se quiere es obtener elvalor de la nueva propiedad no se puede hacer algocomo:

string msg = Label1.ToolTip;

Porque el tipo Label no contiene la propiedadToolTip.

Sino que hay que hacer:

string msg = AppToolTip.GetToolTip(Label1);

Creando nuestros extender providers

Lo interesante, y tal vez no muy conocido, esque al igual que lo hace Visual Studio con el tool tip,podemos definir nuestros propios extender provi-ders. Un extender provider es un tipo que imple-mente la interfaz System.ComponentModel.IExtender

Provider, la cual tiene sólo un método:

bool CanExtend(object extendee);

Este método debe ser implementado por el prove-edor de extensión para indicar que el objeto extendeepuede o no ser extendido por él. Lo interesante es quesi este método devuelve true Visual Studio agregaráy visualizará la tal extensión en el la rejilla de propie-dades del componente1 extendee.

En el caso de nuestro ejemplo si se le quiere añadira un control la funcionalidad de poder ser arrastrados setendría que implementar un proveedor de extensionesque implemente IExtenderProvider y que en la imple-mentación de este método indique a cuáles tipo de con-trol se le aplique (fuente 3).

dotN

etM

anía

<<

32

dnm.plataforma.net<<

Figura 3.Tooltip para el Label

public class Form1: Form {private void InitializeComponent(){...this.AppToolTip.SetToolTip(this.Label1, "Hola .NET");}}

Fuente 2. Código generado para un proveedor de extensión

1 Aunque el parámetro extendee es de tipo object realmente por ahora hablaremos de asociarles extender provider sólo a componentes, es decir, aobjetos cuyo tipo implemente IComponent, todos los controles de .NET caen en esa categoría.

Figura 2.Uso de proveedores en el diseñador de Visual Studio

Page 33: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Windows Communication Foundation (WCF) es el nuevo modelo de programación unificado para el desarrollo de comunicaciones

Con esto se ha indicado que sólo los objetos de tipo Control pueden ser “extendidos” conDraggingProvider. Pero esto no es suficiente, a la cla-se DraggingProvider debe asociársele un atributo detipo ProvidePropertyAttribute. El primer parámetrodel atributo es una cadena con el nombre que tendrála propiedad que representará al extender provider enla rejilla de propiedades de cada control que puedaser “extendido” mediante este extender provider. Estacadena es el “AllowDrawing” que se usa como pará-metro de ProvideProperty en el código del fuente 4.El otro parámetro del atributo ProvideProperty indi-ca el tipo de objeto al que se aplica la extensión(Control en el ejemplo del fuente 4).

Esta clase que define al extender provider debe tenertambién dos métodos de nombres GetNombre_de_la_Propiedad y SetNombre_de_la_Propiedad

(GetAllowDragging y SetAllowDragging para el caso delejemplo). Estos métodos son los que permiten visuali-zar o modificar el valor (valor string pero que debe ser“true” o “false” en este caso) de la propiedad a travésdel editor de la rejilla de propiedades (Property Grid).Note que en el fuente 5 estos métodos se han imple-mentado de modo que el proveedor almacene en unArrayList los controles que serán extendidos.

El resultado del método GetAllowDraggingentonces dependerá de que el objeto esté o no enel ArrayList. El método SetAllowdragging tendráque hacer un poco más pues es quien tiene que aso-ciar (si el valor asignado es “true”) a los eventoscorrespondientes los métodos que intervienen enel “arrastre” (drag and drop) de un control. Si porel contrario el valor asignado es null o “false”entonces el control será eliminado del ArrayList ylos métodos serán desasociados de los eventos. Enel fuente 5 se muestra la implementación comple-ta de este extender provider para dar la funcionali-dad de “arrastrar controles”.

Una vez compilado este componente basta conincorporarlo al Toolbox de Visual Studio para que pue-da seleccionarse y arrastrarse sobre un formularioque se esté diseñando, luego se selecciona cada con-trol que se quiera dotar de la funcionalidad de poderser arrastrado, y se le cambia a “true” el valor de lapropiedad AllowDragging (figura 4).

Ahora para desde Visual Studio agregar la funcio-nalidad de arrastre a un control basta con arrastrar el

dotN

etM

anía

<<

33

dnm.plataforma.net<<

public class DraggingProvider : Component, IExtenderProvider {

bool IExtenderProvider.CanExtend(object extendee){return extendee != this && extendee is Control;

}...

}

Fuente 3. DraggingProvider

[ProvideProperty("AllowDragging", typeof(Control))]public class DraggingProvider :

Component, IExtenderProvider {bool IExtenderProvider.CanExtend(

object extendee){...}...

}

Fuente 4. Uso de ProvidePropertyAttribute

[ProvideProperty("AllowDragging", typeof(Control))]public class DraggingProvider : Component, IExtenderProvider {

private ArrayList draggingControls = new ArrayList();private MouseEventHandler mouseDownHandler;private MouseEventHandler mouseUpHandler;private MouseEventHandler mouseMoveHandler;private Point startPos;private Control draggingControl;

public DraggingProvider(){mouseUpHandler = new MouseEventHandler(control_MouseUp);mouseDownHandler = new MouseEventHandler(control_MouseDown);mouseMoveHandler = new MouseEventHandler(control_MouseMove);

}

bool IExtenderProvider.CanExtend(object extendee){return extendee != this && extendee is Control;

}

public bool GetAllowDragging(Control extendee){return draggingControls.Contains(extendee);

}

public void SetAllowDragging(Control extendee, object value){if (value == null || !bool.Parse(value)){draggingControls.Remove(extendee);Control control = extendee as Control;control.MouseDown -= mouseDownHandler;control.MouseUp -= mouseUpHandler;control.MouseMove -= mouseMoveHandler;

} else {draggingControls.Add(extendee);Control control = extendee as Control;control.MouseDown += mouseDownHandler;control.MouseUp += mouseUpHandler;control.MouseMove += mouseMoveHandler;

}}

private void control_MouseDown(object sender, MouseEventArgs e){draggingControl = sender as Control;startPos = new Point(e.X, e.Y);

}private void control_MouseUp(object sender, MouseEventArgs e){draggingControl = null;

}

private void control_MouseMove(object sender, MouseEventArgs e){if (draggingControl != null){Point pos = draggingControl.Location;pos.X += e.X - startPos.X;pos.Y += e.Y - startPos.Y;draggingControl.Location = pos;

}}

}

Fuente 5. Métodos Get y Set de la nueva propiedad

Page 34: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Windows Communication Foundation (WCF) es el nuevo modelo de programación unificado para el desarrollo de comunicaciones

componente DraggingProvider y soltarlo sobre el dise-ñador. Luego se le pone valor “true” en la rejilla de pro-piedades a la propiedad AllowDraging de cada cada con-trol al que se quiera dotar de esta funcionalidad de arras-tre. Que esto se hace en tiempo de diseño sin tener queescribir ni una línea de código. Es Visual Studio quienpor cada control al que se la haya asignado valor a estapropiedad genera la línea de código dentro del métodoInitializeComponent.

private void InitializeComponent(){

...

this.AppToolTip.SetAllowDragging(this.Label1, "true");

}

Y es esta llamada al método SetAllowDragging (fuen-te 5) la que articula y desencadena todo el mecanismode eventos y manejadores para lograr el efecto de arras-trar el control cuando la aplicación esté en ejecución.

En un artículo anterior “La utilidad de los atributosen Tiempo de Diseño. Cómo programar para interac-tuar con el PropertyGrid” [1] se enumeraron un con-junto de atributos que pueden ser asociados a las pro-piedades de los controles para definir cómo Visual Studiomuestra dichas propiedades en la Rejilla de Propiedades(PropertyGrid). Todos estos atributos son también apli-cables a las propiedades a las que se ha asociado un exten-der provider lo cual se logra asociando el atributo almétodo Get. Por ejemplo, para que la propiedadAllowDrawing aparezca en el grupo Behavior, en lugar deen Misc donde aparece por defecto, basta con escribir elcódigo a continuación:

ConclusionesVisual Studio con su integración entre diseñador

visual y la maquinaria de generación de código que tie-ne por detrás, junto con los atributos y este recurso deproveedor de extensiones, nos da la capacidad de añadir

una funcionalidad común a una jerarquía de controlesaún cuando esto no se previó al definir dicha jerarquía.Incluso nos permite añadirle esta funcionalidad a con-troles que no formen parte de una misma jerarquía.

Por supuesto que Visual Studio lo que ofrece es elmarco de reusabilidad para no hacer manualmente eltrabajo y para no repetir un mismo código en diferen-tes clases. Pero es responsabilidad del programador laconsistencia que realmente tenga esta capacidad comúncon la que se está dotando a un conjunto de controles.Por ejemplo, es el programador el que debe garantizarque se le asocie el AllowDragging sólo a controles paralos que la implementación que se ha hecho de los méto-dos manejadores de los eventos de arrastre tengan algúnsentido porque Visual Studio no puede adivinar cuál esla semántica que se pretende.

Para C# 3.0 se anuncia otra forma de aplicar exten-siones a un tipo por mediación del especificador this.Si, por ejemplo, se quisiera lograr el efecto de proveerde un ToolTip a la clase Control, que como vimos no lotiene, se podría definir una clase ToolTip como en elfuente 6.

La presencia de este nuevo indicador this que tie-nen los parámetros de tipo Control en los métodos está-ticos SetToolTip y GetToolTip permite entonces que acualquier variable de tipo control puedan aplicarse estosmétodos con la sintaxis acostumbrada para los métodosde instancia:

Button button = new Button();button.SetToolTip("Hola");string toolTip = button.GetToolTip();

dotN

etM

anía

<<

34

dnm.plataforma.net<<

[Category("Behavior")]

[Description("The control can be dragged over its parent control")]

public bool GetAllowDragging(Control extendee) {...}

Referencias

[1]Del Valle Mario, Katrib Miguel, “La utilidad de losatributos en Tiempo de Diseño. Cómo programarpara interactuar con el PropertyGrid”, dotNetManíaNº 19, Octubre 2005

Figura 4. Extensión de arrastre para Label1

public class ToolTip {public static void SetToolTip(this Control control, string text) {toolTips[control] = text;

}public static string GetToolTip(this Control control){return toolTips [control];

}private static Dictionary<Control,string> toolTips = new

Dictionary<Control,string>();}

Fuente 6

Para C# 3.0 se anuncia otra forma deaplicar extensiones a un tipo pormediación del especificador this

Page 35: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Windows Communication Foundation (WCF) es el nuevo modelo de programación unificado para el desarrollo de comunicaciones

dotN

etM

anía

<<

35

Estado actual de reutilización de software

Con el paso del tiempo, afortunadamente, la ingeniería del software está dejandode ser un arte y se está convirtiendo realmente en ingeniería. Eso implica nuevastécnicas y nuevas herramientas. Por lo tanto, el concepto de reutilización tambiénha de evolucionar. La herramienta swREUSER y su metodología iRM apuntan enesta nueva dirección.

Famosa palabra clave -Eldorado- muy buscada perodifícil de encontrar

El término reutilización suele producir, aun hoyen día, reacciones muy complejas entre los profesio-nales de la informática: todos sabemos que es unapalabra bendita, que representa una práctica quedebemos conocer y potenciar en nuestra organiza-ción. Sin embargo, por otro lado, algunos sientencierto rechazo a su aplicación en los procesos pro-ductivos de nuestra fabricación de software.

Probablemente, las razones de semejante ambi-valencia se pueden encontrar en la existencia de aspec-tos muy positivos en la aplicación del reuso, así comode serias complicaciones y dificultades producidasprecisamente por reutilizar.

Este artículo pretende presentar las nuevas ten-dencias en reutilización, que están consiguiendopotenciar aun más sus beneficios y reducir sus incon-venientes. Esperamos que lo podamos conseguir.

Qué es la reutilización

Empecemos con una definición:“Se define la reutilización de software como el

uso de cualquier tipo de artefacto (también llamadoactivo), o parte del mismo, creado con anterioridad,en un nuevo proyecto.” [IEEE]

Y para precisar aun más:• Cada artefacto reutilizado en el nuevo proyec-

to ha sido ligeramente modificado para ajus-

tarse a una definición de problema, o a unanecesidad de solución en el nuevo proyecto, obien:

• Cada artefacto reutilizado ha necesitado serconfigurado para adaptarse a las especificacio-nes o requerimientos del nuevo proyecto.

• Cada artefacto reutilizable fue creado para fun-cionar en un contexto, entorno o aplicacióncompletamente diferente al que se le va a daren el nuevo proyecto.

La reutilización es una "Buena Práctica",que pro-duce espléndidos beneficios a la organización quela pone en práctica

CMM y CMMI [CMM], en sus nuevas versio-nes, ya hablan de la práctica de reutilización de soft-ware; y lo hacen a todos los niveles, no solamente a

dnm.arquitectura

<< Introducción al reuso

José Miguel FuentesIngeniero Informático. Jefe deproducto de toda la gama de

herramientas CASE que dTinf,The Reuse Company ha lanzado

para la reutilización deconocimiento.

Juan LlorensIngeniero Industrial.Catedráticode Ingeniería del Software en la

Universidad Carlos III de Madrid.Su área de investigación es la

ingeniería del software y lagestión del conocimiento.

José Miguel Fuentes Juan Llorens

“Se define la reutilización de softwarecomo el uso de cualquier tipo de

artefacto (también llamado activo),o parte del mismo, creado con

anterioridad, en un nuevo proyecto”

Page 36: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Windows Communication Foundation (WCF) es el nuevo modelo de programación unificado para el desarrollo de comunicaciones

nivel de código fuente. Estas buenas prácticas asocia-das a la reutilización permitirán:

• Un aumento de la productividad, mediante lamejora de los tiempos en los que se desarrollanlos nuevos proyectos informáticos (Time toMarket, TTM).

• Un aumento de la calidad de los productos.• Una reducción de los costes de desarrollo.• Mejora en las actividades de mantenimiento y

soporte de aplicaciones.• Mejora en las actividades de control y planifi-

cación por la reducción de desviaciones en losdesarrollos.

Pero por otro lado, los expertos en reutilización sue-len advertir que también existen inconvenientes:

• Requiere una inversión inicial, por lo que resul-ta necesaria una seria actividad de evaluación delproceso de reutilización para estudiar cuándo seproduce el retorno de la inversión: ROI.

• Requiere modificaciones sustanciales en el pro-ceso de desarrollo de software de la organiza-ción, así como en la estructura productiva(RRHH).

• Requiere formación en nuevas herramientas ymétodos (algunas veces demasiado complejas).

La existencia de estos inconvenientes, unido conel hecho de que la tecnología de recuperación de acti-vos no estaba preparada para solucionar la reutiliza-ción sistemática de artefactos, han hecho que la adop-ción de la reutilización en las organizaciones produc-tivas haya sido moderada durante el siglo pasado.

Sin embargo, las condiciones han cambiado porfin, y mediante la creación de nuevas formas de apli-car el proceso de reutilización, así como la mejora enlas tecnologías de recuperación de artefactos se pue-den reducir los inconvenientes de forma drástica, y¡mantener todas sus ventajas! Para ello vamos a vercómo se reutilizaba en el siglo XX, y cómo se podríahacer en el siglo XXI.

La reutilización en el siglo XXEn el siglo pasado resultaba imposible poder repre-

sentar, y posteriormente buscar, artefactos de softwa-re en un repositorio por su propio contenido (porejemplo, buscar diagramas de clases similares a unodibujado en mi herramienta CASE), lo cual permiti-ría que cualquiera pudiera buscarlos sin conoci-miento previo de su existencia.

Por este motivo, para reutilizar hubo que realizarel proceso inverso: primero, parar la organización paraver qué podía ser reutilizable, después hacerlo reuti-lizable. Una vez hecho, lo siguiente era obligar a quetodos conocieran lo que existe para reutilizar en la

organización (puesto que si no, NO sabrían que exis-tía), y luego intentar obligar a que reutilizaran lo exis-tente (bien en forma de patrones, líneas de producto,frameworks, etc...) por lo que tendrían que saber ope-rar con ellos de antemano. ¿Nos extraña que haya sidodifícil implantar la reutilización?

Este proceso de reutilización se presenta en la figu-ra 1:

Bajo estos parámetros, las formas de reutilizaciónexistentes eran:

• Aplicar Activos (patrones de diseño).• Integrar Activos (componentes).• Adaptar y/o configurar Activos (líneas de produc-

tos).• Extender y/o personalizar Activos (frameworks).• “Wrap” (envolver) Activos (legacies).• “Linking” (enlazar) Activos (servicios Web, ...).• Generar aplicaciones (generadores).

La reutilización en el siglo XXICon vistas a minimizar los inconvenientes des-

critos anteriormente y potenciar las ventajas delreuso, se deben modificar profundamente los pun-tos de vista anteriormente expuestos. En este sen-tido los fundamentos de la reutilización del sigloXXI deberían ser:

• No estar obligados a parar la organización, ni dedi-car un equipo especial, para saber lo que ésta tie-ne. De hecho, sería de desear que no fuera nece-sario saber por adelantado lo que existe si no sedesea gastar mucho dinero: que el proceso de reu-tilización pueda empezar desde cero.

• Intentar crear artefactos reutilizables solamen-te cuando se sepa que se van a reutilizar al menosuna vez. Además, si es posible, que no se tengaque tener un equipo humano pensando qué arte-factos construir, sino que se identifiquen desdeel propio repositorio.

• No obligar a que nadie en la organizaciónconozca la existencia de nada por adelantado, sino que se pueda buscar lo que necesita por con-

dotN

etM

anía

<<

36

dnm.arquitectura<<

Figura 1. Proceso de reutilización

Page 37: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Windows Communication Foundation (WCF) es el nuevo modelo de programación unificado para el desarrollo de comunicaciones

tenido. En vez de obligar, ofrecer la posibilidadde buscar lo que cada uno desee.

• No tener restricciones en lo que se desee bus-car (requisitos, diagramas UML, pruebas,manuales, código fuente, riesgos, planificacio-nes de proyectos, experiencias post-mortem,reglas de negocio, personas, etc...), siempre bus-cando por contenido.

• No cambiar el proceso de desarrollo de soft-ware (SDP) de la organización, usualmente cen-trado en el “Proyecto” y mantener sus fases:Especificaciones, Análisis del problema, Diseñodetallado,… de forma que no haya que invertirdesmesuradamente en formación.

• Demandar la aplicación de la trazabilidad entrelos resultados de las actividades: Requisitos conriesgos, casos de uso con pruebas: “todo contratodo”.

• Como se mantiene el SDP clásico, ofrecer reu-tilización en cada una de sus fases.

• Y finalmente, obligar solamente a una cosa: aque una vez terminado el proyecto, y realiza-do el proceso de post-mortem (debriefing), éstequede indexado en el repositorio corporativopara futuras utilizaciones de los mismos uotros ingenieros.

Las ventajas de conseguir un proceso de reutiliza-ción basado en las premisas anteriores serían:

• Requiere muchísima menos inversión inicial, porlo que el ROI se consigue muy rápidamente.

• No requiere cambios sustanciales en la organi-zación.

• No requiere procesos desmesurados de formación.• No es tan crítica la necesidad de apoyo desde la

dirección.• El proceso de implantación es incremental.

Reutilización de diseños de SWComo se ha aprendido sobradamente de expe-

riencias anteriores, los esfuerzos en las técnicas yprácticas de la reutilización deben efectuarse aguasarriba en el ciclo de vida de desarrollo, dejando asíde lado la reutilización más clásica de código fuen-te. Los intentos que pretendieron reutilizar códigofuente se toparon siempre con los problemas aso-ciados a la evolución funcional (ninguna funciona-lidad permanece estática y las modificaciones resul-tan muy complicadas a nivel código), así como a lamera evolución tecnológica (imaginamos que yahabrán “disfrutado” de la simple migración de apli-caciones realizadas para la versión 1.0 del Frameworkde .NET a la versión 1.1. Pese a que es un merocambio de máquina virtual, resulta a veces compli-cado hacer que el código de la versión anterior fun-cione correctamente).

El siguiente nivel de reutilización por encima delcódigo fuente son los diseños que previamente se hayanefectuado. Cuando hablamos de reutilización de soft-ware y de diseños de software, enseguida se nos vie-nen a la cabeza los patrones de diseño. La idea de lospatrones fue introducida por Christopher Alexander[ALEX] en el dominio de la arquitectura, aunque haceya años que la idea ha sido acogida en el diseño desoftware. “Cada patrón describe un problema que ocu-rre una y otra vez en un entorno dado, describiendoel núcleo de la solución al problema de tal forma quepueda ser empleada un millón de veces sin hacerlo dosveces de la misma forma”. Ya en el mundo del soft-ware, Gamma y su equipo, en el reverenciadísimolibro Patrones de Diseño: Elementos de SoftwareReutilizable Orientado a Objetos [GAMM] hacen unaclasificación en patrones creacionales, estructurales yde comportamiento.

Posteriormente a este trabajo, se han creado cien-tos o miles de patrones. Algunos de ellos han sido ide-ados para ser reutilizados horizontalmente (es decir,con posibilidad de aplicar en diferentes dominios osectores), ejemplos de ellos son los patrones de Java yotros muchos. Otros patrones han sido creados en elseno de sectores de trabajo concretos (reutilizaciónvertical).

Es precisamente en estos últimos, los verticales,donde vamos a hacer énfasis. Si en tu organizaciónsueles realizar desarrollos enmarcados en un mismodominio (banca, telefonía, farmacia...) ¿cuántas veceshas diseñado y desarrollado funcionalidad similar endiferentes aplicaciones? ¿Has reutilizado estos dise-

dotN

etM

anía

<<

37

dnm.arquitectura<<

Las ventajas de conseguir un proceso de reutiliza-ción basado en las premisas anteriores serían:

• Requiere muchísima menos inversión inicial, porlo que el ROI se consigue muy rápidamente.

• No requiere cambios sustanciales en la orga-nización.

• No requiere procesos desmesurados de for-mación.

• No es tan crítica la necesidad de apoyo desdela dirección.

• El proceso de implantación es incremental.

Page 38: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Windows Communication Foundation (WCF) es el nuevo modelo de programación unificado para el desarrollo de comunicaciones

ños? La respuesta a esta última pregunta suele ser unSí rotundo, ya que todo el mundo reutiliza diseños yexperiencias pasadas; sin embargo, su ámbito de actua-ción es reducido, y simplemente solemos reutilizarnuestros diseños o los diseños de nuestros colegas físi-camente más cercanos. Sin embargo, cuando habla-mos de reutilizar diseños y experiencias de otras per-sonas, incluso de mi misma organización, la respues-ta no es tan rotunda.

Para solucionar estos problemas, se requiere unatecnología que hasta la actualidad no ha existido en elmercado. Desde hace décadas existen repositoriosdocumentales que incluyen fabulosas capacidades debúsqueda dentro de documentos, pero la tipología deestos documentos se reduce a archivos de texto, MSWord, HTML, PDF, PPT y similares.

Sin embargo, para reutilizar diseños se hace nece-saria la creación de repositorios con la siguiente fun-cionalidad:

• Almacén de modelos de software: este repositoriodeberá permitir almacenar y gestionar modelosSW creados con herramientas CASE tales comoRational Rose, dTinf swREUSER, Magic Draw,Telelogic Tau, Borland Together... Sin olvidarfuncionalidad imprescindible como gestión deversiones y de accesos, gestión de configura-ción...

• Localizador de modelos por su similitud: al igualque motores como Google y otros repositoriosdocumentales ayudan en la localización de docu-mentos textuales, cuando nuestro repositoriode modelos sea lo suficientemente extenso, serequerirán técnicas de búsqueda para no per-derse en el mismo. Llegados a este momento,se puede optar por la salida sencilla, y generarun motor de búsqueda que simplemente refle-je los nombres de nuestras clases, atributos... yalmacenarlos y reverenciarlos como si fuesentexto plano. Esto puede ser útil en documentosde texto, pero con la riqueza que nos otorganlenguajes como UML [UML], esta solución setorna realmente deficitaria. Otras opciones declasificación y recuperación pueden ser la des-cripción en texto plano (ambigua y que permi-te poca precisión en las búsqueda), la asigna-ción de keywords a cada modelo (bastante sim-ple, a la vez que pobre) o el uso de facetas[PRIE] (que requieren un nuevo esfuerzo degeneración de dichas facetas, que no son másque parejas atributo-valor).

Pero todo lo anterior no sirve a nuestrasnecesidades. Se hace vital disponer de un siste-ma mucho más avanzado que permita discri-minar, por ejemplo, el nombre de una clase delnombre de un atributo, y que permita incluir larica semántica que UML aporta a las relacio-nes dentro del motor de búsqueda. De esta for-

ma, uno podría diagramar, utilizando de nuevoUML, su consulta, y el sistema devolvería aque-llos modelos cuyo contenido incluye a lo indi-cado en la consulta.

• Localizador y extractor automático de patrones:hacer un estudio para determinar cuáles son lospatrones, tanto de análisis como de diseño, ytanto generales como los generados por noso-tros para nuestro dominio, que más se repitenen nuestros modelos es una labor ardua y cos-tosa. Necesitamos repositorios que nos solu-cionen esta labor y que, periódicamente, segúnse van introduciendo nuevos modelos al siste-ma, vayan sugiriendo automáticamente cuálesson los patrones de elementos interrelaciona-dos que más se repiten en mis modelos. De estaforma, estos nuevos patrones formarán parte dela familia de patrones de la organización y seránreutilizables por cualquiera de sus diseñadores.

• Métricas: como todos los procesos, el procesode la reutilización debe ser medido de formaapropiada. Entre otras muchas, la razón vienede la mano de poder medir el retorno de inver-sión, aspecto vital para conseguir el apoyo de laalta dirección en los procesos de reutilizaciónde software.

Ya desde hace tiempo existe el concepto de Patronesde Análisis; en concreto fueron introducidos porMartin Fowler en su famoso libro Analysis Patterns[FOWL]. Se hace necesario, pues, un repositorio quepermita almacenarlos, navegarlos, localizarlos y reu-tilizarlos. Si extendemos esto a la extracción automá-tica de patrones y a la búsqueda dentro de modeloscompletos, este repositorio es imprescindible en cual-quier gran organización.

¿Cuánto pagarías por un repositorio como éste?Por mucho menos de lo que piensas está al alcance detu mano y de tu bolsillo.

Reutilización de especificaciones derequisitos

Reutilizar elementos de diseño, o incluso de aná-lisis es, como ya hemos visto, mucho más valiosoque reutilizar código. Sin embargo, ¿por qué que-darnos ahí? ¿Por qué no intentar subir más arribaen el proceso de desarrollo de software e intentarreutilizar requisitos? A fin de cuentas, aunque algu-nos métodos digan que son “conducidos por casode uso”, todos sabemos que el verdadero núcleoconductor de todo desarrollo de software deberíanser los requisitos. Son estos requisitos los que daránlugar posteriormente a una representación formalbasada en casos de uso.

Pongamos en la palestra, por lo tanto, el con-cepto de Patrones de Requisitos [HURT]. Un patrón

dotN

etM

anía

<<

38

dnm.arquitectura<<

Page 39: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Windows Communication Foundation (WCF) es el nuevo modelo de programación unificado para el desarrollo de comunicaciones

de requisitos puede ser visto como un conjunto derequisitos reutilizable. Al igual que en puntos ante-riores, podrán existir patrones horizontales (inte-roperables entre varios dominios, como por ejem-plo los requisitos de seguridad del Common Criteria[COMM]) y patrones verticales (propios de undominio dado).

Sin embargo, la idea de un simple conjunto reuti-lizable de requisitos vuelve a quedarse coja. Hay quetener en cuenta que un buen proyecto de software nosolamente incluye requisitos, sino también, por ejem-plo, riesgos derivados de estos requisitos, las pruebasa estos requisitos... Según nuestra apreciación, unpatrón de requisitos debería estar compuesto por lasiguiente información:

• El conjunto de requisitos, ya sean éstos hori-zontales o verticales.

• Los riesgos que acecharán al proyecto por lasimple y sencilla razón de que tiene que abor-dar uno o más de esos requisitos.

• La especificación de las pruebas que han de lle-varse a cabo para validar que el nuevo sistema aconstruir cumple con lo indicado en los requi-sitos del patrón.

• El conjunto de documentos que permita enten-der el contenido del patrón y que ayude a imple-mentarlo correctamente.

Estos patrones son, sin duda, atractivos, perorequieren de unas herramientas CASE algo especia-les. Sin ir más lejos, necesitamos de herramientas quesoporten la fase de análisis de requisitos, la de análi-sis de riesgos y la de modelado de casos de prueba, deforma integrada. Pocas herramientas del mercadocubren todas estas fases, por lo que hay que recurrira suites completas (lo que dispara enormemente elprecio). Pero no basta con soportar todas estas fases,además los elementos generados en cada una de ellasdeben poder ser trazados con el resto de elementos,por lo que las herramientas deberán soportar un sis-tema sencillo, a la vez que potente de traza entre losdistintos elementos.

Esta traza es vital para una reutilización efectivade software a alto nivel basada en patrones de requi-sitos. Pero sería aún más importante si nuestra herra-mienta permitiese la localización semántica dentro deun repositorio que albergase a todos los requisitos tra-tados en todos los desarrollos de tu organización. Enese caso, un modelo de software podría contener, nosólo requisitos, riesgos y casos de prueba, sino tam-bién análisis y diseños creados con UML, estimacio-nes, métricas... Tener toda esta información trazada,y disponer de herramientas avanzadas de búsquedatextual (basada en Procesamiento de Lenguaje Natural)sobre el contenido de los requisitos es un punto cla-ve para disparar los beneficios de la reutilización desoftware.

Una vez localizado un requisito reutilizable en elrepositorio, se requieren herramientas que permitannavegar sobre la traza y determinar:

• Qué elementos trazados con el actual deseo reu-tilizar en mi nuevo proyecto: si tu herramientaCASE lo permite, estos elementos podrán serriesgos, estimaciones, elementos de análisis ydiseño, casos de prueba...

• Qué elementos trazados a cualquier nivel quie-ro poder reutilizar.

• Qué atributos del actual requisito deseo reuti-lizar en mi nuevo proyecto (p.e. su complejidad,coste estimado, estabilidad...).

De esta forma se estará automatizando al máximola labor del reutilizador de software. Pero cuidado, nohay que descuidar dos tareas importantísimas paragarantizar el éxito de un programa de reutilización:

• Conteo: hay que llevar métricas sobre quién gene-ra elementos reutilizables, cuántas veces estosson reutilizados, quién reutiliza qué...

• Análisis post-mortem: de qué vale reutilizar infor-mación sobre un requisito o un riesgo si no sabe-mos, por ejemplo, si la estimación de esfuerzodel requisito fue finalmente acertada, o si laestrategia de mitigación de un riesgo fue la máscorrecta. Por ello, se requiere una nueva faseantes de dar por concluido un proyecto. Estanueva fase, conocida como post-mortem odebriefing, permite verificar antes de dar porfinalizado el proyecto, aquellos datos que fue-ron dados justo al comienzo. De esta forma nosaseguraremos de que estamos reutilizando lainformación acertada.

¿Qué necesito para comenzar...? ¡iRM yswREUSER, la solución!

En nuestra opinión, después de todo lo presenta-do anteriormente, implantar el proceso de reutiliza-ción en nuestra organización no tiene por qué ser unautopía. De hecho, al reducir tremendamente los esfuer-

dotN

etM

anía

<<

39

dnm.arquitectura<<

Page 40: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Windows Communication Foundation (WCF) es el nuevo modelo de programación unificado para el desarrollo de comunicaciones

zos en inversión y formación, resulta perfectamenteposible aplicar el reuso en cualquier organización,incluidas las PYMES.

¿Qué es lo que necesitamos, entonces? Bajo nues-tra percepción, para implantar un proceso de reutili-zación se necesitan considerar los siguientes aspectos.

Querer hacerlo

La PYME, el departamento o la organización ente-ra que desee implantar reuso no debe tener temor asu tamaño (no importa que seas grande o pequeño, lainversión es baja si se aplican los principios de esteartículo).

Modelo de procesos que soporte reuso

Definir un modelo de procesos que soporte reu-so. Aunque no hemos entrado en profundidad, en esteartículo nosotros hemos presentado someramenteiRM ((incremental Reuse Method))pero valdría otromodelo que cumpliera con lo expuesto aquí. Se pue-de encontrar más información en el sitio Web de TheReuse Company (www.reusecompany.com) [TRC].

Un modelo de dominios sobre el que reusar

Para profundizar en la reutilización de SW, resul-ta tremendamente atractiva la posibilidad de realizarun modelo de conocimiento del dominio de aplica-ción a reutilizar. Este es el principio que utiliza laherramienta swREUSER [TRC] de cara a la correc-ta localización y reutilización de activos de software.

Un set de herramientas informáticas que soportenreuso y trazabilidad integral

Este es un factor importante, puesto que tanto elsoporte a reuso (recuperación, e integración en nue-vo proyecto) como la trazabilidad, son factores esen-ciales. Resulta necesario que el set de herramientasno tenga un precio elevado, puesto que entonces lasPYMES quedarían definitivamente apartadas de esteproceso. En este artículo hemos descrito algunas delas capacidades de swREUSER [TRC] que por suprecio no plantea ningún problema de adquisición auna PYME.

Poder hacer todo lo anterior con una inversión enRRHH, formación y tecnología mínima para mini-mizar el esfuerzo de ROI.

Esto empieza a ser posible con modelos, procesosgeneralistas de SDP que soporten reuse + modelos dedominios incrementales + herramientas informáticascomo swREUSER, de Reuse Company.

dotN

etM

anía

<<

40

dnm.arquitectura<<

después de todo lo presentado anteriormente,implantar el proceso de reutilización en

nuestra organización no tiene por qué ser una utopía. De hecho, al reducir tremendamentelos esfuerzos en inversión y formación, resulta

perfectamente posible aplicar el reuso en cualquier organización, incluidas las PYMES

Referencias

[ALEX] “A pattern language”. Christopher Alexander et al. OxfordUniversity Press, 1977

[CMM] http://www.sei.cmu.edu/cmmi

[COMM] Common Criteria. ISO/IEC-15408:1999

[FOWL] “Analysis Patterns:Reusable Object Models”.Martin Fowler.Addison-Wesley Professional, 1996

[GAMM] “Design Patterns: Elements of Reusable Object-OrientedSoftware”. Eric Gamma et al.Addison-Wesley Professional, 1995

[IEEE] IEEE Std 610.12-1990. IEEE Standard Glossary of SoftwareEngineering Terminology

[HURT]

“Generación de Patrones de Requisitos en una HerramientaCASE:Aplicación al Common Criteria”. Omar Hurtado, JuanLlorens, Gonzalo Génova, José M. Fuentes. 8° WorkshopIberoamericano de Ingeniería de Requisitos y Ambientes deSoftware-IDEAS´2005, 2-6 mayo 2005, Universidad TécnicaFederico Santa María,Valparaíso, Chile

[PRIE] “A Faceted Approach to Building Ontologies”. Rubén Prieto-Díaz

[TRC] http://www.reusecompany.com

[UML] http://www.uml.org

Page 41: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Windows Communication Foundation (WCF) es el nuevo modelo de programación unificado para el desarrollo de comunicaciones

dotN

etM

anía

<<

41

y noadministrado

Como acabamos de comentar, cuando habla-mos de interoperabilidad lo primero que se nosviene a la cabeza son conceptos referidos a cómo“interoperar” con componentes COM (ComponentObject Model) o con funciones escritas con códigono administrado, como pueden ser las funcionesdel API de Windows. De hecho, si buscamos “inte-roperabilidad” en el índice de la documentaciónde Visual Studio, lo primero que aparece es la inte-roperabilidad COM, y debemos “navegar” un pocopara toparnos con las pocas entradas que tratan eltema de la interoperabilidad entre lenguajes de.NET.

En este artículo nos ocuparemos de estas tres for-mas de “interoperar” o comunicarnos con otros len-guajes, ya sean de la propia plataforma .NET (usan-do código administrado) o bien de otras plataformas,principalmente en la “comunicación” con lenguajeso código generado por lenguajes que utilizan códi-go no administrado, es decir, el código que no estápensado para usar las convenciones del CLR o run-time de .NET, y que por tanto se ejecuta sin el ampa-ro de .NET Framework.

Interoperabilidad con código admi-nistrado

Cuando hablamos de código administrado esta-mos refiriéndonos al código creado con lenguajes de

.NET, por ejemplo C#, y que lo utilizamos desdeotro lenguaje, también de .NET, por ejemplo VisualBasic. Esta comunicación entre lenguajes de la pla-taforma .NET es posible, y fácil de realizar, básica-mente porque todos los lenguajes de .NET utilizanlas clases definidas por la propia plataforma, y lo másimportante, siguen unas normas previamente defi-nidas, o al menos deberían seguirlas, para que esacomunicación sea totalmente efectiva.

El condicional que hemos utilizado en la fraseanterior es algo que debemos tener en cuenta paraque los ensamblados de dos lenguajes de .NET sepuedan comunicar, o lo que es lo mismo, podamos

InteroperabilidadYo interopero, tu interoperas,... ¡interoperemos todos!

La interoperabilidad bien entendida hace referencia a cómo utilizar clases de códigono administrado desde aplicaciones de .NET y viceversa.Cuando hablamos de códigono administrado,nos estamos refiriendo a código que no está generado con los com-piladores de la plataforma .NET. El concepto de interoperabilidad lo ampliaremos unpoco para aplicarlo también a los ensamblados creados con .NET,de forma que poda-mos usar las librerías creadas con un lenguaje de .NET desde otro lenguaje tambiénde la familia .NET, típicamente con C# y Visual Basic.

<< Interoperabilidad con código administrado

dnm.inicio.fundamentos

Guillermo “Guille” Som

dnm.incio.fundamentos

Guillermo “Guille” Somes Microsoft MVP de Visual Basic

desde 1997. Es redactor dedotNetManía,miembro de Ineta

Speakers Bureau Latin America,mentor de Solid Quality LearningIberoamérica y autor del libroManual Imprescindible de Visual

Basic .NET.http://www.elguille.info

Lo que debería hacer un lenguaje de.NET para que el código generado

pueda ser utilizado desde otros lenguajes de .NET es garantizar la

compatibilidad con el CLS (CommonLanguage Specifications o especificaciones

comunes de .NET)

Page 42: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Windows Communication Foundation (WCF) es el nuevo modelo de programación unificado para el desarrollo de comunicaciones

dotN

etM

anía

<<

42

dnm.inicio.fundamentos<<

usar en nuestros proyectos de .NET los ensambla-dos generados desde otro lenguaje también basadoen .NET.

Lo que debería hacer un lenguaje de .NET paraque el código generado pueda ser utilizado desdeotros lenguajes de .NET es garantizar la compa-tibilidad con el CLS (Common Language Spe-cifications o especificaciones comunes de .NET).Estas especificaciones marcan una serie de normaso condiciones para que esa comunicación entrelenguajes diferentes sea factible. Por ejemplo, elcódigo generado con Visual Basic, (al menos has-ta la versión 7.0 que es la incluida en las versionesanteriores a Visual Studio 2005), siempre es com-patible con esas especificaciones, mientras que elcódigo generado por C#, e incluso por Visual Basic2005, no tiene porqué ser siempre totalmente com-patible con el CLS, por tanto si queremos gene-rar código que sea 100% compatible con el restode lenguajes de .NET debemos asegurarnos de quedicho código es CLS-compatible. La mejor for-ma de asegurarnos esa compatibilidad es utilizarel atributo CLSCompliant indicándole un valor ver-dadero.

Las aplicaciones de Visual Basic (anteriores a laversión 8.0 o VB2005), siempre incluyen ese atribu-to en el fichero AssemblyInfo.vb, algo que no ocurreen los proyectos de C# (o de VB2005), por tanto, siqueremos asegurarnos esa compatibilidad, tendre-mos que agregar la siguiente línea de código:[assembly: System.CLSCompliant(true)], en el fiche-ro AssemblyInfo.cs o cualquiera de los ficheros decódigo incluidos en el proyecto.

La compatibilidad con CLS nos asegura que elcódigo generado con nuestro compilador favoritopodrá ser utilizado con cualquier otro lenguaje quecree ensamblados compatibles con dichas especifica-ciones, y el atributo CLSCompliant nos servirá paraque el compilador nos avise cuando usemos caracte-rísticas no compatibles, como es la utilización de tipossin signo en los parámetros o valores devueltos por

los métodos o propiedades, y con la llegada de la ver-sión 2.0 de .NET Framework, dicha falta de com-patibilidad se ve ampliada, por ejemplo, con los tiposgeneric.

Aunque si trabajamos con lenguajes que acep-tan esos tipos de datos “no compatibles”, podre-mos interoperar entre ellos, por ejemplo, VisualBasic 2005 al igual que C# 2.0 acepta tipos ente-ros sin signo o tipos generic, por tanto podremoscrear ensamblados con uno de esos lenguajes queutilice esas características no contempladas en CLSy usarlas desde el otro lenguaje sin mayores pro-blemas. Esto último lo podremos comprobar en elcódigo de ejemplo para Visual Studio 2005 queincluimos en los ZIP y que podemos bajar desdeel sitio Web de la revista.

Interoperabilidad con código noadministrado

Las otras dos formas de interoperabilidad sonmediante el uso de COM (interoperabilidad COM)y lo que se conoce como Platform Invoke (PInvoke) oinvocación de plataforma.

La primera es mediante el uso de componentesCOM, también conocidos como componentes de auto-matización OLE o simplemente ActiveX. Este tipo decomponentes los podemos generar con lenguajes capa-ces de crear controles o librerías ActiveX, como VisualBasic 6.0. Esta forma de comunicación la podemosrealizar en dos direcciones, una para poder accederdesde .NET a componentes COM, y la otra para acce-der a componentes creados en .NET desde lenguajes

capaces de utilizar COM. Como veremos,esta sería una solución bastante razonablepara permitir el uso de librerías creadas encualquier lenguaje de .NET desde aplica-ciones de VB6, evitándonos la tan temidamigración de aplicaciones de VB6 al mun-do de .NET Framework, aunque siempretendremos que hacerlo siguiendo unasreglas; reglas que explicaremos en este yotros artículos.

La invocación de plataforma(PInvoke) es la posibilidad de utilizar fun-ciones declaradas en librerías de la pla-taforma (sistema operativo) en la que seejecuta nuestra aplicación de .NET, porejemplo para acceder a cierta funciona-

lidad no proporcionada por la librería de clases de.NET. Actualmente las plataformas a las que tene-mos acceso son Windows (Win32) y los sistemasbasados en Windows CE (Pocket PC oSmartphone), aunque en este artículo, y en los pró-ximos sobre interoperabilidad de la seccióndnm.inicio.taller, nos basaremos en el sistema ope-rativo Windows.

NOTA

En Visual Basic, los atributos se indican encerrándolos entresignos mayor y menor, en el caso de CLSCompliant sería: <Assembly:CLSCompliant(True)>. Debido a que en los artículos de dnm.iniciosiempre mostramos el código fuente en C#, cuando comentemosalgunos de los atributos que tendremos que usar, estos se harán paraese lenguaje, pero en los ficheros .zip con el código de ejemplo,encontraremos tanto el código de C# como de Visual Basic.

][

Page 43: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Windows Communication Foundation (WCF) es el nuevo modelo de programación unificado para el desarrollo de comunicaciones

dotN

etM

anía

<<

43

dnm.inicio.fundamentos<<

Interoperabilidad entre lenguajes de.NET(O de cómo usar ensamblados de .NET desdeotros lenguajes de .NET)

Esta sería la forma más fácil de permitir que otrosprogramadores utilicen nuestro código, pero sin nece-sidad de que tengan acceso al código fuente, sino alresultado ya compilado y listo para usar.

La ventaja de que otros utilicen nuestro códi-go compilado es doble, una es que así no tendránacceso directo al código fuente, de esta forma nosaseguramos no solo de que no tendrán detalles decómo lo hemos implementado, sino de que no lomodifiquen directamente, ya que podían echar altraste todo nuestro trabajo, por poner solo unoscasos. La otra ventaja es que podrán usarlo desdeotros lenguajes distintos al que nosotros hemosutilizado, (o incluso el mismo lenguaje, ya que unavez compilado da igual el lenguaje usado), consi-guiendo de esta forma que cada cual utilice el len-guaje con el que más a gusto se sienta programan-do. Por supuesto, también está la situación inver-sa: que nosotros utilicemos en nuestros proyectoslo que otros han desarrollado utilizando cualquierlenguaje de la plataforma .NET.

En cualquier caso, ese código deberá estar com-pilado y generado como una librería (ensambladoDLL), o en un módulo (.netmodule), aunque estosúltimos serán menos habituales, principalmente por-que actualmente no están soportados para usarlosdesde el IDE de Visual Studio, sino para la compi-lación desde la línea de comandos, (de los módulospuede que nos ocupemos en otra ocasión), por tan-to en adelante utilizaremos solo ficheros con exten-sión .dll, que son los que podemos referenciar ennuestros proyectos.

Porque de eso se trata, de crear una referen-cia en nuestro proyecto que nos permita accedera los tipos definidos en el ensamblado, de esta for-ma, la librería que queremos usar se comportaráde la misma forma que lo hacen las librerías delpropio .NET que habitualmente utilizamos ennuestros proyectos.

Crear una librería de .NETSi queremos crear una libraría para usarla como

componente en otros proyectos de .NET, tendremosque crear un nuevo proyecto del tipo “Biblioteca declases”, aunque en realidad podremos crear cualquiertipo de proyecto de los que tengamos disponibles, yaque no solo debemos restringir nuestra “interopera-bilidad” a ese tipo de proyecto, porque de lo que setrata es que nosotros podamos crear componentes de.NET que puedan ser usados por otros, aunque bási-camente, al menos para aplicaciones de escritorio o

aplicaciones Windows, los tres tipos que podemoscrear son:

• Aplicación para Windows.• Biblioteca de clases.• Biblioteca de controles para Windows.

Con los dos últimos no tendremos ningún tipode problema, ya que el tipo de ensamblado creado esdel tipo DLL, sin embargo, con el primero, en prin-cipio no podríamos utilizarlo, ya que no podemoscrear referencias a ejecutables (.exe).

Si nuestra intención es utilizar formularios des-de otro proyecto, la mejor forma de crearlos esmediante un proyecto del tipo “Aplicación paraWindows”. Aunque a la hora de compilar ese pro-yecto tendremos que indicar que se genere un fiche-ro del tipo DLL en lugar de EXE, para ello tendre-mos que indicar en las propiedades del proyecto queel tipo de resultado es “Biblioteca de clases” en lugarde “Aplicación de Windows” que será el valor pre-determinado. Como sabemos, en la versión 2005 deVisual Studio, las propiedades del proyecto se pre-sentan de forma diferente que en las versiones ante-riores, pero en definitiva lo que importa es que segenere una DLL en lugar de un ejecutable, en la figu-ra 1 podemos ver la ventana de propiedades de unproyecto de C# creado con Visual Studio 2003.

Una vez generado el ensamblado DLL podremosreferenciarlo desde cualquier otro proyecto, y podre-mos acceder a los formularios que contenga de la mis-ma forma que lo haríamos con el resto de clases otipos definidos en esa librería, ya que los formulariosson clases al fin y al cabo.

Referenciar una librería de .NETPara poder utilizar las librerías creadas con cual-

quier lenguaje de .NET desde nuestro proyecto,

Figura 1.Desde las propiedades del proyectopodemos indicar el tipo de ensamblado que

queremos generar.

Page 44: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Windows Communication Foundation (WCF) es el nuevo modelo de programación unificado para el desarrollo de comunicaciones

dotN

etM

anía

<<

44

dnm.inicio.fundamentos<<

tendremos que seguir los mismos pasos que paraañadir referencias de cualquier otra librería: Pormedio del elemento “Referencias” en el exploradorde soluciones.

Si la librería ya está compilada tendremos quepulsar en el botón “Examinar” y localizar el ensam-blado (que ya debe estar compilado como .dll),seleccionarlo y agregarlo. Si esa librería que que-remos referenciar es un proyecto creado por noso-tros, podemos añadirlo a la solución actual y agre-gar la referencia indicando el proyecto, desde laficha “Proyectos”, de esta forma tendremos opor-tunidad de depurar la librería junto a nuestra apli-cación cliente.

Interoperabilidad COM

Parte I: De cómo usar componentes COM des-de aplicaciones .NET

Trabajar con componentes COM (o compo-nentes ActiveX) desde Visual Studio .NET (oVS2005), es relativamente fácil y no requiere hacernada especial por nuestra parte, ya que el procesoes el mismo que el indicado anteriormente: agre-gar una referencia en nuestro proyecto al compo-nente COM (ya sea una DLL un control OCX eincluso un EXE), que queramos usar. De formapredeterminada, y tal como funciona COM, todoslos controles (OCX) y las librerías (DLL) debenestar previamente registrados en el sistema, portanto esos componentes registrados serán los quese muestren en la pestaña COM del cuadro de diá-logo de agregar referencias, seleccionamos el quenos interese, y será el propio Visual Studio el quese encargue de los “pormenores” para que poda-mos usar ese componente en nuestro proyecto deVisual Studio.

Por ejemplo, si desde un proyecto de VisualStudio queremos utilizar el control Agent, para mos-trar un “muñeco” al estilo de los asistentes de Office,

tendremos que utilizar el controlActiveX: Microsoft Agent Control. Paraello haremos lo que acabamos de indi-car, pulsamos en agregar referencia,seleccionamos la ficha “COM” y busca-mos el componente que queramos, eneste caso, Microsoft Agent Control, talcomo vemos en la figura 2, pulsamos enel botón “Seleccionar” y aceptamos.

Si miramos las referencias, veremosuna nueva entrada: AgentObjects. Sianteriormente no hemos usado ese con-trol, tendremos que añadirlo al cuadro

de herramientas, ya que no se añade de forma auto-mática. Para añadirlo debemos pulsar con el botónsecundario del ratón (normalmente el botón dere-cho), sobre el cuadro de herramientas, y del menúemergente, seleccionar “Agregar o quitar elemen-tos”, (sería recomendable añadir una nueva ficha obien mostrarlas todas y si tenemos la ficha“Componentes Extras” añadirlo a esa ficha, conidea de no mezclar estos controles COM con losnormales de Visual Studio), del cuadro de diálogoque nos muestra, seleccionaremos la ficha “COM”y buscaremos el control en cuestión, marcamos lacasilla que hay junto al control y pulsamos“Aceptar”.

Una vez añadido el control en el cuadro de herra-mientas, lo añadimos al formulario y veremos que enlas referencias tenemos otra nueva: AxAgentObjects.Cuando compilemos el proyecto, comprobaremos queen el directorio bin (en el que se crea el ejecutable)tenemos dos nuevas librerías: AxInterop.AgentObjects.dll y Interop.AgentObjects.dll, estas libre-rías son generadas automáticamente por Visual Studioy contienen las definiciones de las clases del control,pero preparadas o convertidas para usar desde unaaplicación .NET.

Todo este proceso que acabamos de describir essolo necesario si utilizamos controles generados

NOTA

Las librerías (ensamblados DLL) creadas con los len-guajes basados en la versión 2.0 de .NET Framework (VisualStudio 2005) no las podemos usar desde proyectos de lasversiones anteriores, aunque desde Visual Studio 2005 (olas versiones Express) sí podremos crear referencias a ensam-blados creados con las versiones anteriores de .NET. ][

Figura 2.Añadir un componente COM a lasreferencias de nuestro proyecto.

Page 45: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Windows Communication Foundation (WCF) es el nuevo modelo de programación unificado para el desarrollo de comunicaciones

dotN

etM

anía

<<

45

dnm.inicio.fundamentos<<

con aplicaciones COM, (estos controles puedenestar en librerías con extensiones .ocx o .dll, yaque en el fondo son lo mismo), pero si utilizamoscomponentes “normales”, simplemente añadiremosla referencia a la librería y Visual Studio creará laslibrerías de interoperabilidad necesarias para acce-der a los tipos de datos que contenga.

Pero debemos estar advertidos que no siempreesas librerías se comportarán de la misma forma quesi las utilizáramos desde compiladores capaces detrabajar directamente con componentes COM, portanto siempre deberíamos hacer las comprobacio-nes suficientes para asegurarnos un 100% de fun-cionalidad.

Parte II: De cómo usar componentes .NET des-de aplicaciones COM

Esta es la parte más interesante de la interopera-bilidad COM, el poder usar componentes creados conlos lenguajes .NET desde lenguajes que no saben nadade .NET pero si pueden trabajar con componentesCOM, como es el caso de Visual Basic 6.0.

Para lograr esta interoperabilidad,con la que podremos usar algunas de lascaracterísticas de .NET desde lengua-jes de generaciones anteriores, sola-mente tendremos que indicarle en laspropiedades del proyecto que queremosregistrar el componente para interope-rabilidad COM. Si trabajamos conVisual Studio 2003, esta opción laencontraremos en “Propiedades degeneración>Generar” dentro de la ven-tana de propiedades del proyecto; si tra-bajamos con Visual Studio 2005, estaráen la ficha de generación de la ventanade propiedades, en cualquier caso, sola-mente estará habilitada si el tipo de pro-yecto es “Biblioteca de clases”.

Una vez hemos seleccionado dicha opción (o lehemos asignado un valor verdadero), al compilar elproyecto, veremos que además de la librería (.dll)tendremos un fichero con la extensión .tlb que esla librería de tipos compatibles con COM, y queestará registrada en nuestro equipo, pero en otrosequipos tendremos que registrarla para poder uti-lizarla.

Una vez que tenemos la librería de tipos (.tlb),la podemos registrar en el equipo de destino utili-zando un fichero con extensión .reg, (para regis-trar los tipos COM), el cual podemos generar conla utilidad Regasm.exe (registro de ensamblados) indi-cándole el parámetro /regfile. También podemosgenerar esa librería de tipos y registrarla al mismotiempo usando la opción /tlb en esa misma utili-dad.

Una vez registrado nuestro componente, podre-mos usarlo desde compiladores que sepan manejarlos componentes COM. Pero tal como tenemosnuestro componente COM, la comprobación de losmétodos y demás miembros se realizará en tiempode ejecución, lo que se conoce como late binding. Siqueremos acceder a esos miembros expuestos pornuestra clase, tendremos que indicarle al compila-dor de .NET que genere las interfaces necesariaspara poder tener acceso en tiempo de compilación,para ello debemos aplicar a nuestra clase el atribu-to ClassInterface con el valor AutoDual, por tanto,aplicaremos el siguiente atributo a la clase (o cla-ses) que queramos exportar:

[ClassInterface(ClassInterfaceType.AutoDual)]

Hay más detalles que deberíamos tener en cuen-ta, entre ellos la posibilidad de detectar eventos o habi-litar la compatibilidad binaria, pero de estos detallesnos ocuparemos en la sección dnm.inicio.taller de otronúmero de dotNetManía.

Interoperabilidad con invocación deplataforma (PInvoke) (O de cómo utilizar funciones definidas en libreríasdel API de Windows)

Para finalizar con este artículo sobre los funda-mentos de la interoperabilidad entre lenguajes de.NET y otros lenguajes que no trabajan con este mar-co de trabajo, veremos cómo podemos usar las fun-ciones definidas en librerías creadas con lenguajes queno están amparados bajo las tecnologías expuestas por.NET Framework. A pesar de que la extensión de esaslibrerías también sea .dll no debemos confundirlascon las librerías generadas por medio de automatiza-ción (COM o ActiveX), ya que a las que nos estamosrefiriendo son librerías “normales”, que podremosgenerar con lenguajes como C/C++ o Delphi, pero no

NOTA

Los métodos o miembros estáticos (o compartidos) no seexportan a COM, por tanto, si tenemos algunos en nuestras cla-ses, deberíamos definirlos como métodos o miembros de ins-tancia. De igual forma, debemos definir siempre un construc-tor sin parámetros en todas las clases de las que queramos cre-ar nuevas instancias desde un lenguaje COM, ya que es la úni-ca forma de crear nuevos objetos COM.

][

Page 46: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Windows Communication Foundation (WCF) es el nuevo modelo de programación unificado para el desarrollo de comunicaciones

con Visual Basic 6.0. El caso más habitual es el usode las funciones del API del sistema operativoWindows.

Si estamos usando Visual Basic, las declaracio-nes para acceder a las funciones del API (o de libre-rías creadas con compiladores de código no admi-nistrado), las podemos hacer de dos formas dife-rentes, aunque en realidad una de ellas, que se man-tiene por compatibilidad con VB6, lo que hace esgenerar el código adecuado de forma automática ytotalmente transparente; pero como el compiladorde C# no tiene ese automatismo, veremos cómodeclarar esas funciones al estilo .NET, que es váli-do tanto para Visual Basic como C#, ya que se rea-liza por medio del atributo DllImport. Como siem-pre, en el código fuente de ejemplo, tendremosproyectos para los dos lenguajes.

La forma más simple de usar el atributoDllImport es aplicarlo a la declaración de una fun-ción que nos servirá de puente para acceder a lafunción del API, en ese atributo indicaremos comomínimo el nombre de la librería en la que seencuentra dicha función.

Por ejemplo, si tenemos esta declaración del APIde Windows:

En C# la podríamos declarar de esta otra:

En el atributo indicamos que esa función está enla librería kernel32.dll y la definición de la funciónla hacemos con extern static, (siempre debemosdeclararlas como compartidas y externas) con los pará-metros adecuados a los tipos que .NET utiliza. Ycomo podemos comprobar, cuando el API espera unacadena, podemos declararla tanto usando el tipostring como StringBuilder, en los tipos cadena quereciben valores, como es el caso del segundo pará-metro de esta función, es preferible hacerlo con unobjeto del tipo StringBuilder que contenga los carac-teres suficientes para recibir el valor, normalmente lacantidad de caracteres dependerá del valor devuelto,

en el caso de ser un path, se recomienda tener comomínimo 255 caracteres.

Una vez declarada la función, la podremos usarcomo cualquier otra función de .NET, pero siempresiguiendo las reglas de uso del API, en este ejemploparticular, el segundo parámetro debe tener capaci-dad suficiente para recibir el nombre largo del fiche-ro indicado en el primer parámetro.

Cuando usemos las funciones del API, debemostener en cuenta que los tipos de datos no son total-mente compatibles entre los definidos en .NET ylos utilizados por los otros compiladores, en la decla-ración original de la función GetLongPathName, el últi-mo parámetro y el valor devuelto por la función esde tipo DWORD que en realidad es un tipo unsignedlong de C (entero de 32 bits sin signo) y equivale altipo UInt32 de .NET, pero como vemos, podemosutilizar un tipo de 32 bits con signo (int), por tan-to para usar esas funciones desde las aplicaciones.NET tendremos que utilizar tipos de datos com-patibles con los tipos de los compiladores de códi-go no administrado. En la documentación de VisualStudio podemos encontrar una relación de las equi-valencias de los tipos usados por el API de Windowsy los de .NET, pero básicamente cuando en el APIse utilice un tipo long en .NET usaremos un ente-ro de 32 bits.

ConclusionesEn este artículo hemos intentado explicar las

diferentes formas con las que podemos interoperarcon el código de otros lenguajes, ya sean del propio.NET como los creados con compiladores que nogeneran código para esta plataforma, además decómo utilizar los componentes COM desde .NETy viceversa. En próximos artículos de esta secciónveremos ejemplos prácticos de los dos casos en losque debemos “interoperar” con lenguajes que noutilizan los compiladores de .NET.

NOTA

De las funciones del API que utilizan cadenas decaracteres, suele haber dos definiciones distintas, segúnutilicen caracteres ANSI o Unicode, la primera acaba-rá con la letra A y la otra con W, pero el atributoDllImport utilizará la más adecuada según el sistema ope-rativo que estemos usando. ][

DWORD GetLongPathName(LPCTSTR lpszShortPath, LPTSTR

lpszLongPath, DWORD cchBuffer);

[System.Runtime.InteropServices.DllImport(“kernel32.dll”)]

private extern static int GetLongPathName(string lpszShortPath,System.Text.StringBuilder lpszLongPath, int cchBuffer);

<<dnm.inicio.fundamentos

46

<<do

tNet

Man

ía

Page 47: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Windows Communication Foundation (WCF) es el nuevo modelo de programación unificado para el desarrollo de comunicaciones

aplicación a un cliente para supase a explotación no basta con que cumpla la fun-cionalidad pactada. Es necesario asegurar y certi-ficar que está libre de todo tipo de errores, que secomporta a la perfección con el entorno en el quese va a ejecutar y que en caso de fallos ajenos a laaplicación ésta los tendrá previsto.

En la mayoría de las situaciones, debido al pocotiempo del que se dispone, se planifican bateríasde prueba entre los miembros del equipo de desa-rrollo. Suelen ser poco elaboradas y de escaso tiem-po de duración en las que se obvian partes del códi-go susceptibles de originar errores.

Es imprescindible una herramienta capaz de ofre-cer una batería de pruebas completa, fácilmente con-figurable y que nos evite consumir recursos y tiem-po innecesarios.

Compuware DevPartner Fault Simulator esuna herramienta que ofrece esta funcionalidad.Capaz de crear entornos de simulación basados ensituaciones reales. Entornos muy elaborados, quepueden incidir sobre aspectos del desarrollo sus-ceptible de ocasionar fallos y sobre otros que al noestar previstos podrían surgir durante la fase deexplotación.

Las baterías de pruebas o entornos de simulaciónpueden ser reutilizados en otras aplicaciones que seasemejen. No es necesario crear nuevos entornos, tansolo modificando algunos parámetros se adaptaría auna nueva aplicación.

Soporta gran parte de la Class Library de VisualStudio .NET. Mediante un log de ejecución ofre-ce un análisis muy detallado del resultado de cada

simulación, permitiendo localizar las partes delcódigo que pueden ocasionar errores en situacio-nes adversas y proporcionando una orientación decomo resolverlas.

Compuware DevPartner Fault Simulatorestá especialmente indicado para aplicaciones desa-rrolladas en Visual Studio .NET sin inferir en elcorrecto funcionamiento de ésta. Según especifi-ca la firma no descartan en un futuro testear apli-caciones desarrolladas en otros lenguajes y plata-formas de programación.

dotN

etM

anía

<<

47

DevPartner Fault Simulator

Vivimos en un mundo en el que cada vez es más fuerte la competencia entreempresas de desarrollo. Por ello es imprescindible dominar y tener controladostodos los eslabones de la cadena de producción, si queremos ser competitivos.En este número vamos a tratar el eslabón de la Gestión de Errores.

Lorenzo Ponte

dnm.laboratorio.net

<< Cuando entregamos una

Lorenzo Ponte es redactor dedotNetManía. Es Arquitecto de

Sistemas y Aplicaciones .NET.Experto en Datawarehousing yBusiness Intelligence,Marketing

Intelligence,CRM analítico.Actualmente es consultor de la

empresa Matchmind yWebmaster de clikear.com

Fault Simulator es una herramienta capaz de crear entornos de simulación

basados en situaciones reales. Entornos muy elaborados, que puedan incidir

sobre aspectos del desarrollo susceptibles de ocasionar fallos y sobre otros que al no estar previstos podrían surgir

durante la fase de explotación

Page 48: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Windows Communication Foundation (WCF) es el nuevo modelo de programación unificado para el desarrollo de comunicaciones

Formas de utilizar Fault Simulator

Desde el interfaz del Visual Studio .NET

Fault Simulator se integra dentro del IDE(Integrated Development Environments) de Visual Studio.NET. No afecta a su correcto funcionamiento, ni elentorno de desarrollo ni en la depuración de código.

A través de la pestaña que Fault Simulator aña-de a Visual Studio podemos elegir fácilmente queacciones vamos a simular cuando ejecutemos unaaplicación.

El botón “Start Monitoring” nos permite acti-var el inicio de la simulación en el momento quedeseemos que ésta se produzca.

Fault Simulator graba los resultados de lasimulación a medida que nuestro proyecto se vaejecutando.

Otras opciones nos permiten especificar don-de queremos ubicar y en que formato (texto, XML,etc.) el resultado de la simulación.

El resultado puede verse inmediatamente des-pués de haber terminado la ejecución o posterior-mente en los archivos que hayamos especificado.

Desde el interfaz de Fault Simulator

Fault Simulator tiene su propio IDE (IntegratedDevelopment Environments). Lo que permite utilizar-lo en entornos en los que no está instalado VisualStudio .NET. Estos entornos pueden ser servidoresde pre-producción o producción provistos delFramework de .NET y en los que no es necesariotener instalado Visual Studio .NET.

Ofrece las mismas posibilidades que si estuvieraintegrado dentro de Visual Studio .NET.

Desde la línea de comandos

Fault Simulator ofrece la posibilidad de ejecutar-se desde la línea de comandos. Esta opción tiene espe-cial relevancia ya que permite la posibilidad de creararchivos batch con el objetivo de planificar los entor-nos de simulación.

Podemos establecer simulaciones diarias, men-suales, etc para ver como evolucionan las aplicacio-nes a lo largo del tiempo.

<< dnm.laboratorio.net

48

<<do

tNet

Man

ía

Figura 2

Figura 3

Fault Simulator es una herramienta bastante completa, que se ha adaptadocomo un guante a la plataforma .NET yque la complementa a la perfección conesa gestión de fallos necesaria para las

aplicaciones de hoy en día.

Figura 1

Page 49: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Windows Communication Foundation (WCF) es el nuevo modelo de programación unificado para el desarrollo de comunicaciones

A continuación se muestra un ejemplo de cómoimplementar un script que ejecuta una simulación enun archivo .swl (Windows Script Host):

Conclusión

Podemos decir desde el laboratorio dedotNetManía que Fault Simulator es una herra-mienta bastante completa, que se ha adaptado comoun guante a la plataforma .NET y que la complemen-ta a la perfección con esa gestión de fallos necesariapara las aplicaciones de hoy en día.

A continuación se detallan todos los tipos de erro-res que Fault Simulator puede simular.

Entornos COM

• CLSID no encontrados• DLL no encontradas• Interfaces no registrados• ProdID no encontrados

Errores de Disco

• Archivos corruptos• Discos llenos• DLL o Assemblies no encontrados• Archivos bloqueados• Permisos insuficientes para acceder a carpetas

o archivos• Archivos o directorios inexistentes

Errores de Memoria

• Aplicaciones que llegan a consumir el límite dememoria

• Notificaciones de insuficiente memoria• Memoria virtual al límite

Fallos de Red

• Conexiones fallidas por TimeOut• Redes caídas• Servidores remotos caídos• Servidores no disponibles

Errores en el Registro

• Claves del registro caídas• Insuficientes permisos de lectura o escritura• Inexistencia de claves o valores de clave.

CompatibilidadActualmente se vende la versión 1.5 de Fault

Simulator que es compatible al 100% con VisualStudio 2005.

dotN

etM

anía

<<

49

dnm.laboratorio.net<<

<job id="SentinelAutomation"><script language="JScript">ws = new ActiveXObject("WScript.Shell");wsh.Run("Dpfs /faultset:Test1 /com+:InterComponent

/results:c:\Results\IComponent1", 1);WScript.Sleep(10000);wsh.Run("c:\testservice\BankServic", 1, 1);wsh.Run("Dpfs /faultset:Test2 /a:MyHost.exe

/results:c:\Results\IComponent2", 1);WScript.Sleep(10000);wsh.Run("MyHost.exe", 1, 1);wsh.Run("Dpfs /faultset:Test3 /com+:VoidComponent

/results:c:\Results\VoidComponent", 1);WScript.Sleep(10000);wsh.Run("c:\testservice\VoidService", 1, 1);</script></job>

Fuente 1

Requisitos del SistemaHardware Software

Pentium III 733 MHz (1GHz)

Windows 2000, ServicePack 4, IIS 5.0, Professional,Server,Advanced Server

512 MB total RAM500 MB de espacio libreen disco

Windows XP, Service Pack 2,IIS 5.1, Professional (Home,Media Center & Tablet PCno están soportadas)

Super VGA 1024x768,16-bit

Windows Server 2003,Service Pack 1, IIS 6.0,Standard, Enterprise,Web

Unidad de CD o DVD

Entorno .NET.NET Framework 2.0

.NET Framework 1.1, SP 1 (Compact Framework isnot supported)

Microsoft Visual Studio 2005 Professional Edition

Team Edition for software architects, developersand testers Team Suite

Microsoft Visual Studio .NET 2003 ProfessionalDeveloper Enterprise Architect

Ficha técnicaNombre DevPartner Fault SimulatorTM

Versión 1.5

Fabricante Compuware

Web http://www.compuware.com

Categoría Seguridad

PrecioEntre 4.700€ y 7.000€ por usuario concu-rrente (dependiendo de cantidades)

Valoración

Page 50: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Windows Communication Foundation (WCF) es el nuevo modelo de programación unificado para el desarrollo de comunicaciones

En Junio de 2003 fueron convocados para unaentrevista un grupo de jóvenes de Huelva que en esemomento estaban inscritos en el Servicio Andaluz deEmpleo y la información que se les dio fue que se tra-taba de una Casa de Oficios de Informática. Esta esla historia de algunos de esos jóvenes desde esa entre-vista hasta hoy.

La Casa de Oficios1 se llamó Teclado 2 y fue soli-citada por el Patronato de Desarrollo Local y Turismo,actualmente Huelva Impulsa2. El objetivo principalera formar a dos grupos, uno de programación y otrode microinformática, de quince jóvenes con edadescomprendidas entre los 16 y los 23 años durante seismeses para poder realizar un objeto de actuacióndurante otros seis meses. El objeto de actuación con-sistía en la mejora y actualización de la intranet deeste organismo municipal y la creación y puesta enmarcha del aplicativo SIO de la Agencia de Colocacióndel Ayuntamiento de Huelva.

El grupo de programación estaba formado porchicos y chicas con algún conocimiento sobre infor-mática general a nivel de usuario con muy poco o nin-gún conocimiento de programación y nada de .NET.El perfil medio de los jóvenes era desempleado, conmuy pocos recursos económicos y con un nivel for-mativo medio-bajo, por lo que el objetivo de crear unaaplicación para la Agencia de Colocación de unAyuntamiento se antojaba, cuanto menos, complica-do pero muy interesante.

Respecto a la parte formativa de los seis primerosmeses se utilizó como base el Real Decreto 1597/1997,de 17 de octubre, por el que se establece el certifica-do de profesionalidad de la ocupación de programa-dor de aplicaciones informáticas. Este certificado del

Ministerio de Trabajo y Asuntos Sociales está com-puesto por seis módulos entre los que destacan meto-dología de análisis, métodos y lenguajes de progra-mación. Entre los objetivos de estos módulos apare-ce el de “realizar programas en distintos lenguajes deprogramación: Clipper, C o Visual Basic”. Este cer-tificado de profesionalidad tiene 8 años, por lo quemuchos de los contenidos están más que desfasados.Se tomó la decisión de incluir un lenguaje de progra-mación cuya curva de aprendizaje fuera lo más fácil yrápida posible y que, al menos, los chicos dispusierande una herramienta de desarrollo con la que pudie-ran empezar a programar sus aplicaciones. Por aque-lla época estaba recién salido del horno Visual Studio.NET 2003 así que se modificaron los contenidos delos módulos mencionados anteriormente para adap-tarse a la plataforma .NET y a Visual Basic .NETcomo lenguaje de programación. ¡Y el resultado fueespectacular!

En pocos días la mayoría del grupo podía crear suspequeñas aplicaciones de escritorio, con o sin accesoa datos y páginas Web con alguna que otra funciona-lidad. Pero lo más sorprendente en ese momento fuever cómo algunos de los jóvenes vieron en .NET unmundo fascinante y con el que podían hacer cosas quehasta entonces eran impensables. Algunos se impre-sionaron de la parte gráfica para crear interfaces deusuarios (Windows y Web forms), otros con la facili-dad con la que se podían acceder a los datos y crearprogramas para manejarlos. De esta manera se reali-zaron una serie de clases formativas donde se les ense-ñó el manejo de Visual Studio .NET 2003, la plata-forma .NET en sus diferentes capas, la creación deaplicaciones de escritorio con Windows Forms, el

dotN

etM

anía

<<

50

dnm.comunidad.net<<dnm.comunidad.net

SIO y .NETCreando futuros

<< Del cómo se hizo...

Decir que ingenieros superiores o técnicos informáticos dedicados a la programa-ción, con varios años de experiencia en el mundo del desarrollo de software hancreado un software para una administración usando SQL Server 2000 como basede datos y Visual Studio .NET 2003, es algo que en el mundo de la informática no

sorprende mucho. Pero … ¿y si ese software lo crean dos jóvenes sin conocimien-tos previos de programación y sin experiencia anterior?

1 Información de los Talleres de Empleo y Casa de Oficios en http://www.inem.es/ciudadano/etco/indetyco.html2 Web del PDL Huelva Impulsa http://www.huelvaimpulsa.es

Page 51: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Windows Communication Foundation (WCF) es el nuevo modelo de programación unificado para el desarrollo de comunicaciones

acceso a datos ADO.NET y la creación de aplica-ciones Web con ASP.NET. El lenguaje de progra-mación elegido fue Visual Basic .NET ya que se pen-só que era el más sencillo para el grupo.

Para la segunda fase del proyecto se dividió el gru-po de 15 alumnos en subgrupos para trabajar cada unode ellos en una aplicación diferente. El principal fueel grupo de SIO, el proyecto de la Agencia deColocación, que inicialmente estaba formado por tresalumnos: Francisco Javier Carbajosa, Francisco JoséDíaz, Juan Antonio y por mí como monitor de la Casade Oficios y tras haber realizado las primeras sesionesde análisis para encaminar el proyecto. Además, se rea-lizaron otras aplicaciones, también para el Patronatode Desarrollo Local tales como AVALICO para lagestión de Asuntos propios, Vacaciones, Licencias yOtros asuntos del Departamento de Personal y un con-trol de inventario.

En este punto podríamos entrar en la eterna dis-cusión de si para realizar un proyecto de ciertaenvergadura se necesita personal con títulos o no…Bueno, yo no entro en eso, para mí la gente que tra-baja con ganas e ilusión al final tienen su recom-pensa (monetaria o de otra índole). El objetivo dela Casa de Oficios Teclado 2 era formar a una seriede chicos y chicas en materia informática y realizarun objeto de actuación y, de esta manera, intentar

poner algo más claro el futuro de esos jóvenes. Laverdad es que es muy gratificante ver que con unproyecto, en este caso SIO, y con ayuda de .NETunido al trabajo diario y la ilusión de los jóvenes sepuede llegar a desarrollar proyectos interesantes y,lo más importante, se pueden crear futuros paraaquellos que puedan estar necesitados o que no ten-gan muy claro que quieren hacer y que les guste elmundo de la programación.

Desde este espacio quiero felicitar al grupo de 30jóvenes de Teclado2 por su comportamiento y tra-bajo durante el año que duró la Casa de Oficios ydesearles lo mejor en su vida laboral y personal, enespecial a los dos chicos que consiguieron una becaen el Patronato de Desarrollo Local: Francisco JavierCarbajosa y Francisco José Díaz, que han desarro-llado SIO llegando a ponerlo en producción en laAgencia de Colocación del Ayuntamiento de Huelva.Pienso que este trabajo puede ser un ejemplo paraque otros ayuntamientos y jóvenes tengan iniciativascomo ésta y que .NET pueda seguir ayudando a cre-ar futuros.

dotN

etM

anía

<<

51

dnm.comunidad.net<<

Miguel J. RodríguezIngeniero Técnico InformáticoAnalista-Programador

Antes de ver algunos aspectos técnicos del pro-yecto SIO, comentar brevemente cuál era el siste-ma que se utilizaba en la agencia de colocación delayuntamiento de Huelva y se estaba utilizando des-de hace algo más de seis años. Dicho sistema loutilizaban tres empleados de la agencia que meca-nizaban los datos aportados por las personas quebuscan un empleo y rellenan un formulario con losdatos personales, la formación académica, la expe-riencia laboral, las ocupaciones en las cuales dese-an trabajar y entregan el currículum y la vida labo-ral. Con estos tres requisitos y una breve entre-vista, en la cual se comenta lo escrito en el formu-lario, se procedía a introducir los datos en una basede datos Access. En la figura 1 podemos ver unacaptura de pantalla con un formulario de la basede datos comentada anteriormente.

Internamente la aplicación consta de 64 tablasrelacionadas. La tabla principal, llamada SIO, está for-mada por nada más y nada menos que por 91 cam-pos. Tenemos que reconocer que la primera vez queabrimos esta base de datos nos quedamos boquia-biertos y con la mente en blanco ya que no sabíamos

por donde cogerla para poder realizar un análisis pre-vio y entender la lógica de ésta.

Abrimos nuestro Visual Studio .NET 2003 ycreamos nuestro primer gran proyecto con nuestro

<< Del aspecto técnico…

Figura 1. Pantalla de datos personales

Page 52: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Windows Communication Foundation (WCF) es el nuevo modelo de programación unificado para el desarrollo de comunicaciones

primer formulario vacío y empezamos a agregarvarias etiquetas, cajas de textos, así como algún queotro botón, nuestro primer dataset, el cual cargaríala tabla principal donde se almacenan los datos deldemandante y a enlazarlos con las cajas de textos, asícomo algunos ComboBox. Fuimos dándole forma, yFrancisco Javier, Paco para los amigos, no podía evi-tar ponerlo todo alineado, ordenado y cambiar elcolor a algunos objetos así como poner alguna ima-gen al formulario para diferenciar SIO de las demása simple vista. Si .NET nos brinda la posibilidad depoder configurar las propiedades a nuestro antojo,así como con el Framework y sus clases, sobre todoGDI+, ¿por qué no aprobecharlo?. Utilizar GDI+en la aplicación SIO le da una apariencia muy atrac-tiva y diferenciadora respecto a las demás aplicacio-nes instaladas en cualquier equipo (ver figura 2).

Funcionalmente la aplicación sedivide en tres grandes bloques. Porun lado tenemos los demandantes,por otro las empresas, y por últimoun motor de búsqueda que selec-ciona demandantes candidatos paracubrir las ofertas de las empresas.Se construyeron los formularios deintroducción de demandantes parano dejar ningún dato importante sinrecoger. También existe un formu-lario para las empresas de las que serecogen unos datos específicos ycomo mínimo una oferta.

Uno de los controles más usa-dos en el cliente de escritorio es elListView ya que se amolda perfec-tamente al diseño seguido en losformularios y permite visualizar demanera rápida y cómoda (por ejem-plo, los cursos realizados por undemandante, o los idiomas queconoce) para el usuario que usa laaplicación cierta información sobreun demandante o empresa en con-creto. El código del fuente 1 mues-tra cómo se implementó la bús-queda de demandantes y que elresultado se mostrase en unListView. Tenemos un conjunto dedatos (DS) resultante de buscar enla base de datos los demandantespor una serie de parámetros comoel NID (número de identificación deldemandante, dado por el ServicioAndaluz de Salud) y queremosmostrar los datos en el ListViewLVBuscar.

dotN

etM

anía

<<

52

dnm.comunidad.net<<

Figura 2. Un ejemplo del tipo de formularios creados para SIO

TryDs = Buscar.DameDemandantePorNID(conex, PrimeraLetra, Numeros, SegundaLetra)For i As ...

LVBuscar = ParentForm.Controls(i)LVBuscar.Items.Clear()LVBuscar.Columns.Clear()dimensionInt = LVBuscar.Size.WidthIf Ds.Tables(0).Rows.Count > 0 Then

ColumnasDemandante(LVBuscar, dimensionInt, Ds.Tables(0).Rows.Count)AddDemandantes(LVBuscar, Ds)Exit For

ElseColumnasDemandante(LVBuscar, dimensionInt, 0)

End IfNext

Catch ex As Exception : End Try

Public Function ColumnasDemandante( ByVal ListV As ListView, ByVal siz As Integer,ByVal FilasDevueltas As String)

If FilasDevueltas = 0 ThenResultadoCero(ListV, siz)

ElseListV.Columns.Clear()ListV.Columns.Add("NID", 100, HorizontalAlignment.Left)ListV.Columns.Add("Nombre", 90, HorizontalAlignment.Left)ListV.Columns.Add("Primer apellido", 90, HorizontalAlignment.Left)ListV.Columns.Add("Segundo apellido", 90, HorizontalAlignment.Left)

End IfEnd Function

Public Sub AddDemandantes(ByVal ListV As ListView, ByVal _DataSet As DataSet)Dim LViewInicial As ListViewItemDim NID, nombre, ap1, ap2 As StringListV.Items.Clear()For i As Integer = 0 To _DataSet.Tables(0).Rows.Count - 1

TryLViewInicial = New ListViewItem(NID)'Añado las variables al listviewListV.Items.AddRange(New ListViewItem() {LViewInicial})ListV.Items(i).SubItems.Add(nombre)ListV.Items(i).SubItems.Add(ap1)ListV.Items(i).SubItems.Add(ap2)

Catch ex As System.ArgumentOutOfRangeException : End TryNext i

End Sub

Fuente 1

Page 53: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Windows Communication Foundation (WCF) es el nuevo modelo de programación unificado para el desarrollo de comunicaciones

Respecto a laexplotación de losdatos, se decidiócrear un generadorde consultas quepermitiera a la per-sona encargada demecanizar buscar alos candidatos. Seestablecieron unosrequisitos que po-drían ser aleatoriosy que se podríanbuscar con opera-dores como AND u OR. En total se pueden buscar por88 requisitos que se pueden usar indistintamente conAND u OR y que elevan la posibilidad de encontrar elperfil adecuado a dicha oferta. Este motor es funda-mental en SIO ya que es el punto donde se buscaencontrar un demandante que se ajuste a una ofertade una empresa en concreto.

¿Cómo se hizo?, ¿cómo empezar?. El formularioConsultas hace una cadena SQL que luego lanza al ser-vidor SQL Server 2000 y este nos devuelve unos resul-tados en forma de DataSet. Esta cadena resulta de elegirlos requisitos de los diferentes paneles que contiene dichoformulario. Cada panel tiene una serie de requisitos y sedividen en cuatro: Datos personales, datos académicos, expe-riencia laboral y ocupaciones. El primer panel siempre serábuscado con el siguiente con un AND pero esto no signi-fica que sea obligatorio buscar siempre con ese panel,sino que se puede elegir buscar cualquier panel y buscarentre los distintos requisitos con su AND u OR correspon-diente y con el siguiente panel también con los mismosoperadores.

Una vez buscados los requisitos se pulsa un botónque guarda en arrays todos los requisitos y que vahaciendo por partes la consulta SQL (datos persona-les, datos académicos etc.). Toda esta consulta que vagenerando está segura de posibles errores en la meca-nización. Para ello se crearon ListView, ListBox, Labelcon datos provenientes desde un pequeño formularioal que llamamos buscador inteligente debido a que bus-ca una ocupación por letras y nos muestra en unListView todas las que resultan coincidentes para agre-gar una de ellas a nuestro Label; en definitiva, no se dala posibilidad de introducir datos manualmente y deesta manera evitar errores de mecanografía, tan comu-nes en este tipo de aplicaciones donde se almacenancientos de miles de registros. Las figuras 3 y 4 mues-tran algunos los formularios de entrada de este motorde búsqueda de SIO.

La aplicación se completa con una serie de infor-mes encaminados a mejorar el proceso de envío deinformación a demandantes y empresas.

Actualmente la agencia de colocación delAyuntamiento de Huelva, perteneciente a Huelva

Impulsa, tiene enproducción esteproyecto que pre-tende ser el eje cen-tral informáticopara que dichaagencia mejore susservicios y de estamanera ayudar amuchos onubensesa encontrar trabajoy a las empresas acubrir sus ofertas.

Miguel, Paco y Fran junto con otro grupo de perso-nas residentes en Huelva y con la ayuda de MicrosoftIbérica han puesto en marcha el Grupo de UsuariosOnobanet para que todos aquellos que estén interesa-dos en esta tecnología de Microsoft dispongan de unacomunidad de usuarios en la zona para aprender, ense-ñar, participar… en los temas relacionados con .NET.Más información en www.onobanet.com.

dotN

etM

anía

<<

53

dnm.comunidad.net<<

Figura 3. Los formularios de recogida dedatos para el motor de consulta de SIO

Figura 4. Buscador inteligente para evitarerrores de mecanografía

Francisco José DíazProgramador

Francisco Javier CarbajosaProgramador

este trabajo puede ser un ejemplo para queotros ayuntamientos y jóvenes tengan

iniciativas como ésta y que .NET pueda seguir ayudando a crear futuros

Page 54: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Windows Communication Foundation (WCF) es el nuevo modelo de programación unificado para el desarrollo de comunicaciones

algunas preguntas que giranen torno al tema de los servicios Web. Por si alguienha pasado los últimos tres años en una cueva en lo másprofundo de una selva tropical (y sin conexión aInternet), diré que los servicios Web son componen-tes de software instalados en una URI pública que eje-cutan métodos a petición. La interfaz pública del ser-vicio se define acorde con un sistema XML y se imple-menta utilizando un API disponible en la plataforma.Es posible utilizar llamadas entre plataformas distin-tas debido a la ubicuidad de los protocolos más comu-nes (principalmente HTTP, pero no sólo HTTP) ylos analizadores sintácticos XML.

En general la implementación de un servicio Webno es una tarea ardua, incluso si la configuración yajuste fino de un servicio Web en el mundo real noresulta un paseo. Por otra parte, ¿no es esto así paracualquier fragmento de código? La complejidad es loque marca la diferencia entre simple código y códigodel mundo real.

Tengo una aplicación ASP.NET que, con fre-cuencia, necesita hacer llamadas a un servicio Webremoto. Primero, lo implementé directamente enel código de la página usando métodos de la claseProxy que Visual Studio crea. El rendimiento no esdemasiado bueno. Si cambio el código que llama alservicio Web a un componente separado, ¿iránmejor las cosas?

Tal y como yo lo veo, el problema no está en elservicio Web. Si cambias el código a una capa inde-pendiente, o incluso si lo recompones para encajarcon las llamadas al servicio en la capa de negocio,no experimentarás una mejora significativa del ren-dimiento (¡ni de la escalabilidad!). ¿Por qué? Porqueel problema descansa fuera de ahí: precisamente laexplosiva mezcla de la arquitectura ASP.NET y lastareas de larga duración como la llamada a un ser-vicio Web.

Cuando llega una petición de página, el motorde ejecución de ASP.NET asigna un subproceso delpool de subprocesos para atender la petición. Estesubproceso se extrae y permanece en estado de “nodisponible” hasta que la petición se completa. Si lapetición implica la llamada a un servicio Web, elsubproceso es bloqueado hasta que la respuesta ha

sido descargada a la página. Si llegan múltiples peti-ciones de páginas que están vinculadas con un ser-vicio, el número de subprocesos libres del pool, dis-minuye peligrosamente, causando que las peticio-nes se coloquen en una cola. La escalabilidad, y con-secuentemente el rendimiento del sistema, están enriesgo.

La solución perfecta para esta situación es el usode páginas asíncronas. En ASP.NET 1.x las pági-nas asíncronas no resultan un código trivial de codi-ficar. No es imposible, pero no es fácil. Hay queescribir la página como un manejador asíncronoespecial ASHX y sobrescribir el métodoProcessRequest. Comienzas la operación, registrasun callback para finalizarla y manejas el accesoentre subprocesos a cualquier dato compartido. Sitienes éxito verás una considerable mejoría.

En ASP.NET 2.0, las cosas son mucho más fáci-les, y básicamente, el Framework hace la mayor par-te del trabajo por nosotros. Mi sugerencia es en dospartes. Si quieres mantener la estructura existente,y tienes páginas que hagan la tarea de llamar al ser-vicio Web, basta con reescribir cada página paraque sea asíncrona. Las buenas noticias son queASP.NET 2.0 permite escribir páginas asíncronascomo si fueran páginas normales, solo que añadién-doles un conjunto extra de posibilidades. No estáclaro a partir de la pregunta si los resultados delservicio Web son fundamentales para la construc-ción de la página de usuario. En otras palabras, sila llamada al servicio Web debe de ser sincrónicarespecto al usuario (y asíncrona respecto al runti-me de ASP.NET), las páginas asíncronas son lamejor manera de resolverlo. En otro caso, si pue-

En general la implementación deun servicio Web no es una tarea

ardua, incluso si la configuración yajuste fino de un servicio Web enel mundo real no resulta un paseo

Servicios Web y más…

Dino Esposito

dnm.todotnet.qa

<< Este mes he seleccionado

Dino Esposito es redactor de dotNetManía.

Formador, consultor y escritorafincado en Roma.Miembro

del equipo de Wintellect,Dino está especializado en

ASP.NET y ADO.NET. Puedeenviarle sus consultas a

[email protected]

“”

Page 55: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Windows Communication Foundation (WCF) es el nuevo modelo de programación unificado para el desarrollo de comunicaciones

des llamar al servicio y olvidarte, podría interesar-te escribir páginas que simplemente emitan llama-das a un servicio externo (podría ser MSMQ o unservicio NT) y vuelvan. El servicio externo, a suvez, tendría la misión de llamar al servicio Web yejecutar la operación.

Para construir una página asíncrona, tienes queañadir a la directiva Page de la página el nuevo atri-buto Async=true. El efecto de este atributo es infor-mar al runtime para que marque el ensamblado depágina con la interfaz IHttpAsyncHandler. Esta mar-ca de interfaz (no se requiere la implementación demétodos) es reconocida por el runtime de ASP.NETquien se prepara para procesarla de forma asíncro-na. Una petición asíncrona está dividida en dos y esservida por dos subprocesos distintos, de forma quesu utilización sea óptima y sea un subproceso deentrada/salida el encargado de ejecutar la tarea poten-cialmente más larga (por ejemplo, la llamada al ser-vicio Web). En la página, se registra una rutina espe-cial que da comienzo a la llamada al servicio y otraque procede con la finalización. Para iniciar y fina-lizar el proceso, simplemente se llama a los métodosadecuados en el Proxy. Esto es un ejemplo:

BeginTask y EndTask se registran como un par demétodos asíncronos para una operación concreta,de la siguiente forma:

Aparte del uso de páginas asíncronas, este códigoes muy similar al que usamos hoy. Lo que, de hecho,refuerza la idea de que no hay nada malo en la llama-da al servicio Web que ha originado esta respuesta, elproblema radica en la forma de ejecutar tareas largasdentro de las aplicaciones ASP.NET.

¿Qué es una llamada a un servicio del tipo "lan-zar y olvidarse"?

Si haces una búsqueda por este término (en inglésfire-and-forget), y escoges la opción de “Voy a tenersuerte”, hay posibilidades de que te encuentras conuna descripción en términos militares. Se refiere a untipo de misil que no requiere un seguimiento poste-rior una vez lanzado, para poder alcanzar su objetivoaunque éste no esté siquiera en la línea de fuego (defi-nición tomada de Wikipedia).

El significado de este término adaptado a losservicios Web significa un tipo de llamada que noprecisa de atención subsiguiente a su lanzamiento(el ciclo lectura-devolución de valores-sincronización)tras su ejecución. Una llamada de ese tipo alcanzasu URL de destino sin importar lo que esté reali-zando el proceso que llama. Desde la perspectivade ASP.NET, significa que una página puede lan-zar la llamada y terminar devolviendo la ejecuciónal subproceso principal, y el subproceso usado al“pool de subprocesos”.

No todas las llamadas a servicios Web puedenser de ese tipo. Como puedes imaginar fácilmente,una página que necesita procesar los valores deretorno de una llamada no puede ser de ese tipo.Cuando eso es posible, ese tipo de llamadas aportasignificativos beneficios a las aplicaciones.

Es esencial tener en cuenta que una llamada lan-zar-y-olvidarse requiere la atención debida por par-

dotN

etM

anía

<<

55

dnm.todotnet.qa<<

To

do

tNet.

qa@

do

tnetm

an

ia.c

om

To

do

tNet.

qa@

do

tnetm

an

ia.c

om

IAsyncResult BeginTask(object sender, EventArgs e, AsyncCallback cb, object state)

{weather = new SomeWeatherService();return weather.BeginGetTemperature(cb, state);

}

void EndTask(IAsyncResult ar){

temperature = weather.EndGetTemperature(ar);}

Un servicio Web que marca unode sus métodos con el atributoOneWay=true, soporta un meca-nismo de llamada lanzar-y-olvidarse

para ese método

“”

más del 95% de los navegadoresactuales, tienen ricas capacidades desoporte de scripting. ¿Por qué esasamplias capacidades de scripting?

“”

void Page_Load (object sender, EventArgs e){

AddOnPreRenderCompleteAsync (new BeginEventHandler(BeginTask),new EndEventHandler(EndTask));

}

Fuente 1

Fuente 2

Page 56: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Windows Communication Foundation (WCF) es el nuevo modelo de programación unificado para el desarrollo de comunicaciones

te del servicio Web, y al final es el propio servicioel que soporta los métodos más que el cliente.

Un servicio Web que marca uno de sus méto-dos con el atributo OneWay=true, soporta un meca-nismo de llamada lanzar-y-olvidarse para ese méto-do. El atributo instruye al runtime para que devuel-va inmediatamente un código de estado HTTP 202y detenga inmediatamente toda comunicación. Unmétodo que pretenda soportar este atributo debeestar marcado como void en su valor de retorno (oser de tipo Sub, en Visual Basic) y no soportar nin-gún parámetro de salida. Desde el punto de vistadel cliente, una llamada de este tipo puede reali-zarse de forma síncrona o asíncrona, eso depende-rá de la latencia de la red1.

He copiado un proyecto mío ASP.NET 2003 aotro directorio y lo he abierto con Visual Studio2005. El fichero reference.vb no aparece pero pue-do seguirlo programando porque lo reconoce elIntellisense. Además, observo nuevos métodos en laclase proxy, y especialmente, un nuevo método localdel tipo xxxAsync. ¿Qué es eso?

En ASP.NET 2.0, el modelo de compilación haceinnecesaria la generación de clases Proxy en tiempo dediseño. Fíjate que no quiero decir que las clases no seannecesarias sino que su creación se oculta al desarrolla-dor de VB, y se delega en el sistema en tiempo de eje-cución. Por eso no lo ves, pero, sin embargo puedesseguir programándolo como hasta ahora.

En cuanto a los métodos xxxAsync, estás en locierto. Es una nueva característica incluida en .NETFramework 2.0, para permitir al desarrollador unamayor sencillez en las invocaciones asíncronas a unservicio (fuente 3).

Por ejemplo, enlazas la función OnQueryWeather alevento Click de un botón, y este llama al métodoGetTemperature() de un servicio Web llamadoSomeWeatherService. Al mismo tiempo, se registra laretrollamada (Callback) GetTemperatureCompleted queserá invocada automáticamente cuando el métodoretorne.

¿Cuál es la diferencia entre esta aproximacióny la clásica? Una fundamental es que cuando usas

los métodos xxxAsync(), la página ASP.NET se con-vierte en asíncrona automáticamente. Esto tambiénsignifica que si estas haciendo múltiples llamadasla interpretación visual de la página se retrasa has-ta que todas han terminado.

Quiero crear un servicio Web que reconozca alusuario y ajuste la respuesta adecuadamente. Sinembargo, no quiero que los llamantes especifiquencredenciales en la signatura del método.

El punto clave, es que el método Web usa elobjeto User.Identity para averiguar informaciónde la llamada. La información devuelta porUser.Identity puede ser indicada de varias formas.Por ejemplo, pueden establecerse las credencialesen la clase proxy:

En este caso, se requiere autenticación Windowsen la máquina que aloja el servicio Web, y el recur-so .asmx debe de disponer de del apropiado con-junto ACL. Si todo va bien, la llamada se ejecuta yUser.Identity contiene las credenciales.

Si quieres usar el servicio Web para autentica-ción, entonces debes de usar una extensión SOAPpara recoger las credenciales del cliente y vincular-las a la petición. Para comprobar las credencialesen el servidor, puedes usar un módulo HTTP deautenticación que extraiga y verifique los datos. Eneste escenario, la documentación MSDN on-lineincluye muchos ejemplos. Por último, WSE ges-tiona también esta solución y permite cifrar las cre-denciales a petición.

dotN

etM

anía

<<

56

dnm.todotnet.qa<<

To

do

tNet.

qa@

do

tnetm

an

ia.c

om

To

do

tNet.

qa@

do

tnetm

an

ia.c

om

1 Tiempo de respuesta a una petición de tipo Ping. Es inherente a las características físicas de la misma. (N. del Traductor)Traducción por Marino Posadas

En ASP.NET 2.0, el modelo de compilación hace innecesaria lageneración de clases Proxy en

tiempo de diseño

“”

protected void OnQueryWeather(object sender, EventArgs e){

weather = new SomeWeatherService();GetTempCompletedEventHandler handler;handler = new GetTemperatureCompletedEventHandler(

GetTemperatureCompleted);weather.GetTemperatureCompleted += handler;

// Call the Web method asynchronously weather.GetTemperatureAsync(...);

}

void GetTemperatureCompleted(object s, GetTemperatureCompletedEventArgs e)

{// Process the results you get from e.Result

}

weather = new SomeWeatherService();weather.Credentials = new NetworkCredential(user, pswd);weather.GetTemperature();

Fuente 3

Fuente 4

Page 57: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Windows Communication Foundation (WCF) es el nuevo modelo de programación unificado para el desarrollo de comunicaciones

dotN

etM

anía

<<

57

<<

.NET Compact Framework Programming with C#Paul Yao y David Durant

Editorial: Addison-Wesley ISBN: 0321174038Páginas: 1424Publicado: 2004Idioma: Inglés

La importancia de la programación para dispositivos móviles continúa su crecimiento y erade justicia reconocer a esta obra de Yao y Durant (la más vendida y reconocida a nivel popu-lar) como la más recomendable. No solo porque es una especie de “Enciclopedia del CompactFramework”, sino por que trata algunos temas que difícilmente se encuentran en otras obrasdel mismo tema, como el funcionamiento del Garbage Collector, la creación de controles per-sonalizados, el soporte de Platform/Invoke (con algunos excelentes trucos para llegar dondeCompact Framework no llega), Databinding, sincronización con SQL Server CE, el accesoa creación de Fonts y características de la impresión así como una extensa comparativa entrela plataforma estándar y Compact Framework.

Otro aval que habla por sí mismo es la categoría de sus autores: pertenecientes durante variosaños al equipo de desarrollo de Compact Framework en Microsoft, han ilustrado la obracon ejemplos en los que se aprovecha la coyuntura para sugerir algunas de las mejores prác-ticas de programación y buenas prácticas en este entorno.

Programming the .NET Compact FrameworkWei Meng Lee, Brian Jepson

Editorial: O'ReillyISBN: 0596004338Páginas: 304Publicado: Noviembre de 2005Idioma: Inglés

Completamos nuestra invitación bibliográfica de Compact Framework con otra recomen-dación adecuada para aquellos que le tienen fobia a las obras de extensión, y prefieren ir alos fundamentos rápidamente y ponerse manos a la obra. Se trata de un pequeño libro deLee y Jepson, muy celebrado igualmente en la comunidad de desarrolladores por su senci-llez. Es una publicación reciente, e incluye aspectos del .NET Framework 2.0. Los autoresson bien conocidos (Brian Jepson tiene un blog muy popular en EE.UU sobre está temá-tica, que merece una visita: http://www.jepstone.net/radio/2003/02/17.html). En suma, podrí-amos decir que es la alternativa directa del anterior.

dnm.biblioteca.net<<

dnm.biblioteca.net

Page 58: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Windows Communication Foundation (WCF) es el nuevo modelo de programación unificado para el desarrollo de comunicaciones

jfo’s coding: Interesantísimo sitio de un “microsof-tie” que prefiere permaneceren el anonimato. Excelentesanálisis sobre las peculiarida-des de funcionamiento deWindows Forms. http://blogs.

msdn.com/jfoscoding.

Microsoft anuncia dos nuevas CTP de Windows Vista yLonghorn Server

Ya disponibles para descarga desde mediados dediciembre, estas dos nuevas versiones (Build 5270)según los datos, nos acercan cada vez más a los pro-ductos finales, y -como tantas veces- Paul Thurrotse ha apresurado a incluir algunas interesantes imá-genes en su sitio Web y un conjunto más completoestá disponible en ActiveWin (ver http://www.acti-vewin.com/screenshots/vista/5270)

dotN

etM

anía

<<

58

dnm.desvan<<

Marino Posadas

Running Windows withNo Services: Estupendoartículo del “monstruo”

Mark Russinowtich sobre como ejecutar Windowssin servicios. Disponible en http://www.sysinternals.com/blog/2005/07/running-windows-with-no-services.html.

Documentos en la Red Sitios del mes

no

tici

as.

no

tici

as

DonationCoder: presenta un nuevo conjunto de utilida-des gratuitas para el ajuste fino de Windows y el controlde la ejecución de aplicaciones. Una larga lista con expli-cación e imágenes explicativas de cada una, disponible enhttp://www.donationcoder.com/Software/Skrommel/index.html

Larkware

Sitio dirigido por un colabo-rador habitual de las revis-tas Advisor, Mike Gun-derloy, con informacióngeneral sobre el mundodel desarrollo. Contienereferencias a dos de sus libros más interesantes“Coder to Developer” y “Developer to Designer”.http://www.larkware.com.

Create shortcuts with a .NET appli-cation: Curioso artículo sobre la cre-ación de “shortcuts” desde .NET.

Nada nuevo en sí, pero bien explicado, y quizás un pun-to de partida para la lectura de otras buenas colabora-ciones que pueden encontrarse en GeekPedia(http://www.geekpedia.com/tutorial125_Create-shortcuts-with-a-.NET-application.html)

Uti l idades del mes

Blog News Channel(Inside Microsoft):Canal de noticias

sobre todo lo relacionado con la compañía desdeel punto de vista de las bitácoras. http://micro-soft.blognewschannel.com.

Page 59: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Windows Communication Foundation (WCF) es el nuevo modelo de programación unificado para el desarrollo de comunicaciones
Page 60: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Windows Communication Foundation (WCF) es el nuevo modelo de programación unificado para el desarrollo de comunicaciones