dotnetmanía · nº 53 noviembre 2008 6,50 € visual basic • c# • asp.net • ado.net • ajax...

60
dedicada a los profesionales de la plataforma .NET www.dotnetmania.com entrevista Ivar Jacobson Chairman & CTO Ivar Jacobson International nº 53 noviembre 2008 6,50 Visual Basic • C# • ASP.NET • ADO.NET • AJAX • Silverlight • .NET Framework dotNetManía LINQ to SQL y N-Capas: esto es amor • Modelación tridimensional en DirectX y WPF • Migración de bases de datos a SQL Server 2008 • Integración de CMMI en Visual Studio Team System Workflows en SharePoint

Upload: others

Post on 07-Oct-2020

1 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: dotNetManía · nº 53 noviembre 2008 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX • Silverlight • .NET Framework dotNetManía LINQ to SQL y N-Capas: esto es

dedicada a los profesionales de la plataforma .NET

www.

dotne

tman

ia.co

m

entrevistaIvar JacobsonChairman & CTOIvar Jacobson International

nº 53 noviembre 2008 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX • Silverlight • .NET Framework

dotNetManía

LINQ to SQL y N-Capas: esto es amor • Modelación tridimensional en DirectX y WPF • Migración de bases de datos a SQLServer 2008 • Integración de CMMI en Visual Studio Team System

Workflows en SharePoint

Page 2: dotNetManía · nº 53 noviembre 2008 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX • Silverlight • .NET Framework dotNetManía LINQ to SQL y N-Capas: esto es
Page 3: dotNetManía · nº 53 noviembre 2008 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX • Silverlight • .NET Framework dotNetManía LINQ to SQL y N-Capas: esto es

Bienvenido al número 53, de noviembrede 2008, de dotNetManía.

Mientras dábamos los últimos reto-ques a este ejemplar, nos llegaban noticiasde los nuevos lanzamientos que se estabanpresentando en PDC 2008, celebrado enLos Ángeles entre los días 27 y 30 de octu-bre. Marino Posadas lo ha resumido des-de su “desván”, pero es imposible en tanpoco tiempo y en tan poco espacio, poderplasmar la larga lista de lanzamientos quese acaban de presentar: Windows 7, IE8,CLR 4.0, C# 4.0, Live Wave 3, Parallels,.NET Services, Geneva, Office 14, Iron-Ruby, Oslo, Quadrant, Surface, Dublín,DLR, C++ 10, Velocity, SecondLight,IronPython, TouchSmart, SilverlightMobile, Visual Studio 10, Cloud, SQLServices, Visual Basic 10, M, Live Essen-tials, Zermatt, F#, Live Services, WindowsAzure, Rosario... !Uff! Tiempo habrá dehablar en profundidad de cada uno de losproductos y las tecnologías que más nosafectan a los desarrolladores de la plata-forma .NET (espero).

Este mes entrevistamos a IvarJacobson, uno de los grandes, de losmíticos de la historia de la Informática.Quién ha sido y quién es, y cuáles sonsus opiniones, es algo que puede ver enesta entrevista realizada por Luis Frai-le y Octavio Hernández.

Juan María Laó publica “LINQ toSQL y N-Capas: esto es amor”, dondeveremos cómo detectar rápidamente loscambios que se produzcan en la base dedatos y ajustar nuestro código al nuevomodelo de datos.

Ludwig Leonard, junto con MiguelKatrib, del Grupo Weboo de la Univer-sidad de La Habana, presentan “Modela-ción tridimensional en DirectX yWPF”,trabajo en el que se aborda la modelacióntridimensional, proceso mediante el cualse define matemáticamente la descripciónde cómo se ve un cuerpo en el espacio des-de un punto de observación.

Miguel Tabera Pacheco se encargadel artículo de portada: “Workflows enSharePoint. ¿Trabajo más de la cuenta aldiseñar flujos de trabajo?” donde nosmuestra las ventajas de usar el diseñadorde flujos de trabajo SharePoint Designer2007, que permite diseñar flujos basadosen Workflow Foundation de forma sen-cilla y usar Visual Studio para desarrollarlas actividades.

Antonio Soto con el artículo “Migra-ción de bases de datos a SQL Server 2008”analiza las consideraciones que debemostener en cuenta a la hora de realizar lamigración de una instancia de SQL Ser-ver a la nueva versión SQL Server 2008,mientras que Ángel Rayo con “Integra-ción de CMMI en Visual Studio TeamSystem” da inicio formalmente a la sec-ción ALManía, anunciada el mes pasado.

Por último, quisiera pedirle su cola-boración para ayudarnos a adecuar loscontenidos de esta revista a lo que lamayoría de ustedes esperan. Si disponede un minuto, por favor, pase porwww.dotnetmania.com/feedback y denossu opinión.

Por este mes, esto es todo. Espero quenuestro trabajo sea de su agrado.

Época de lanzamientos

editorialDedicada a los profesionales de la plataforma .NET

Vol. III •Número 53 • Noviembre 2008Precio: 6,50 €

EditorPaco Marín ([email protected])

Redactor jefeMarino Posadas([email protected])

RedacciónDino Esposito, Guillermo 'Guille' Som, LuisFraile, Luis Miguel Blanco y Miguel Katrib(Grupo Weboo)

Empresas colaboradoras

Alhambra-Eidos

Krasis

Plain Concepts

Raona

Solid Quality Mentors

Además colaboran en este númeroÁngel Rayo, Antonio Soto, Juan María Laó,Ludwig Leonard, Miguel Jiménez, MiguelTabera Pacheco y Octavio Hernández.

IlustracionesPortada: Javier RoldánCaricatura (Clico): Yamil Hernández

Atención al suscriptorPilar Pérez ([email protected])

Edición, suscripciones y publicidad.netalia

c/ Robledal, 13528522 - Rivas Vaciamadrid (Madrid)

www.dotnetmania.com

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

ImprimeGráficas MARTE

ISSN1698-5451

Depósito LegalM-3.075-2004

dotNetManíadotNetManía

Paco Marín

Page 4: dotNetManía · nº 53 noviembre 2008 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX • Silverlight • .NET Framework dotNetManía LINQ to SQL y N-Capas: esto es

sumario 53Eventos 08-10

ALM Sessions 2008SHiFT’08 Social and Human Ideas For TechnologyFundamentos Web 2008

Entrevista a Ivar Jacobson 12-14En ocasión de celebrarse en Madrid el evento ALM Sessions 2008 el pasado 16 de octubre, tuvimosla ocasión única de charlar con toda una leyenda viva de la ingeniería de software, Ivar Jacobson.

LINQ to SQL y N-Capas: esto es amor 16-19En este artículo veremos cómo detectar rápidamente los cambios que se produzcan en la base dedatos y ajustar nuestro código al nuevo modelo de datos. Permitiendo aislar aún más las tareas delequipo de base de datos y las del equipo de desarrollo.

Modelación tridimensional en DirectX y WPF 20-30En un artículo anterior se vió cómo se manifiestan los conceptos básicos para el proceso de graficacióntridimensional y cómo se manifiestan estos en DirectX y WPF. En este trabajo abordaremos lamodelación tridimensional que es el proceso mediante el cual se define matemáticamente ladescripción de cómo se ve un cuerpo en el espacio desde un punto de observación. Mediante unmodelo quedan descritas las propiedades topológicas (aquellas que definen la estructura fundamentaldel objeto, como el caso de sus superficies, y que son invariantes ante cualquier transformación) y laspropiedades geométricas (aquellas que describen la figura de manera precisa según un sistema decoordenadas).

Workflows en SharePoint. ¿Trabajo más de la cuenta al diseñar flujos de trabajo? 32-42De todas las funcionalidades para SharePoint que incorpora SharePoint Designer 2007,seguramente la más útil es el diseñador de flujos de trabajo. Permite diseñar flujos basados enWorkflow Foundation mediante un pequeño asistente. Cuando queremos hacer algo complicado yapensamos en pasar a Visual Studio, que es más potente, pero perdemos la sencillez del Designer. ¿Ysi pudiéramos combinar de alguna forma ambas tecnologías?

Migración de bases de datos a SQL Server 2008 43-49En este artículo analizaremos las consideraciones que debemos tener en cuenta a la hora de realizarla migración de una instancia de SQL Server a la nueva versión SQL Server 2008. Las versionesque están soportadas son las actualizaciones desde SQL Server 2000 y SQL Server 2005. En elcaso de que dispongamos de versiones anteriores de SQL Server, deberemos pasar por alguna deestas versiones intermedias antes de llegar a SQL Server 2008.

Integración de CMMI en Visual Studio Team System 50-54La certificación CMMI permite a las empresas presentarse a los clientes como una organización quelleva a cabo unos procesos bien estructurados y con un seguimiento continuo. Está demostrado que lasempresas que trabajan con procesos bien definidos y optimizados consiguen mejores resultados en susproyectos y sobretodo consiguen lo más importante “La satisfacción de los clientes”. Team Systempermite trabajar con CMMI en los entornos de desarrollo .NET

dnm.todotnet.qa 55-57Programación con WPFWPF y Silverlight 2 tienen mucho en común respecto a sus modelos de programación. Sin embargo,Silverlight no debiera ser considerada como una plataforma para portabilidad de código existente en WPF ala Web. Es una plataforma Web para escribir aplicaciones ricas usando una aproximación sintáctica similara la de WPF. En esta sección, vamos a revisar un par de problemas de programación que implican aprogramadores de WPF y Silverlight.

dnm.desvan 58

Page 5: dotNetManía · nº 53 noviembre 2008 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX • Silverlight • .NET Framework dotNetManía LINQ to SQL y N-Capas: esto es
Page 6: dotNetManía · nº 53 noviembre 2008 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX • Silverlight • .NET Framework dotNetManía LINQ to SQL y N-Capas: esto es

En el sitio Web deCodePlex (codeplex.com/silverlight) se hapuesto a disposicióndel público la prime-ra versión del Silver-light Toolkit, tal como

anunciaron los evangelistas y respon-sables del producto, con Scott Guth-rie a la cabeza, en los últimos meses.

Se trata de un conjunto de com-ponentes, herramientas y controles (delos que unos están en fase estable yotros todavía en terminación de prue-bas), que complementan las necesida-des del desarrollador de aplicacionesRIA, suministrando soporte de temas(themes), herramientas para tests unita-rios, y 12 controles adicionales: Tree-View, Expander, DockPanel, WrapPanel,Label, NumericUpDown, Spinner, etc.Todos ellos siguen los patrones dediseño del paquete de controles distri-buido en la versión final del producto,pero todos admiten de forma sencillasu modificación mediante el soporte decanales temáticos que propone esteToolkit (hasta 6 temas disponibles).

Además, el kit incluye herramien-tas de mejora para la visualización dedatos (charting), y soporte de automa-tización mejorado.

dotN

etM

anía

<<

6

noticiasnoticias

noticias

noticias

noticias

Nuevo Silverlight Toolkit,disponible

comunidad.net

Introducción al desarrollocon Silverlight 2.0

El próximo martes 18 de noviembre SecondNug, en colaboración con Alhambra-Eidosy Microsoft Ibérica, impartirá “Introduc-ción al desarrollo con Silverlight 2.0”, unwebcast introductorio para desarrolladoresque quieran descubrir las posibilidades deSilverlight 2, la última propuesta de Micro-soft en el ámbito del desarrollo Web.

El ponente, Marino Posadas, redac-tor jefe de dotNetManía y ProgramManager de Alhambra-Eidos, acaba depublicar su libro “Programación en Sil-verlight 2.0” –editado por netalia–, queservirá de base para su presentación. Mari-no hará una revisión de los mecanismos yherramientas de desarrollo que utilizamospara la construcción de aplicaciones Sil-verlight 2.0, incluyendo la arquitectura delas aplicaciones, la construcción de inter-faces de usuario (con VS2008 SP1 y Blend2.0 SP1), el uso y creación de controles yel acceso a datos mediante servicios Weby ADO.NET Data Services.

El evento transcurrirá en el horariohabitual entre las 19:30 y las 21:30(GMT+1), y se retransmitirá gratuitamen-te vía Web a través de Live Meeting. Pos-teriormente, podrá ser descargado desde elnuevo portal de formación de Alhambra-Eidos en http://www.formaciontic.com o des-de la Web de Microsoft Ibérica http://msdn.microsoft.com/es-es. Para inscribirse, visite laWeb del grupo de usuarios Second Nug en:http://www.secondnug.com.

5ª edición de EXPO:QA ’08

La 5ª edición de expo:QA, que se celebraráen Madrid los días 27 y 28 de noviembre,contará con la participación de reconoci-dos expertos del mundo del testing y el con-trol de software venidos de todo el mun-do. Ya han confirmado su presenciaExpo:QA 2008 especialistas como FranO’Hara, Karen Johnson, Susan Wind-sor o Stephen Walters, entre otrosmuchos. En total, serán más de 20 ponen-cias y sesiones de trabajo enfocadas especí-ficamente al segmento del testing, a las quehay que añadir también diversos cursos.

El evento dará comienzo el día 27 denoviembre con una ponencia de FranO’Hara (Insight Test Services) sobre Agi-le Testing. Durante esta primera jornada,participarán también Sergio López (IBM),que disertará sobre la tecnología Jazz en lagestión del ciclo de vida de las pruebas, yKaren Johnson, que aconsejará a los asis-tentes sobre la mejor manera de informarsobre el estatus de un producto de formaelocuente. En esta primera sesión tambiéntomarán parte Miguel Rial (HP), YaronTsubery (Comverse), María Díaz (STL),Luis Fraile (Microsoft) o ShyamaleeBhand (Sogeti), entre otros.

Durante la segunda jornada de las con-ferencias, la organización de expo:QA ha

confirmado la presencia de Ignacio Caño(Inteco), que hará un diagnóstico de lasituación de la calidad de software enEspaña, así como de Geert Vanhove(Sogeti), Stephen Walters (Borland),Stuart Reid (Testing Solutions Group) oEdgardo Greising, del Centro de Ensa-yos de Software.

expo:QA 2008 incluirá en su progra-ma algunos cursos, como por ejemplo el demetodología Tmap, que tendrá lugar en lapropia sede de SOGETI entre los días 24y 26 de noviembre. El objetivo es hacer unaintroducción al testing y conocer a fondoTmap, una de las tecnologías de SoftwareControl y Testing más extendidas interna-cionalmente.

Junto con este nú -me ro, si es sus-criptor a la revis-ta du rante el mesde no viembre,recibirá gratuita-mente el Cua-derno Técnico

de dotNetManía nº 9: Programa-ción en Silverlight 2.0, de MarinoPosadas. Este libro también podrárecibirlo gratuitamente en algunosde los eventos de MSDN España.

El propósito de este libro essuministrar al lector los conoci-mientos necesarios para empezara construir aplicaciones con la ver-sión 2.0 de Silverlight, abordandopara ello, todos los procesos fun-damentales: la elección del entor-no de trabajo, el análisis de laarquitectura y los modelos dedesarrollo, la construcción deinterfaces de usuario (desde VisualStudio 2008 y también desdeExpression Blend 2.0 SP1), elacceso a la información del siste-ma y a servicios Web para la lec-tura/es cri tura de datos y los meca-nismos de instalación y puesta apunto de las aplicaciones finales.

Ver en www.dotnetmania.com.

Libro: Programación enSilverlight 2.0

Page 7: dotNetManía · nº 53 noviembre 2008 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX • Silverlight • .NET Framework dotNetManía LINQ to SQL y N-Capas: esto es

dotN

etM

anía

<<

7

<<dnm.directo.noticias

En el marco del PDC 2008, Ray Ozzie, Arquitec-to principal de software de Microsoft, anunció Win-dows Azure, el conjunto de servicios basados enla nube que subyace a su Plataforma de serviciosAzure, y destacó el rol de la plataforma para la imple-mentación del enfoque de Software + Servicios a lainformática. La Plataforma de servicios Azure (Azu-re Services Platform) es una iniciativa pionera deMicrosoft para ayudar a los programadores a cre-ar la nueva generación de aplicaciones que se exten-derán desde la nueve hasta el centro de datos cor-porativo y ofrecerán nuevas experiencias de usua-rio a través de los PC, la Web y el teléfono.

Ozzie describió cómo la plataforma combinaposibilidades de desarrollo para la nube medianteservicios de infraestructura de almacenamiento,cálculo y comunicaciones; todos alojados en servi-dores que operan dentro de la red global de Micro-soft. Esto ofrece a los desarrolladores la posibili-dad de desplegar aplicaciones en la nube o en infra-estructura propia.

Potenciando el desarrollo en la nube con laPlataforma de servicios Azure

La Plataforma de servicios ofrece a los desa-rrolladores la flexibilidad y habilidad para crearaplicaciones aprovechando sus habilidades, herra-mientas y tecnologías actuales, como Microsoft.NET Framework y Visual Studio. Los desarro-lladores podrán además elegir entre una ampliagama de herramientas de desarrollo y tecnologíascomerciales u open source, y acceder a la Plata-forma de servicios Azure utilizando diversos están-dares de Internet como HTTP, REST, WS-* yAtomPub.

Entre los componentes claves de la Platafor-ma de servicios Azure están los siguientes:• Windows Azure, para el alojamiento y ges-

tión de servicios, almacenamiento escalable debajo nivel, cálculo y conectividad.

• Microsoft SQL Services, para una ampliagama de servicios de bases de datos y genera-ción de informes.

• Microsoft .NET Services, que son imple-mentaciones basadas en servicios de concep-tos familiares de .NET Framework como flu-jos de trabajo o control de acceso.

• Live Services, para que los usuarios tenganuna manera consistente de almacenar, com-partir y sincronizar documentos, fotos, fiche-ros e información a través de sus PC, teléfo-nos móviles, aplicaciones locales y sitios Web.

• Microsoft SharePoint Services and Micro-soft Dynamics CRM Services, para el con-tenido de negocio, la colaboración y el desa-rrollo rápido de soluciones en la nube.

Infraestructura avanzada de centros de datosMicrosoft también describió la importancia de

crear centros de datos robustos al desplegar servi-cios online. A lo largo del pasado año, Microsoft haabierto centros de datos de alta tecnología en Quincyy San Antonio, con centros de datos adicionales aabrirse próximamente en Chicago y Dublín. Dan-do soporte a la estrategia de Software + Servicios,los centros de datos de Microsoft sirven cuentas decorreo electrónico, páginas Web, mensajería ins-tantánea, fotos, vídeos, aplicaciones y resultados debúsqueda a millones de clientes de Internet.

Recortar costes y potenciar la innovaciónLas tecnologías de servicios, cuando se emple-

an conjuntamente con otras tecnologías habilita-doras como la virtualización y el modelado, pro-ducirán enormes ventajas para los departamentosde TI de los clientes. Concretamente, esas tecno-logías harán posible un mundo nuevo y más diná-mico, donde los departamentos de TI podrán redu-cir los costes operativos, centrando sus gastos ensistemas que diferencien al negocio, y haciendo queTI se convierta en un activo aún más estratégico.

Ofreciendo posibilidad de elección y flexibili-dad con S+S

La oferta de Microsoft también incluye Micro-soft Online Services. Estas soluciones ofrecen elsoftware corporativo como un servicio de suscrip-ción, alojado por Microsoft y vendido a través departners. Las aplicaciones de servicios de Micro-soft, como Exchange Online, SharePoint Online,Microsoft Dynamics CRM Online, Office Com-munications Online y Office Live Meeting podránutilizarse directamente o en combinación con elsoftware instalado localmente, permitiendo la elec-ción en función de la estrategia de TI del cliente.

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

Microsoft desvela Windows Azure

CTP de .NET 4.0 y Visual Studio 2010 disponible

Dentro del marco del PCD 2008, Micro-soft ha puesto a disposición del público unaCommunity Technology Preview (CTP) de.NET Framework 4.0 y Visual Studio 2010.La CTP, que se ofrece en forma de máquinavirtual, puede descargarse desde http://con-nect.microsoft.com/VisualStudio/content/con-tent.aspx?ContentID=9790. Puede obtener másinformación sobre las principales novedadesque incorporarán estas tecnologías enhttp://msdn.microsoft.com/en-us/vs2008/pro-ducts/cc948977.aspx.

comunidad.net

VS/VB Spanish Tour 2008Un encuentro sin duda esperado

Esta tercera semana de noviembre y una vezfinalizado el TechEd Europeo, nos com-place anunciar la visita de los equipos deproducto de Visual Studio y Visual Basic.

Como parte de las actividades propues-tas por los grupos de desarrolladores españo-les, esta cita viene a completar y reforzar elcompromiso de los mismos en pro de com-partir la experiencia en vivo en su faceta másdivulgativa, con los avances y apuestas tec-nológicas más recientes impartidas directa-mente por sus principales protagonistas enlos equipos de desarrollo de Microsoft.

Durante cuatro días tenemos la opor-tunidad de unirnos a un tour relámpagorecorriendo Barcelona (Vic/Igualada),Tarragona, Valencia, Alicante (Albace-te/Murcia) para llegar finalmente a Madrid.

Serán eventos eminentemente técnicos,impartidos en inglés, divididos en dos sesio-nes con una duración total de 3 horas. Encada sesión intentaremos abordar lo másrelevante del IDE de Visual Studio desdesu versión 2005 sin obviar lo que ya se cue-ce para la versión del 2010, intentando enfo-car en todo momento el contenido a su ver-tiente más práctica. Finalmente podremosprofundizar en el lenguaje con los aspectosmás interesantes y nuevas características delVisual Basic y su compilador.

Tampoco debemos olvidarnos de lagran oportunidad de interactuar con nues-tras opiniones e inquietudes llegando real-mente a las personas que están definien-do el producto.

Como todas las actividades realizadaspor los grupos de desarrolladores, la asis-tencia es gratuita, aunque por caracterís-ticas de aforo de las salas, las plazas sonlimitadas. Si eres programador en C#, esteevento también es interesante para ti,puesto que aparte del IDE se compartenmuchísimas similitudes con Visual Basic,al fin y al cabo en tono de humor… seráuna buena oportunidad para olvidartedurante un par de horas del punto y coma.

En resumen, una gran cita para todoslos que nos relacionamos con esta grancomunidad.

Spain.NET

Page 8: dotNetManía · nº 53 noviembre 2008 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX • Silverlight • .NET Framework dotNetManía LINQ to SQL y N-Capas: esto es

El pasado día 16 de octubre se celebró en lossalones del hotel Velada de Madrid el eventoALM Sessions 2008, el primer evento de undía completo que se celebra en España sobre elCiclo de vida del software (ALM) y Visual Stu-dio Team System. Con tres tracks paralelos,dedicados a procesos, integración y herramien-tas, keynotes presentadas por ponentes de la talla

de Ivar Jacobson, y una amplia asistencia depúblico, puede decirse que el evento fue un éxi-to total.

Más de 400 asistentes y 18 charlas, incluyen-do las keynotes: algo sencillamente increíble paraeste primer evento alrededor del ALM de Micro-soft. Esto me hace pensar que definitivamentealgo está cambiando en relación con el procesode desarrollo de software, y que cada vez se pres-ta una mayor atención a los procesos de desa-rrollo y a herramientas como Visual Studio TeamSystem.

El día comenzó con la presentación del even-to, que corrió a cargo de Antonio Gómez yEnrique Fernández, del departamento DPE deMicrosoft. En ella pudimos contar con el pri-mero de los varios invitados de excepción: Pie-rre Liautaud, vicepresidente de Microsoft parael área de Europa Occidental. En esta presenta-ción se nos describió cómo iba a ser la jornadade evento, bajo el título “Soluciones en tiemposde oportunidad”, y se nos presentó a Visual Stu-dio Team System como una solución global degestión y desarrollo para el ciclo de vida del desa-rrollo de software.

ALM Sessions 2008

eventos

<<

event

os

Gil Taran

Ivar Jacobson

Page 9: dotNetManía · nº 53 noviembre 2008 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX • Silverlight • .NET Framework dotNetManía LINQ to SQL y N-Capas: esto es

dotN

etM

anía

<<

9

dnm.directo.eventos<<

A continuación, comenzó lapresentación de contenidos porparte de los distintos ponentes ypatrocinadores –más de 20 empre-sas que participaban en el evento–,divididos en tres tracks para poderdar cobertura a los distintos inte-reses de los asistentes. Así tuvimosun track de procesos, dedicado atemas relacionados con metodo-logías y gestión; otro track de inte-gración, en el que pudimos verejemplos de integración de VisualStudio Team System tanto conotras herramientas de Microsoftcomo SharePoint, Biztalk o EPM,como con otros sistemas, por ejem-plo basados en Java; y por último,un track dedicado a las herramien-tas de Team System, con temasrelacionados tanto con la utiliza-ción de estas herramientas comocon ejemplos prácticos de su apli-cación en empresas.

Después de esta primera tandade sesiones vino otro de los platosfuertes del día: la conferenciamagistral de Ivar Jacobson, que noshabló acerca de “ser inteligentes”(Be Smart). Aquí nos contó princi-palmente cómo debemos ser inte-ligentes a la hora de aplicar lasmetodologías en nuestros proce-sos, escogiendo bien las prácticasa aplicar y adaptando los procesosa nuestras necesidades, y no porello abandonando los principiosfundamentales y necesarios de las

metodologías que apliquemos. Enla entrevista de este mes puede leermás al respecto.

Tras otra tanda de sesiones acargo de varios partners, tuvimosotra keynote, esta vez a cargo delprofesor Gil Taran, de la univer-sidad Carnegie-Mellon. En estainteresante sesión pudimos apren-der un poco más acerca de cómorealizar en el marco de nuestrosproyectos una gestión de riesgosefectiva, así como de la enormeimportancia de ésta para el éxitode los proyectos.

El evento finalizó con una nue-va tanda de charlas en los trestracks, para cerrar con broche deoro el primer evento completosobre ALM que se organiza enEspaña.

Es importante destacar que,dado que todas las ponencias dura-ron alrededor de cincuenta minu-tos, un tiempo que generalmentese queda un poco corto para todolo que hay que contar, estas ponen-cias han servido de introducciónpara los workshops de varias horasde duración que se van a organizaracerca de los contenidos corres-pondientes. El listado completo deestos workshops y sus fechas plani-ficadas pueden consultarse en:http://www.microsoft.com/spa-nish/msdn/spain/eventos/alm/workshops.mspx.

Y bueno, nada más que decirsobre este primer evento. ¡Nosvemos en ALM Sessions 2009!

Texto: Luis Fraile

Workshop sobre gestión de riesgos

Como actividad previa al eventoALM Sessions 2008, el día 15 deoctubre tuvo lugar un workshopintensivo sobre "Gestión de ries-gos en proyectos de software",impartido por los profesores GilTaran, de la Universidad Carnegie-Mellon y Paulo Marques, de la Uni-versidad de Coimbra. A lo largode esta interesante jornada se tra-taron múltiples temas relaciona-dos con la identificación, evalua-ción y priorización de los riesgosasociados a la ejecución de losproyectos de software.

Gil Taran, en unmomento de su

intervención

Los responsables del evento

Page 10: dotNetManía · nº 53 noviembre 2008 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX • Silverlight • .NET Framework dotNetManía LINQ to SQL y N-Capas: esto es

Está claro que el mundo del diseño, la interacción y la expe-riencia de usuario está viviendo uno de sus mejores momentos encuanto a la integración de la Web y el software en dispositivos deconsumo. Por este motivo, es frecuente encontrar –cada día más–eventos relacionados con esta temática en el sector.

Los pasados 15, 16 y 17 de octubre se celebró en Lisboa la 2ªedición de SHiFT, un evento donde la interacción y la experien-cia de usuario eran las protagonistas. Las jornadas se dividieron endos días de presentaciones y workshops.

Entre el primer día del evento, dedicado a workshops, destaca-ron “Guerrilla Usability Testing”, por Andy Budd, co-fundadorde Clearleft, y “Arduino: Open Technologies”, por Nick Weldin,del Rix Centre, donde pudimos observar desde un análisis de fun-cionalidad de un sacacorchos, en la primera, hasta la construcciónhardware de elementos de interacción con el entorno, en la segun-da. Además, de la mano de la subsidiaria portuguesa de Microsoft,se ofrecieron dos workshops que pretendían acercar a los diseñado-res al mundo de Silverlight. El primero de ellos, “Silverlight forDesigners”, por Jeff Ausura, de Aquent Boston, y el segundo “ADeepZoom Primer”, por Miguel Jiménez de Madrid.

Durante los dos días de contenido se pudo asistir a sesionescomo “Designing the User Experience Curve”, por Andy Budd,

“Tapping the Mainline”, por Mike Stenhouse, “Designing withCommon Sense”, por Nick Cristea & Sanky de AllOfUs,“Making Whuffie”, por Tara Hunt de Citizen Agency, “WhyEvery Company Should Be a RockBand”, por Henriette Weber,“Guten Touch to Natural Interaction”, por Multitouch Barce-lona, “Visual Complexity”, por Manuel Lima y “A Design Visionfor Microsoft Surface”, por Lisa C. Anderson. Evidentemente,esto no fue todo; muchas más sesiones y contenido generado porlos asistentes se presentaron en estos días, generando mucha con-versación y un sinfín de ideas que germinar.

La organización del evento fue ejemplar, no solo en la conse-cución eficaz y sin retraso de las sesiones, y la elección de los ponen-tes, sino también en la experiencia de usuario generada en torno alos asistentes. Se cuidó hasta el último detalle que se entregaba:todos los “obsequios” estaban etiquetados de manera personal, amano, con el nombre del asistente; el primer día obsequiaron conuna tableta de chocolate personalizada y el segundo, con un kit desemillas de girasol para “difundir” la palabra; el kit de bienvenidaincluía, además, un globo sobre el que escribir y colocarlo en laWelcome Wall junto a los del resto de asistentes.; y por último,muchos puntos de interacción como un sofá con USB habilitadopara compartir cosas “porque sí”.

SHiFT’08 Social and Human Ideas For Technology

eventoseve

ntos

La cita anual con los estándares y tecnologías Web en España secelebra en Gijón y es conocida como Fundamentos Web. Esteaño, por primera vez, me planteé asistir a este evento y compro-bar qué se “cocía” en el mundillo. Con grandes expectativas gene-radas a raíz de los speakers invitados y los temas a tratar, los días 27y 28 de octubre se celebraron las jornadas en la ciudad asturiana.

El primer día del evento, de los dos existentes, la alcaldesa deGijón acompañada de la directora general de tecnología del Gobier-no del Principado dieron por inauguradas las jornadas con un dis-curso sobre la importancia de los estandares y las tecnologías Webpara los aplicativos de gobierno electrónico. Inmediatamente des-pués, Jesse James Garret, de Adaptive Path, conocido por acuñarel término AJAX, introdujo los conceptos esenciales de la expe-riencia de usuario y sobre cómo las startups de la Web 2.0 inten-tan mejorar dicha experiencia, basándose en user-centred design enlugar de funcionalidad. Posteriormente, también proveniente deSan Francisco, Eric Fain introdujo a la audiencia al mundo de losmodelos mentales, ideas preconcebidas y comportamiento de usua-rios que determinan su visión sobre productos y servicios. Lassesiones de la mañana las completaron dos tracks paralelos, sobreCMS y ARIA, respectivamente, donde personalidades como Char-les McCathieNeville, Dries Buytaert, Wilco Janses y Alejan-

dro Alves discutieron por un lado sobre Drupal y Joomla, y porotro lado Steve Faulkner y Becky Gibson, introdujeron la acce-sibilidad para aplicaciones RIA con ARIA.

La tarde del primer día comenzó con una mesa redonda sobrela situación laboral del mercado dirigida por Jesús Gorritiy con JoséFlorido, de Google, Ariel Guersenzvaig, Humberto Matas, deDNX, Manuel Muñoz de The Cocktail y Daniel Torres Burielconversaron sobre el estado laboral y sus experiencias con el públi-co a través de la voz, twitter y backnoise. Una conversación sumamenteinteresante donde se extrajo que la mayoría de los asistentes trabaja-ban para la administración, en empresas de 10 a 50 empleados y enpequeñas ciudades. Para finalizar la ronda de sesiones, una intro-ducción por Carlos Guardián a los medios sociales y la identidadonline, aplicada sobre todo a administraciones públicas y empresas.

El plato fuerte del evento fueron los dos talleres celebrados elsegundo día, donde por un lado Peter-Paul Koch introdujo a losasistentes al mundo de la interacción con JavaScript a través de“Unobstrusive Ajax in a Real-World”, y por otro, Eric Fain, pro-puso un taller denominado “Mental Models: Aligning Design Stra-tety with Human Behavior” donde se analizaban las formas dediseñar con los modelos mentales de interacción creados a partirde usuarios reales.

Fundamentos Web 2008

Miguel Jiménez

Miguel Jiménez esUser Experience

Advisor y está reco-nocido como MVP

por Microsoft. Cola-bora frecuentemente

como speaker en conferencias locales e

internacionales ymantiene un blog

relacionado enmigueljimenez.net

Page 11: dotNetManía · nº 53 noviembre 2008 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX • Silverlight • .NET Framework dotNetManía LINQ to SQL y N-Capas: esto es
Page 12: dotNetManía · nº 53 noviembre 2008 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX • Silverlight • .NET Framework dotNetManía LINQ to SQL y N-Capas: esto es

Ante todo, decir que es un tremendo honor paranosotros tener la oportunidad de entrevistar atoda una leyenda del desarrollo del softwarecomo usted. Y aunque difícilmente alguien ennuestro mundillo no sepa quién es Ivar Jacob-son, tenemos la costumbre de pedirle a nuestroentrevistado que se presente ante los lectores.En pocas palabras, ¿quién es Ivar Jacobson?

Bueno, hay muchas cosas que podría mencionar.Pero creo que lo más importante es hablar de lo queestoy haciendo hoy y de lo que vengo a hablar eneste evento. Soy alguien a quien no le gusta volversobre los caminos ya trillados; si algo se ha hechopopular o ha sido ampliamente aceptado, por lo gene-ral yo prefiero apartarme y dejar a otros que se dedi-quen a eso, para centrarme en nuevas vías de inves-

Luis Frailees MVP de Team

System y colaboraactivamente en

MAD.NUG (grupode usuarios de

.NET de Madrid).Actualmente es

director técnico enMultidomo

Network. Puedecon sul tar su blog en

www.lfraile.net.

Octavio Hernándezes MVP de C#

desde 2004, MCSDy MCT. Autor de

los libros “C# 3.0 yLINQ" y

"ADO.NET EntityFramework: Aplica-

ciones y servicioscentrados en

datos" (con UUnaiZorrilla y EEduardo

Quintás).

entrevista

Chairman & CTO, Ivar Jacobson Internationalentrevista a Ivar Jacobson

En ocasión de celebrarseen Madrid el evento ALMSessions 2008 el pasado 16de octubre, tuvimos la oca-sión única de charlar contoda una leyenda viva de laingeniería de software, IvarJacobson.

Luis FraileOctavio Hernández

Page 13: dotNetManía · nº 53 noviembre 2008 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX • Silverlight • .NET Framework dotNetManía LINQ to SQL y N-Capas: esto es

tigación. Hace tiempo que no hablo decasos de uso, ingeniería de procesos,UML o desarrollo basado en compo-nentes, sin hablar ya de modelos de nego-cio, a los que he dedicado bastantesesfuerzos en el pasado. Todo eso ha sidoampliamente aceptado a día de hoy, y enmi empresa (Ivar Jacobson Internatio-nal) tengo a unas 60 personas que danconsultoría sobre esos temas. Hace cin-co o seis años, comencé a interesarme porlas maneras en que llevamos a cabo losprocesos; actualmente se habla mucho deeso: RUP, Scrum, Agile, Extreme Pro-gramming, o los aportes de Microsoft enestas áreas, como MSF Agile o MSFCMMI. Yo pienso que todas esas meto-dologías, adoptadas de manera individual,son fundamentalmente erróneas; se trans-forman en una especie de dogma monolí-tico, de forma que si no haces A, B y C,todo a la vez, no estás aplicándolas correc-tamente. No había una solución que per-mitiera coger algo de aquí, algo de allá yaplicarlo de una manera conjunta. En2003, presenté una keynote en la XP Con-ference de Nueva Orleans y allí hablé porprimera vez de un nuevo concepto quehemos dado en llamar práctica (términoque, por otra parte, viene utilizándosedesde hace muchos años en el mundo delsoftware). El elemento novedoso en nues-tro concepto de práctica es su definicióncomo algo que uno puede mantener sepa-rado, para luego componerlas según lasnecesidades en un momento determina-do. Si se analiza bien, todas estas meto-dologías famosas no son más que un con-junto de prácticas, con la excepción deuna: Scrum. Scrum es básicamente unaúnica práctica, relacionada con la gestiónde proyectos. Pienso que es por eso esque Scrum se ha hecho tan popular: seorienta hacia única cosa, y es bueno enello. Se puede combinar Scrum con casosde uso, con historias de usuarios, inclusocon CMMI. El problema es que unoencuentra tantas buenas prácticas, pro-venientes de diferentes fuentes y lugaresdel mundo… Mi idea es la de identificarestas prácticas, y definirlas por separadopero teniendo como objetivo central la

posibilidad de combinación, siempre conla idea central de no empezar nunca decero: todo desarrollador o equipo de desa-rrollo de software tiene una experienciaque contar y en la que apoyarse. Así queun equipo debe detectar los problemas aresolver, y diseñar su solución compo-niendo su manera habitual de trabajar conla aplicación de prácticas destinadas aresolver esos problemas. De este modo,con el tiempo nuestra manera de traba-jar se va mejorando. Esa es la idea prin-cipal, y creo que esto es tan importantecomo cualquier otra cosa que yo hayahecho anteriormente, ya sea en arquitec-tura, casos de uso o componentes, y estádestinada a cambiar nuestra visión de lamanera en que hacemos software. Yagrandes empresas como IBM están cam-biando sus metodologías para incorporarexplícitamente el concepto de práctica.También debo decir que creo que Micro-soft escucha mis ideas y las apoya.Por supuesto, el concepto de prácticase refleja en las características incor-poradas a Visual Studio Team System;se puede combinar MSF Agile oCMMI con Scrum u otras prácticas.

En principio sí; pero un problema queaún persiste es que a veces no es fácil com-poner fácilmente las prácticas dentro deun marco metodológico determinado.Nosotros hemos creado una plataforma

(EssWork), que se integra excelente-mente con VSTS, en la que se identifi-can por separado un montón de prácti-cas (incluso prácticas provenientes deMSF Agile o MSF CMMI) para luegoutilizarlas de manera conjunta. Tambiénse pueden combinar estas prácticas conla manera actual de trabajar de un equi-po. Y lo interesante es que esta combi-nación se puede hacer a todo lo largo delproceso de desarrollo. En un estadio muytemprano del trabajo se identifican lasactividades y artefactos, y a partir de ellosse alimenta consecuentemente la base dedatos de work items de VSTS. Pero entodo momento el enlace es bidireccional,y por ejemplo para identificar las prácti-cas mapeadas se puede volver de VSTSa EssWork. Son dos productos comple-mentarios y que no se solapan, y tenemosvarios clientes que utilizan tecnologíasMicrosoft y están encantados con nues-tras ideas y su implementación en Ess-Work y VSTS.¿Qué piensa usted sobre el crecienteinterés que vienen despertando lasherramientas ALM en el mundo deldesarrollo basado en herramientasMicrosoft?

Pienso que es una gran cosa. Es algoque la comunidad de desarrolladores deMicrosoft estaba necesitando desde hacíabastante tiempo. Básicamente, hay dos

dotN

etM

anía

<<

13

dnm.directo.entrevista<<

Page 14: dotNetManía · nº 53 noviembre 2008 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX • Silverlight • .NET Framework dotNetManía LINQ to SQL y N-Capas: esto es

dotN

etM

anía

<<

14

dnm.directo.entrevista<<

grandes fabricantes de software en el mun-do. Uno de los mayores problemas que veoen la industria del software y sobre el quehe venido hablando desde hace muchotiempo es que si alguien se decanta por unaherramienta de uno de estos fabricantes,cae en una prisión de la que difícilmentepodrá escapar. Las grandes consultorascomo Accenture, Cap Gemini, etc. tienenuna división para dar soporte al desarrollocon las herramientas de un fabricante, yotra división para las herramientas del otro.Hoy prácticamente en el mismo momen-to en que se comienza a pensar en un pro-yecto hay que decantarse por las herra-mientas de un fabricante u otro. Aspectostan genéricos como la arquitectura, eldiseño, la gestión de requisitos, el análisisde casos de uso y las pruebas hoy depen-den innecesariamente del lado del campoen el que te has colocado. Mi sueño es queen el futuro esas decisiones se tomen sola-mente a un nivel muchísimo más bajo.Pienso que eso llegará, aunque aún faltatiempo. Nuestro enfoque actual se basa,por supuesto, en permitir la ejecución detodo el conjunto de prácticas soportadasen todas las plataformas disponibles. Hablando de herramientas, ¿cómo veusted el “estado del arte” de los pro-ductos para la gestión del ciclo de vidadel software, como VSTS o Jazz deIBM-Rational?

Hace diez años yo pensaba que está-bamos más cerca de disponer de buenasherramientas. En mi propia empresa desa-rrollé entonces un producto (llamadoObjectory) que permitía gestionar de unamanera integrada desde los requisitos has-ta las pruebas. Esa herramienta fue aban-donada cuando Rational adquirió miempresa, y conozco a mucha gente (inclui-da gente de Microsoft, como RandyMiller, el artífice de MSF y MSF for Agi-le) que piensa y ha dicho públicamente queabandonar aquel gran producto no fue unabuena idea. En cualquier caso, pienso quela industria de las herramientas se ha ralen-tizado a lo largo de los últimos años. Miconferencia de hoy se llama “Be Smart”, ypienso que es inteligente de mi parte nohablar hoy de las herramientas de hoy. Pero

cuando veo hoy tantas herramientas exi-tosas provenientes del mundo open source yde pequeñas empresas, pienso que no esque sean mejores que las herramientas delos grandes fabricantes, sino que son más“consumibles”: más fáciles de utilizar porsus usuarios, incluyendo aquellos que nun-ca han usado herramientas (que son lamayoría). De hecho, muchas grandesempresas se hacen cargo de esas herra-mientas; pero tan pronto empiezan a“hacerlas engordar” aparecen los proble-mas. Si volvemos la vista hacia principiosde los 80 y analizamos el enorme éxito deMicrosoft en aquella época, nos daremoscuenta de que de eso se trataba: eran pro-ductos con ciertas limitaciones, pero fáci-les de utilizar. Este fenómeno continúa pro-duciéndose. Creo que el error que hemoscometido en la industria de las herra-mientas es que hemos creado productosque son buenos para nosotros los exper-tos, pero difíciles de asimilar para los demás.Nuestras nuevas herramientas deberían sermuy fáciles de usar para los principiantes,y que luego, en la medida en que ese prin-cipiante va ganando habilidades, pueda irutilizando más y más características. Encualquier caso, creo que pasarán aún bas-tantes años antes de que tengamos herra-mientas buenas de verdad. Pero repito quelo más inteligente por mi parte sería nohablar de herramientas :-).Para finalizar, algunas prediccionessobre el futuro…

Bueno, uno de los movimientos másfuertes actualmente es Agile. Original-mente, Agile trataba principalmente sobreingeniería social, sobre la gente, ¡y a la gen-te le gusta que se preocupen por ella! Agi-le es simple, y cualquier joven con un sim-ple título de universidad podía entender-lo (es imposible entender el Proceso Uni-ficado en tales condiciones). Por otro lado,RUP sobrecogía igualmente a la mayorparte de los programadores experimenta-dos. Así que Agile apareció en el momen-to oportuno. Lo que ha ocurrido despuéses que todo lo bueno que ha aparecido enel mundo del software ha sido metido den-tro del cajón “Agile”: el desarrollo iterati-vo, diseño guiado por tests, y cientos de

cosas más. Y todo el que tiene actualmen-te una metodología le añade el sufijo “Agi-le”. Es interesante el hecho de que su cre-ador, Kent Beck, estaba originalmente encontra de la arquitectura; promulgaba larefactorización como alternativa. Variosdefensores de los principios ágiles (encontréuno recientemente en Beijing, en un even-to de IBM-Rational, donde participaba enun panel) siguen diciendo que Agile nodebe hacer arquitectura, con lo que siem-bran confusión y hacen daño al propiomovimiento Agile. Así que Agile se ha con-vertido en una marca y está creciendo, eincluso ciertas partes del Proceso Unifica-do están siendo adoptadas bajo el paraguasAgile. Incluso el significado del término seha ido moviendo hacia los valores que nosguiaban cuando creábamos el Proceso Uni-ficado. Todo esto me reafirma más y másen la necesidad de una vuelta a las cosaspequeñas, y a las prácticas independientesy capaces de ser compuestas de las quehablábamos al principio.Con Agile, existe el peligro de que lagente sin experiencia lea algunos prin-cipios básicos y piense “¡qué maravilla,no hay que definir arquitectura, no hayque escribir documentación!”…

Hay que luchar contra eso. Pero lediré, nosotros hemos cambiado también.La charla que daré hoy es muy diferentea la que habría dado hace seis o siete años.Las ideas originales del movimiento ágilhan influido también sobre mí. Por ejem-plo, con respecto a la documentación, yomismo he usado alguna vez el argumento“Hay que documentar, para que la genteque nos sustituya pueda ponerse al tanto”.¡Pero la realidad es que la gente no lee!Así que nuestra documentación proba-blemente nadie la leerá. Mi enfoque actuales “Hay que documentar, pero con-centrándose en lo esencial”. Otro de losmensajes importantes es el de que hay quecentrarse en lo esencial. Incluso en lo rela-tivo a las prácticas: no intentes aplicarlotodo; ya nosotros lo intentamos con RUP.Céntrate en lo esencial. Y mi definiciónde “esencial” es, más o menos, “unpequeño porcentaje (3-5) de lo que sabeun experto sobre el tema”.

Page 15: dotNetManía · nº 53 noviembre 2008 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX • Silverlight • .NET Framework dotNetManía LINQ to SQL y N-Capas: esto es
Page 16: dotNetManía · nº 53 noviembre 2008 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX • Silverlight • .NET Framework dotNetManía LINQ to SQL y N-Capas: esto es

Tras la aparición de .NET 3.5 SP1, puede parecerdifícil determinar cuál de las opciones de acceso adatos que se nos presentan es la mejor. José Murillo(Microsoft Ibérica) apunta –muy acertadamente queel mismo problema que queramos resolver nos va adecir cuál es la opción que mejor se adapta a ella.

José y yo hemos discutido esto en varias oca-siones. Si tenemos SQL Server como SGBD, unade las causas que nos harán decantarnos por LINQto SQL o LINQ to Entities, por ejemplo, va adepender sobre todo de si tenemos control sobrela base de datos. Otra cosa es que LINQ to Enti-ties implementa perfectamente las relaciones N:Mde las que LINQ to SQL carece. Pero como yanos enseñó Miguel Katrib en el número de mayo,podemos mapear esas relaciones con LINQ toSQL de una manera relativamente simple.

En el desarrollo de cualquier aplicación, esmuy importante saber si vamos a tener controltotal sobre la base de datos que vamos a usar. Siun cambio en la base de datos afecta a nuestraaplicación, más aún va a afectar si no es nuestroequipo el que hace esas modificaciones. Son dosescenarios muy diferentes, y cada uno con solu-ciones también diferentes.

Para el caso en que tengamos el control de labase de datos, de los cambios estructurales que sehagan en ella y si solo necesitamos un modelo físi-co y no lógico (conceptual) de la base de datos,

LINQ to SQL encaja bastante bien, incluso mejorque LINQ to Entities. Digo esto ya que, comoveremos más adelante, vamos a ser capaces degenerar el modelo de datos de LINQ to SQL cadavez que compilemos el proyecto y podremos adap-tar nuestro código al esquema de base de datosque tengamos hasta ese momento en tiempo decompilación, sin esperar a que se ejecuten aque-llas partes del código que sean sensibles a cambiosde la base de datos y la aplicación deje de funcio-nar, teniendo entonces que analizar el porqué deese mal funcionamiento.

Para el segundo caso, en el que no sabemoscuándo se va a modificar algo, necesitamos unaherramienta que nos permita adaptarnos rápida-mente en esos escenarios, tanto a los desarrollado-res como a los encargados de administrar la base dedatos. Aquí es donde encaja mejor LINQ to Enti-ties, con el cual a través de archivos de configura-ción adaptamos nuestro modelo de datos. Esa mis-ma herramienta de modelado es la que deben usarlos que vayan a realizar cambios en la base de datos.

Pero no solo éstas van a ser las causas que haganque nos decantemos por LINQ to SQL o LINQto Entities. Como Unai Zorrilla y OctavioHernández nos vienen contando, tenemos quever si nos va a interesar un mapeo conceptual dela base de datos; por ejemplo, si vamos a querermapear varias entidades en una misma tabla.

LINQ to SQL y N-Capas:esto es amor

plataforma.net

Juan María Laó es Ingenie-ro Técnico en Informática

en Montrel S.A. Desde2004 colabora activamen-

te en el Club .NET deSevilla (http://sevilla.dotnet

clubs.com) participando entalleres, charlas y eventosde desarrollo. Fue nom-

brado Microsoft StudentPartner en 2006 y miem-

bro del equipo ganadorde Imagine Cup 2006

España. Traduce el blog deScott Guthrie al español,en http://thinkingindotnet.

wordpress.com.

En este artículo veremos cómo detectar rápidamente los cambios quese produzcan en la base de datos y ajustar nuestro código al nuevomodelo de datos. Permitiendo aislar aún más las tareas del equipo debase de datos y las del equipo de desarrollo.

Juan María Laó

Page 17: dotNetManía · nº 53 noviembre 2008 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX • Silverlight • .NET Framework dotNetManía LINQ to SQL y N-Capas: esto es

dotN

etM

anía

<<

17

dnm.plataforma.net<<

Hace tiempo que vengo trabajandocon LINQ to SQL y, la verdad, todome habría costado bastante menos sihubiese captado a la primera la idea quese esconde detrás de esta tecnología.Cuando lo pienso me echo a llorar, yaque lo había leído varias docenas deveces en la página sobre cómo “arqui-tecturar” aplicaciones con LINQ toSQL y cuál es su papel dentro de las N-Capas [1].

Verán, el principal problema quetenía era el concepto de las entidadesde negocio. Tanto LINQ to SQL comoLINQ to Entities nos generan un con-junto de entidades que nos mapean labase de datos en objetos. Esas entida-des no pueden ser nunca nuestras enti-dades de negocio. De hecho, nuestrasentidades de negocio deben construir-se en base a esas entidades que nosgeneran LINQ to SQL (o, en su caso,LINQ to Entities), ya que de lo con-trario obtendríamos unas capas fuerte-mente acopladas. La idea es crear nues-tras entidades de negocio en base a lasque nos genera LINQ to SQL, demanera que cualquier cambio que hayaen la base de datos se refleje en las enti-dades de esta capa intermedia de LINQto SQL en tiempo de compilación.

Pongámonos en situación:Vamos a empezar un nuevo pro-

yecto y ya hemos “pasado” la fase derequisitos. Tenemos sobre la mesa lasprimeras especificaciones más o menosinamovibles. No creo que me equivo-que mucho al decir que la capa de acce-so a datos siempre ha sido un primerproblema a resolver. Tenemos muchaexperiencia en el desarrollo de aplica-ciones en capas [2]. Tenemos nuestraslibrerías de acceso a datos, motores depersistencia, herramientas de modela-do que nos generan los esquemas decreación de la base de datos… (una penaque esto sea algo utópico, aunque cadavez menos).

Hemos escuchado cosas sobreLINQ, hecho unas pruebas simplonascon LINQ to SQL, visto presentacio-nes y vídeos, leído documentación, esta-mos esperando impacientes a LINQ toEntities, están desarrollando LINQ toOracle, LINQ to SQLite, LINQ to

MySQL, etc. Además, conocemos desobra el esquema de arquitectura en N-Capas [3] (figura 1).

Hemos visto que con LINQ toSQL conseguimos pasar de un mode-lo relacional a un modelo orientado aobjetos de la base de datos. Para obte-ner este modelo tenemos dos opciones:

1. Usar el diseñador de Visual Studio2008 arrastrando y soltando las tablasque queramos.

2. Generándolo automáticamente todocon la herramienta SqlMetal [4].

En pequeños escenarios en los que labase de datos no va a cambiar mucho,somos los dueños y señores de la base dedatos y no tenemos muchas tablas (#defi-ne muchas_tablas =10), podremos apro-vechar muy mucho las facilidades de estediseñador gráfico; añadir campos, rela-ciones entre las entidades, etc. Pero debe-mos tener en cuenta que con cualquiercambio en la base de datos, cambiaría esteesquema. En un escenario como he des-crito antes, este proceso no solo no es cos-toso, sino que es muy aconsejable. Inclu-so puede llegar a ser útil usar las entida-des que se generan como entidades denuestro negocio.

Sin embargo, en escenarios, si mepermitís, más generales, más complejosy con más tablas, tendremos que decan-tarnos por la segunda opción. Con Sql-

Metal obtendremos un mapeado com-pleto de la base de datos en un abrir ycerrar de ojos. A partir de aquí, todas las

cosas que queramos añadir a este mode-lo las implementaremos en clases par-ciales, consiguiendo así separar total-mente el modelo físico y relacional dela base de datos del modelo de objetosque nos ha generado la herramienta. Yconstruir a partir de aquí las demás capasde nuestro sistema, las entidades denuestro negocio entre otras.

Figura 1

Figura 2

Page 18: dotNetManía · nº 53 noviembre 2008 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX • Silverlight • .NET Framework dotNetManía LINQ to SQL y N-Capas: esto es

dotN

etM

anía

<<

18

dnm.plataforma.net<<

Lo interesante es añadir la sentencia de SqlMetalque ejecutaremos en los eventos de precompilaciónde un proyecto de librería de clases. Para ello, nosvamos a las propiedades del proyecto en el que que-ramos modelar la base de datos (figura 2). Esto nosmostrará la ventana de Propiedades del proyecto (figu-ra 3). Ahora tendremos que ir a los eventos de com-pilación (1); editamos las opciones de precompilación(2) e insertamos la sentencia que hará que SqlMetalgenere el modelo de datos (3).

De esta manera, obtenemos un archivo quehemos llamado Northwind.cs en el directorio delproyecto, $(ProjectDir) (4). Solo nos queda incluireste archivo en nuestro proyecto. En el Exploradorde soluciones (figura 4) indicamos que se muestrentodos los archivos (1) e incluimos este archivo en elproyecto (2).

A partir de este momento, tenemos un proyectoen la solución que cada vez que se compile generaráel mapeo de la base de datos.

Conceptualmente, tenemos un componente de acce-so a datos autogenerado y actualizable. Es decir, cadavez que compilemos se reflejarán los cambios que hayahabido en la base de datos. Además, con clases parcia-les podremos extender este modelo de la manera que

Figura 3

Debemos incluir en la variable de entornoPATH el directorio en el que se encuentraSqlMetal. Este directorio es \ProgramFiles\Microsoft SDKs\Windows\vn.nn\bin.[ ]

NOTA

Figura 4

Page 19: dotNetManía · nº 53 noviembre 2008 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX • Silverlight • .NET Framework dotNetManía LINQ to SQL y N-Capas: esto es

dotN

etM

anía

<<

19

dnm.plataforma.net<<

queramos. Sobre esta capa intermedia crearemos todaslas demás de nuestro sistema.

Ahora queda crear las entidades de negocio en baseal modelo que hemos obtenido con LINQ to SQL. Agre-garemos a la solución un nuevo proyecto, que podría-mos llamar Negocio.Entidades (figura 5). Y tendremosque añadir una referencia al proyecto CapaIntermediapara poder acceder al modelo que hemos generado.

Ahora añadiremos la clase Empleado, que tendráuna variable privada del tipo ModeloDatos.Employees,que contendrá el mapeo de la tabla con el mismo nom-bre de la base de datos Northwind (figura 6). Y enton-ces solo será cuestión de definir las propiedades de estaentidad a las que queremos acceder (figura 7).

Para cada entidad que queramos usar por toda laarquitectura de nuestro sistema deberemos crear estetipo de clase.

La primera ventaja que se puede observar claramenteen esta arquitectura es que cualquier modificación en labase de datos (por ejemplo, el cambio en el nombre deuna columna de una tabla), se reflejará inmediatamenteen el código. Si hemos hecho referencia a esa columnaen alguna parte de nuestro código, el compilador nosavisará de que el campo antiguo ya no existe, evitándo-nos así tener que buscar entre todo el código a mano (==buscar/reemplazar). Pero lo mejor de todo es que esextensible, con las clases parciales que podremos añadiral proyecto CapaIntermedia para, por ejemplo, crearnosmapeos de relaciones N:M (una “pequeña” carencia deLINQ to SQL), como se ha descrito en el artículo deMiguel Katrib en el número de mayo.

A partir de aquí es con lo que seguimos el desa-rrollo de N-Capas. Las entidades que se han genera-do mapean físicamente a la base de datos. No debe-mos confundirnos y cometer el error de usar estas

entidades que genera LINQ to SQL como las enti-dades de negocio, ya que de esta forma lo que ten-dremos son entidades de la base de datos viajando portoda la arquitectura y no es ése el objetivo; sino a par-tir de este modelo, crear nuestras entidades de nego-cio. Y son éstas últimas con las que deberemos tra-bajar en todas las demás capas.

Hope this helps.toH tlhIngan Hol DajatlhlaH ‘e’ DaneH’a’?

Figura 5

Figura 7

Figura 6

BibliografíaAplicaciones remotas y de n niveles con LINQ to SQL,http://msdn.microsoft.com/es-es/library/bb882661.aspx.

Microsoft Patterns & Practices, http://msdn.microsoft.com/en-us/library/ms998572.aspx.

Application Architecture for .NET: Designing Applications andServices, http://msdn.microsoft.com/en-us/library/ms954595.aspx.

Herramienta SqlMetal, http://msdn.microsoft.com/es-es/library/bb386987.aspx.

[1]

[2]

[3]

[4]

Page 20: dotNetManía · nº 53 noviembre 2008 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX • Silverlight • .NET Framework dotNetManía LINQ to SQL y N-Capas: esto es

Ludwig Leonard,Miguel Katrib

Esquemas de modelaciónExisten diversos esquemas (representation schemes)para crear y almacenar un modelo. Estos esquemasdifieren en la forma en que se representa un cuerposólido, que puede ser por la descripción matemáti-ca de un volumen o mediante sus superficies. Otroaspecto en el que los esquemas pueden ser diferen-tes es si el modelo describe las propiedades geomé-tricas y topológicas o si es necesario un procesamientopara determinar dichas propiedades. La representa-ción del modelo puede referirse al propio modelo odescribir operaciones de subdivisión del espacio enque el modelo se ubica para determinar la forma delmismo (como es por ejemplo el caso de una repre-sentación con un Octree). Algunos de estos esque-mas son:• Construction Solid Geometry (CSG): permite

la creación de sólidos mediante operaciones deconjuntos (Unión, Intersección, Diferencia) a par-tir de un grupo de cuerpos primitivos básicoscomo son esferas, cubos, cilindros, conos.

• Octree: representa los sólidos mediante subdi-visiones en cubos del espacio tridimensional.

• Instancing: representación mediante primiti-vas paramétricas.

• Function Representation: representación delos sólidos mediante funciones.

• Boundary Representation: representación delos sólidos mediante sus superficies.

En la mayoría de los casos, lo que interesa visua-lizar de un objeto es su superficie, de ahí que elesquema B-Rep1 sea de los más comúnmente uti-lizados en los gráficos por computadora.

El B-Rep se basa en describir los “infinitos” pun-tos que forman parte de una superficie a partir de unconjunto finito de puntos que sirven de partida paragenerar la misma. Por ejemplo, un triángulo se des-cribe a partir de 3 puntos, una malla poligonal for-mada por muchos triángulos puede servir de des-cripción suficientemente aproximada de un sólido.

En la representación B-Rep las superficies cur-vas se logran mediante aproximaciones usandomallas poligonales. Para ello se utilizan diversosalgoritmos de subdivisión de superficies que seránabordados más adelante.

Modelación tridimensional en DirectX y WPF

plataforma.net

Miguel Katrib es doctor yprofesor jefe de programa-ción del departamento de

Ciencia de la Computa-ción de la Universidad de

La Habana. Miguel es líderdel grupo WEBOO, dedi-

cado a la orientación aobjetos y la programaciónen la Web. Es redactor de

dotNetManía.Ludwig Leonard es instruc-

tor de programación deldepartamento de Cienciade la Computación de la

Universidad de La Habana.Es desarrollador y diseña-

dor del grupo WEBOOespecializado en

graficación.

En un artículo anterior [1] se vió cómo se manifiestan los conceptos bási-cos para el proceso de graficación tridimensional y cómo se manifiestanéstos en DirectX y WPF. En este trabajo abordaremos la modelación tridi-mensional que es el proceso mediante el cual se define matemáticamentela descripción de cómo se ve un cuerpo en el espacio desde un punto deobservación. Mediante un modelo quedan descritas las propiedades topoló -gicas (aquellas que definen la estructura fundamental del objeto, como elcaso de sus superficies, y que son invariantes ante cualquier transforma-ción) y las propiedades geométricas (aquellas que describen la figura demanera precisa según un sistema de coordenadas).

1 Boundary Representation

Page 21: dotNetManía · nº 53 noviembre 2008 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX • Silverlight • .NET Framework dotNetManía LINQ to SQL y N-Capas: esto es

dotN

etM

anía

<<

21

dnm.plataforma.net<<

Modelación en Direct3D

En el conjunto de bibliotecas deDirectX se incluye una que es la encar-gada de la generación, visualización einteracción de gráficos tridimensiona-les, la componente Direct3D.

En la representación por superficies,el sólido u objeto que se quiere visuali-zar es definido por sus superficies y estasa su vez por sus vértices. Un vértice esel elemento básico para la representa-ción, con los cuales pueden ser descri-tos puntos, segmentos, triángulos y apartir de estos, cuerpos.

En Direct3D las superficies puedenser descritas mediante triángulos forma-dos por los vértices llamados primitivas,o usando estructuras especiales de mode-lación como son las mallas (conjunto devértices conectados para formar triángu-los) o los patches (conjunto de vérticesde control que son usados para generarsuperficies curvas de Bézier o B-Spline).

Para cada punto de la superficie nosólo interesa la propiedad de su posi-ción sino información relativa a la nor-mal de la superficie en dicho punto (paradeterminar cómo influye la luz en lasuperficie alrededor del punto), color(color reflejado por la superficie endicho punto), coordenada de textura(para poder mapear una textura sobre lasuperficie) entre otras informacionesmás específicas de la API de Direct3D(Specular, Transformed [6]).

Vértices

En Direct3D toda la información delos vértices que forman parte de la visua-lización de una primitiva, malla o patch esenviada al dispositivo (una instancia deltipo Device) previo al procesamiento.

Para lograr un mejor rendimientodurante el proceso de visualización,Direct3D permite suprimir alguna queotra información referente a cada vérti-ce. Por ejemplo: si se desea visualizar unamodelo sin usar texturas no es necesa-rio enviar para cada vértice la coorde-nada de textura, lo que ahorra memoriaen el dispositivo gráfico y tiempo duran-te el procesamiento gráfico. El progra-mador puede lograr esto definiendo el

vértice de manera personalizada y “des-cribiendo” el vértice en el device para queel mismo sepa qué información viene enel flujo de vértices y de esta maneradetecte el rango de bytes que se refierena la posición, cuál al color, etc. El lista-do1 define una estructura para almace-nar un vértice con información referen-te solo a posición y color.

En la biblioteca están predefinidos ungrupo de vértices como estructuras inter-nas de la clase CustomVertex. El códigodel listado 1 es equivalente a la estructu-ra predefinida CustomVertex.Positio-nedColored.

Todos los vértices de la superficie quese visualizará se pasan al dispositivo grá-fico a través del método Device.SetS-treamSource que recibe una instancia dela clase VertexBuffer. Esta clase permi-te almacenar no sólo los vértices sino

información acerca del formato de losvértices almacenados y el número debytes que ocupa cada uno.

Para acceder a los vértices almacena-dos en el VertexBuffer se pueden usar losmétodos Lock y Unlock. El primerodevuelve un array correspondiendo al buf-fer de vértices. El segundo salva el arrayactualizando los vértices en el buffer ori-ginal. Por último se pasa el buffer al dis-positivo y se dibuja una primitiva gráfica.

Primitivas básicas

El modo más fácil de visualizar unasuperficie en Direct3D es haciendo usode las primitivas gráficas básicas quebrinda esta API. En Direct3D es posi-ble visualizar un conjunto de primitivasbásicas a partir de una secuencia de vér-tices como se muestra en la figura 1.

struct PositionColoredFVF{

// almacena la posiciónpublic readonly Vector3 Position;// almacena el color del vérticepublic readonly int Color;public const VertexFormats Format = VertexFormats.Position |

VertexFormats.Diffuse;public PositionColoredFVF (float x, float y, float z, Color color){

this.Position = new Vector3(x, y, z);this.Color = color.ToA rgb ();

}}

Listado1. Estructura para almacenar un vértice con información referente a su posición y color.

Figura1. Primitivas gráficas en Direct3D

Page 22: dotNetManía · nº 53 noviembre 2008 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX • Silverlight • .NET Framework dotNetManía LINQ to SQL y N-Capas: esto es

dotN

etM

anía

<<

22

dnm.plataforma.net<<

Existen varias formas de visualizaruna primitiva en el device. Una de ellases alojar el buffer de vértices en el dis-positivo antes de visualizar la primiti-va, de lo contrario, se puede enviar elbuffer de vértice en el momento en quese dibuja la primitiva pero esto impli-ca un mayor gasto de recursos ya quecada vez que se utilice el flujo de vér-tices hay que transportar éste hacia eldispositivo. Para graficar una primiti-va usando vértices almacenados en lamemoria del usuario y no del disposi-tivo se usan los métodos Device.Dra-wUserPrimitive y Device.DrawIndexe-dUserPrimitives.

Otra forma de visualizar una primi-tiva es usando índices. Si no se usan índi-

ces los vértices son tomados en el ordenen que aparecen en el VertexBuffer, delo contrario se usa una secuencia de índi-ces almacenados en un buffer (IndexBuf-fer) para determinar el i-ésimo vértice queforma parte de la primitiva. La figura 2muestra cómo funciona el buffer de índi-ces y como es visualizado un cuadradomediante la primitiva PrimitiveType.TriangleList y usando 4 vértices.

El listado 2 muestra la creación de unVertexBuffer, la asignación de sus vérti-ces y el uso del IndexBuffer para graficarprimitivas usando vértices indexados.

Primitivas de Orden Superior

Con las primitivas que se vieron ante-riormente pueden ser modelados objetossimples, mayormente objetos con super-ficies planas. Sin embargo, para lograruna superficie curva el programadortendría que aproximar usando un grannúmero de triángulos con menor área.Una solución a este problema está dadapor lo que se conoce como primitivas deorden superior. Las primitivas de ordensuperior permiten generar superficies par-tiendo de puntos que definen la “forma”que tiene la superficie y luego se generaautomáticamente los puntos y triángulosque forman la superfiscie mediante unmétodo conocido como Tessellation2.

Estas curvas están implícitas en unafunción que permite obtener un puntode la curva para un valor entre 0 y 1 o unpunto de la superficie para un valor entre(0,0) y (1,1). Entre estas curvas se puedenombrar las curvas de Bézier, los B-Spli-ne y los NURBS (ver figura 3).

// Creación de un VertexBuffer para almacenar 4 vertices // de tipo PositionColoredFVFVertexBuffer vb = new VertexBuffer(typeof(PositionColoredFVF), 4, device,

Usage.None, PositionColoredFVF.Format, Pool.Managed);// Se asegura el buffer para escribir los vertices en el.PositionColoredFVF[] vertices = (PositionColoredFVF[])vb.Lock(0, LockFlags.None);vertices[0] = new PositionColoredFVF(-1, 1, 0, Color.Red);vertices[1] = new PositionColoredFVF(1, 1, 0, Color.Green);vertices[2] = new PositionColoredFVF(1, -1, 0, Color.Blue);vertices[3] = new PositionColoredFVF(-1, -1, 0, Color.Yellow);vb.Unlock();// Se dispone el buffer en el devicedevice.SetStreamSource(0, vb, 0);// Creación del buffer de los indicesIndexBuffer ib = new IndexBuffer(typeof(int), 6, device,

Usage.None, Pool.Default);// Se copian los indices para el bufferint[] indexes = (int[])ib.Lock(0, LockFlags.None);new int[] { 0, 1, 2, 0, 2, 3 }.CopyTo(indexes, 0);ib.Unlock();// Se dispone el buffer de indices en el devicedevice.Indices = ib;// Se le indica al device el formato de vértice que usarádevice.VertexFormat = PositionColoredFVF.Format;// Se dibuja la primitiva indexadadevice.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, 4, 0, 2);

Listado 2. Visualización de una primitiva usando indexación

Figura2. Uso del IndexBuffer para la visualización de una primitiva.

Figura 3. Superficie de Bézier generada a partir de 16 puntos de control

2 Este tema puede abordarse de manera más detallada en [10] Capítulo 9, Advanced 3D Programming.

Page 23: dotNetManía · nº 53 noviembre 2008 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX • Silverlight • .NET Framework dotNetManía LINQ to SQL y N-Capas: esto es
Page 24: dotNetManía · nº 53 noviembre 2008 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX • Silverlight • .NET Framework dotNetManía LINQ to SQL y N-Capas: esto es

dotN

etM

anía

<<

24

dnm.plataforma.net<<

Estas funciones son parametrizadasusando un conjunto de puntos llama-dos puntos de control. Mediante lospuntos de control quedan definidas lascurvas y superficies y un pequeño cam-bio en éstos puede implicar un cambioen todos los puntos de la superficie.

En Direct3D se pueden crear super-ficies curvas paramétricas mediante losPatches. Un patch es una primitiva deorden superior que usa los vértices delbuffer que se haya dispuesto en el devi-ce como puntos de control de la función.

Existen dos tipos de patches enDirect3D, los patches rectangulares y lospatches triangulares; y como conse-cuencia, dos métodos para visualizarcada uno de estos tipos: Device.Draw-RectanglePatch y Device.DrawTrian-glePatch [6]. La información acerca decómo interpretar los puntos de controlalojados en el VertexBuffer y cuál fun-ción generadora será usada se le pasacomo parámetro usando las estructurasRectanglePatchInformation y Trian-glePatchInformation respectivamente.La figura3 muestra patch rectangularcreado usando como función genera-dora BasisType.Bezier.

Mallas

Si bien es cierto que modelos sim-ples pueden ser logrados con llamadasa métodos para graficar primitivas sim-ples en Direct3D, cuando se quierealmacenar y dibujar modelos muchomás complejos el uso de primitivas bási-cas puede resultar tedioso para el pro-gramador puesto que tendría que mane-jar un VertexBuffer para cada modeloy controlar de manera específica el pro-ceso de visualización de cada uno.

La biblioteca Direct3D ManagedExtensions tiene la clase Mesh (Malla)para expresar modelos más complejos.Las mallas funcionan de manera similara la primitiva PrimitiveType.Triangles-List usando un IndexBuffer. Una mallaposee propiedades que permiten alma-cenar un conjunto de vértices (Vertex-Buffer) y una secuencia de índices (Index-Buffer) donde con cada trío de índices seindica un triángulo de la superficie.

Con este tipo Mesh no sólo se tieneel almacenamiento y visualización delmodelo sino que se dispone de un con-junto de funcionalidades para optimi-zar el proceso de visualización, clonarel modelo, calcular automáticamentelas normales, interacción (hit-testing) yademás algoritmos para reducir yampliar el nivel de detalle de la malla(cantidad de vértices y triángulos quedefinen las superficies).

Aunque la clase Mesh tiene cons-tructor para recibir el buffer de vérticesy los índices de los triángulos que for-man las caras de las superficies, existendiversos métodos de clase en Mesh quepermiten crear modelos básicos demanera sencilla. De igual forma permi-te cargar de ficheros contenedores demallas Direct3D (ficheros generalmen-te de extensión .x).

La creación de objetos 3D querepresenten textos con extrusión es otrade las funcionalidades que provee estaclase mediante el método Mesh.Text-FromFont. La figura 4 muestra variasmallas que se pueden obtener para algu-nas figuras básicas y a partir de un tex-to “Direct3D Meshes”.

Puesto que una malla está compues-ta por triángulos para simular superficiescurvas es necesario incrementar la can-tidad de triángulos de la malla de modoque se logre una mejor aproximación ala curva. Por el contrario para visualizarobjetos lejanos, para los que no se requie-ra una gran definición, puede ser sufi-

ciente con una malla menos detallada,que requiera menos triángulos a proce-sar durante la visualización.

El aumento o reducción del nivel dedetalle (LOD3) en las mallas es posiblemediante varios métodos disponibles enla API de Direct3D. Un primer métodoque permitía ajustar el LOD de una super-ficie de manera arbitraria fue visto ante-riormente en la creación de superficiescurvas paramétricas (Patches), las cualespueden ser generadas usando determina-do número de puntos de control y espe-cificando la cantidad de divisiones que serequiere para cada arista. No obstante acontinuación se verán algunos algoritmosorientados a la reducción y ampliación dela definición de una malla.

Simplificación de mallas

Una forma sencilla de llevar a cabola simplificación de una malla es auxi-liándose de la clase SimplificationMesh.Esta clase se inicializa con una malla einformación sobre el buffer de adya-cencia de la misma y luego puede haceroperaciones de reducción del númerode caras o vértices. El algoritmo que usadetecta el vértice o cara que menos afec-taría la “forma” de la figura y los elimi-na en consecuencia de modo que la sim-plificación de la malla resulte suficien-temente aproximada a la original.

La clase SimplificationMeshno here-da de la clase Mesh y la manera de extra-er la malla simplificada es mediante elmétodo SimplificationMesh.Cloneel cualdevuelve un objeto de tipo Mesh con lamalla simplificada y se le puede indicarmediante uno de sus parámetros de tipoVertexFormats los elementos de los vér-tices de la malla resultante (normales,coordenadas de textura, color, posición…).

Un elemento importante a tener encuenta en la simplificación de mallas esque el algoritmo requiere que la mallano posea vértices que pertenezcan avarios “abanicos” (triangle fan4) al mis-mo tiempo. Para esto es necesario quese llame al método Mesh.Clean previo ala simplificación, de esta manera los vér-tices son duplicados para que no afec-ten el algoritmo.

Figura 4. Creación de mallas mediantela clase Mesh

3 Del inglés Level Of Detail.4 Conjunto de triángulos que comparten un único vértice.

Page 25: dotNetManía · nº 53 noviembre 2008 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX • Silverlight • .NET Framework dotNetManía LINQ to SQL y N-Capas: esto es

El listado 3 muestra cómo hacer lareducción de una malla que representaa una tetera. La figura 5 muestra lasvisualizaciones resultantes para los dis-tintos números de vértices.

Este proceso puede ser llevado a cabode manera más sencilla mediante el méto-do estático Mesh.Simplify en caso quesólo se quiera una única reducción de lamalla. Este método procesa la reducciónde la malla y devuelve una copia de lamalla, reducida.

Otro aspecto que puede disminuir lacantidad de triángulos y vértices a pro-cesar durante la visualización de una mallaes la eliminación de vértices que esténsuficientemente cercanos como para asu-mirse como el mismo. Este proceso sepuede llevar a cabo mediante el métodoMesh.WeldVertices. Durante este proce-

samiento, los vértices que se considerancercanos (de acuerdo a determinada dis-tancia) son “combinados” para formar unsolo vértice.

Mallas progresivas

Si se quiere de manera fácil podermanipular el nivel de detalle de la malla

se puede usar en lugar de la clase Mesh,la clase ProgressiveMesh. Los objetosde este tipo traen implícito en sus pro-piedades NumberVertices y NumberFa-ces la ampliación y reducción de la can-tidad de vértices y caras.

Cuando se usa un objeto Simplifi-cationMesh, la malla puede ser redu-cida pero no se le puede aumentarnuevamente la resolución hasta obte-ner la definición original (a no sercreando una nueva instancia de Sim-plificationMesh). Sin embargo, la cla-se ProgressiveMesh maneja el aumen-to y reducción del LOD de la mallamediante la asignación del número devértices o de caras a sus respectivaspropiedades. Es de destacar que aun-que la propiedad NumberVerticesadmite valores mayores que la canti-dad original de vértices, esto noimplica la creación de nuevos vérti-ces por parte de la malla.

Tanto Mesh como ProgressiveMeshson clases herederas de la clase Base-Mesh por lo que pueden visualizarseusando el método DrawSubset y brin-dan funcionalidades de interacción (hit-testing) mediante el método Intersect.

Subdivisión de superficies

Anteriormente hemos visto la eli-minación de vértices y caras para lasimplificación, pero ¿qué pasa si lo quese necesita es aumentar el nivel dedetalle de una malla previamente cre-ada con un conjunto de puntos fijos?La subdivisión de una superficie pla-na resulta en una superficie plana y nobrindaría suavidad en los bordes de lassuperficies. La figura 6 muestra estefenómeno.

dotN

etM

anía

<<

25

dnm.plataforma.net<<

Figura 5. Reducción del detalle de una tetera

// Creando la tetera sobre el device

Mesh teapot = Mesh.Teapot(device);

// Generando el buffer de adyacencia

int[] adj = new int[teapot.NumberFaces * 3];

teapot.GenerateA djacency(0, adj);

// Preparando la malla para ser simplificada

teapot = Mesh.Clean(CleanType.Simplification, teapot, adj, out adj);

// Creando el objeto simplificador

SimplificationMesh simplification = new SimplificationMesh(teapot, adj);

// Reduciendo la malla a N caras

int N = 1000;

this.Text = “Count of faces: “ + N;

simplification.ReduceFaces(N);

// Obteniendo una copia de la simplificacion

Mesh result = simplification.Clone(MeshFlags.Managed,

teapot.VertexFormat, device);

result.ComputeNormals();

// Dibujando la malla simplificada

result.DrawSubset(0);

Listado3 Simplificación y visualización de una tetera en Direct3D

Figura 6. Vista superior de una superficie y proceso de subdivisión. Lasesquinas siguen teniendo un ángulo recto

Page 26: dotNetManía · nº 53 noviembre 2008 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX • Silverlight • .NET Framework dotNetManía LINQ to SQL y N-Capas: esto es

Direct3D brinda mediante la clasePatchMesh una solución a este problemacreando para cada cara de la malla un patch(similar a las primitivas de orden superiorabordadas al principio de este artículo).De esta forma se generan los vértices pro-ductos de la subdivisión y se ubicanteniendo en cuenta la posición y la nor-mal de los vértices de la superficie origi-nal. La figura 7 muestra la soluciónmediante aproximaciones con B-Spline.

Usando la clase PatchMesh el progra-mador solo debe configurar elementostales como la cantidad de segmentos y eltipo de función generadora (entre otrosargumentos propios del algoritmo deinterpolación).

Una forma de acceder a esta funcio-nalidad de manera más sencilla es median-te el método Mesh.TessellateNPatch.Este método recibe una malla y un pará-metro que indica la cantidad de segmen-tos en que se quiere subdividir cada aris-ta de la malla y devuelve una malla con lasubdivisión resultante.

El código del listado 4 muestracómo se puede lograr de manera fácil elincremento del nivel de detalle de unamalla. La figura 8 muestra el resultadode este código para varios valores delparámetro de la cantidad de segmentos.

Modelos en WPFWPF es una API diseñada para la cre-ación de interfaces de usuario y por ellose tiene en cuenta no solo la visualiza-ción sino la forma de interactuar con elgráfico que se visualiza. En el entornotridimensional de WPF coexisten ele-mentos visuales tridimensionales loscuales pueden ser transformados paraubicarse dentro de la escena.

La clase Visual3D agrupa los ele-mentos que serán visualizados y con losque se puede interactuar. Estos ele-

mentos son agregados como hijos através de la propiedad Children de unViewport3D [1].

De la clase Visual3D heredan tresclases (ModelVisual3D, UIElement3D yViewport2DVisual3D).

ModelVisual3D

La clase ModelVisual3D es la quepermite visualizar objetos tridimen-sionales y asociar un “relleno” a sussuperficies, y además ubicar otros ele-mentos necesarios para una escena,como son las luces. Esta clase solo

dotN

etM

anía

<<

26

dnm.plataforma.net<<

Figura 7. Vista superior de una superficie y proceso de subdivisión con aproximación usando B-Spline

Figura 8. Subdivisión de un cubo (Mesh.Box)

// Crear la mallaMesh cube = Mesh.Box (device, 1,1,1);// Calcular adyacencia, considerar vértices repetidos como uno // solo y recalcular normalesint[] adj = new int [cube.NumberFaces*3];cube.GenerateA djacency (0, adj);cube.WeldVertices(WeldEpsilonsFlags.WeldA ll, new WeldEpsilons(), adj);cube.ComputeNormals();

// Subdividir aristas dependiendo de countOfSegments.int countOfSegments = 3;Mesh result = Mesh.TessellateNPatches(cube, adj, countOfSegments, false);result.ComputeNormals();// Dibujar la malla en el dispositivoresult.DrawSubset(0);// Liberar los recursos ocupados por las mallasresult.Dispose();cube.Dispose();

Listado 4, Subdivisión de una malla usando Mesh.TessellateNPatch

Page 27: dotNetManía · nº 53 noviembre 2008 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX • Silverlight • .NET Framework dotNetManía LINQ to SQL y N-Capas: esto es
Page 28: dotNetManía · nº 53 noviembre 2008 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX • Silverlight • .NET Framework dotNetManía LINQ to SQL y N-Capas: esto es

dotN

etM

anía

<<

28

dnm.plataforma.net<<

visualiza, no tiene en cuenta la posi-bilidad de interactuar con lo visuali-zado.

A la propiedad Content de un Model-Visual3D debe dársele como valor elmodelo que se quiere visualizar. Estosmodelos son subtipos del tipo abstractoModel3D. En WPF estos modelos tridi-mensionales pueden ser modelos geomé-tricos (GeometryModel3D), luces (Light) ogrupos de modelos (Model3DGroup). Cadauna de estas clases tiene un propósitoespecífico.

La clase GeometryModel3D permiteexpresar modelos geométricos a partirde una descripción del cuerpo, dada porla propiedad Geometry. Esta propiedadrecibe un objeto del tipo abstracto Geo-metry3D. En la actual versión de WPFsólo la clase, MeshGeometry3D imple-menta este tipo abstracto. MeshGeo-metry3D expresa un cuerpo mediante unconjunto de vértices y conexiones entreestos formando triángulos; similar a lasmallas de la API de Direct3D.

A diferencia de Direct3D, en elque para almacenar un vértice se defi-ne una estructura con las componen-tes del vértice que serán usadas, enWPF estas componentes se almace-nan de manera independiente en laspropiedades Positions, Normals y Tex-tureCoordinates de un MeshGeo-metry3D. De esta forma, el i-ésimoPoint3D de la lista de puntos Posi-tions y el i-ésimo Vector3D de la listade vectores Normals corresponden ala posición y la normal del i-ésimo vér-tice de la malla.

El listado 5 muestra la declaraciónde la geometría de un cubo.

En casos en que las colecciones Nor-mals y TextureCoordinates quedenvacías WPF realiza operacionesautomáticas, para el primer caso deter-mina automáticamente las normales de

cada vértice (similar al método Compu-teNormals de la clase Mesh de Direct3D)o determina que todas las coordenadasde textura son (0, 0) para el caso de quela colección de coordenadas de texturaquede vacía. Si ocurre el caso de que lacolección de TriangleIndices quedaravacía se asumirá 0,1,…, N-1 como lasecuencia de índices (donde N es la can-tidad de puntos en la colección de posi-ciones).

En los casos en que no se necesiteinteractuar sobre los modelos, la claseModelVisual3D puede resultar eficientepor cuanto no necesita hacer ray-castdurante el movimiento del mouse sobreel modelo visualizado. No obstante, pue-de suceder con frecuencia que sobre losmodelos visualizados se requiera ciertomecanismo de interacción con mouse yteclado. Para estos casos se podrá usar lasclases UIElement3D y Viewport2DVisual3D.

UIElement3D

Heredando de la clase UIElement3Dse pueden crear elementos visuales quecapturen los eventos de mouse y tecladoy tengan un comportamiento con res-pecto a los mismos. Esta clase abstrac-ta tiene una propiedad Model mediante

la cual se define el modelo que se usarápara la visualización y para la interac-ción, esto se deberá realizar sobrescri-biendo el método virtual OnUpdateMo-del. En WPF ya se ofrece un herederode esta clase que es ModelUIElement3D,éste permite asociar eventos de mousey teclado a un modelo de manera sen-cilla desde el propio código declarativoXAML (como muestra el listado 6).

Viewport2DVisual3D

La clase Viewport2DVisual3D tieneun interesante papel. Esta clase visuali-za un elemento del entorno gráfico bidi-mensional (Visual) sobre la superficiede un objeto geométrico tridimensio-nal (Geometry3D) y convierte los even-tos de mouse y teclado que actúan sobreel modelo tridimensional en eventos demouse y teclado sobre el elemento bidi-mensional asignado en su propiedadVisual.

Mediante esta clase pueden ser cre-adas aplicaciones tradicionales con for-mularios, botones, bloques de textos yque sean animadas con transformacio-nes en un ambiente 3D logrando efec-tos visuales que hasta el momento enWin32 habría sido necesario simular-los usando el método DrawBitmap de laclase Control y sobre un device deDirect3D.

El listado 7 muestra cómo se visua-lizan un conjunto de elementos de elentorno 2D de WPF sobre una mode-lo tridimensional. La figura 9 muestrael resultado del listado 7.

5 WPF hace distinción entre un punto del espacio y un vector del espacio. Point3D indica posicionamiento y Vector3D indica direccionamiento.

<MeshGeometry3DPositions=”0,0,0 1,0,0 1,1,0 0,1,0 0,0,1 1,0,1 1,1,1 0,1,1”TextureCoordinates=”0,1 1,1 1,0 0,0 0,1 1,1 1,0 0,0”TriangleIndices=”0,2,1 0,3,2 1,6,5 1,2,6 5,6,4 4,6,7 0,4,

7 0,7,3 0,1,5 0,5,4 3,6,2 3,7,6”/>

Listado 5. Declaración de un modelo Cubo en WPF.

<ModelUIElement3D x:Name=”Cube” MouseDown=”Cube_MouseDown”MouseUp=”Cube_MouseUp”>

<ModelUIElement3D.Model><GeometryModel3D>

<GeometryModel3D.Geometry><MeshGeometry3D …/>

</GeometryModel3D.Geometry><GeometryModel3D.Material>

<DiffuseMaterial Brush=”Red”/></GeometryModel3D.Material>

</GeometryModel3D></ModelUIElement3D.Model>

</ModelUIElement3D>

Listado 6. Proveyendo un modelo con eventos de mouse y teclado

Page 29: dotNetManía · nº 53 noviembre 2008 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX • Silverlight • .NET Framework dotNetManía LINQ to SQL y N-Capas: esto es

dotN

etM

anía

<<

29

dnm.plataforma.net<<

MeshAdapter

Como se ha visto las mallas son la estructura de mode-lación en WPF. A su vez las bibliotecas de Direct3Dtienen un conjunto de funcionalidades que permiten lacreación, transformación, ampliación y reducción delnivel de detalle de las mallas y permiten almacenarlasen fichero. ¿Cómo podrían aprovecharse estas funcio-nalidades de Direct3D desde WPF?

Convendría disponer de un mecanismo median-te el cual se pueda transformar una malla deDirect3D (Mesh) en una malla de WPF (MeshGeo-metry3D) y viceversa6.

Esto se logrará con una clase que llamaremosMeshA dapter y que estará encargada de almacenar

<Viewport2DVisual3DGeometry=”{Binding Path=Geometry,

ElementName=cube}”><Viewport2DVisual3D.Material><DiffuseMaterial Viewport2DVisual3D.

IsVisualHostMaterial=”True”Brush=”White”/>

</Viewport2DVisual3D.Material><DockPanel Background=”White”><DockPanel><Button DockPanel.Dock=”Top”>Hola</Button>

<Slider DockPanel.Dock=”Top”></Slider><TextBox Width=”100” DockPanel.Dock=”Top”>

Introduzca su texto aqui</TextBox>

</DockPanel></DockPanel>

</Viewport2DVisual3D>

Listado 7. Uso de la clase Viewport2DVisual3D.

Figura 9. Ejemplo del uso de la claseViewport2DVisual3D mostrando un Button,

un Slider y un TextBox.

public class MeshA dapter : HwndHost{

Device device;ListenerCollection listeners = new ListenerCollection();…IntPtr CreateDevice(IntPtr hwndParent){

IntPtr hwndHost = IntPtr.Zero;hwndHost = CreateWindowEx(0, “static”, “”,

WS_CHILD | WS_VISIBLE, 0, 0, 100, 100, hwndParent, (IntPtr)HOST_ID, IntPtr.Zero, 0);

PresentParameters pp = new PresentParameters();pp.Windowed = true;pp.SwapEffect = SwapEffect.Discard;

this.device = new Device(0, DeviceType.Hardware,hwndHost, CreateFlags.SoftwareVertexProcessing,pp);

if (device != null)foreach (IA dapterListener a in listeners)

a.UpdateFromA dapter(this);

return hwndHost;}protected override HandleRef BuildWindowCore(

HandleRef hwndParent){

return new HandleRef(this, CreateDevice(hwndParent.Handle));

}

internal const int WS_CHILD = 0x40000000, WS_VISIBLE = 0x10000000, LBS_NOTIFY = 0x00000001, HOST_ID = 0x00000002, LISTBOX_ID = 0x00000001, WS_VSCROLL = 0x00200000, WS_BORDER = 0x00800000;

//PInvoke declarations[DllImport(“user32.dll”, EntryPoint = “CreateWindowEx”,

CharSet = CharSet.A uto)]internal static extern IntPtr CreateWindowEx(

int dwExStyle, string lpszClassName,string lpszWindowName, int style, int x, int y, int width, int height, IntPtr hwndParent, IntPtr hMenu, IntPtr hInst, [MarshalA s(UnmanagedType.A sA ny)] object pvParam);

}

Listado 8. Creación de un control Win32 con la inicialización de un device de Direct3D.

6 Partiendo de una malla en WPF también podría ser conveniente convertirla en D3D, ampliarla o reducirla y luego llevarlanuevamente a WPF.

Page 30: dotNetManía · nº 53 noviembre 2008 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX • Silverlight • .NET Framework dotNetManía LINQ to SQL y N-Capas: esto es

mallas en un device de Direct3D, ejecutar accionessobre éstas (creación, simplificación, ampliación) yluego convertirlas en mallas de WPF para ser usadasen dicho entorno.

La clase MeshA dapter tendrá asociada el conjun-to de objetos que harán uso del device los cuales seránnotificados en el momento de la creación del mismo.Los objetos que deben ser capaces de ser notificadosdeberán implementar la interfaz IA dapterListener ycon ello el método UpdateFromA dapter.

Para crear un host en WPF de un control deWin32 que inicialice un device de Direct3D se harácomo muestra el listado 8. Para que el control MeshA -dapter no se muestre como un control más de la apli-cación en el constructor se asigna el valor Visibi-lity.Hidden a la propiedad Visibility.

Una vez creado el device, éste puede ser usado paracrear mallas a partir de textos (método Geometry-FromText de MeshA dapter), cargar mallas de fichero(GeometryFromXFile) o ampliar el nivel de detalle deuna malla (TessellateNPatch). La figura 10 muestraun ejemplo de estas funcionalidades.

Conclusiones

Un recurso como el propuesto con la clase MeshA -dapter puede ofrecer a los desarrolladores la posi-bilidad de traer a WPF técnicas especializadas demodelación que sí están disponibles en la API deDirect3D como es el caso del método de subdivi-sión (Mesh.TessellateNPatch), la carga de mallasalmacenadas en ficheros, la creación de mallascorrespondientes a textos.

Mediante el uso de los Converter, la propiedad queajusta el nivel de segmentación del algoritmo de sub-división puede depender de la distancia de la cámaraal objeto visualizado lo que permitiría simular un recur-so como el A daptativeTessellation de Direct3D. Deesta manera se puede ajustar el nivel de detalle de unmodelo acorde a la distancia que tienen con respectoal observador.

Este mecanismo es útil en aplicaciones en las queaparecen un gran número de modelos a visualizar ypermite reducir el tamaño de la información a ser pro-cesada haciendo que modelos para figuras lejanas ten-

gan un menor número de vértices parasu definición.

Una vez se tiene la malla en elentorno de WPF esta puede ser usadapara la interacción. De este modopoder crear controles 3D provistos desus eventos e integrados con los ya exis-tentes en WPF potenciaría la funcio-nalidad de nuestras aplicaciones.

En un próximo artículo será trata-do el procesamiento gráfico, cómo sonimplementadas técnicas gráficas comosombras, reflejos, texturas rugosas(bump mapping) o ambientales (envi-ronment mapping) usando la API deDirect3D y cómo pueden ser logradosestos efectos en WPF.

Figura10 Funcionalidades de MeshAdapter a) Creando una malla a partir de un texto

b) Aumentando el nivel de detalle de un cubo definido en WPF

BibliografíaLudwig Leonard, Miguel Katrib, WPF, DirectX y los gráficos tridimensionales, revista dotNetManía No 51, Septiembre 2008.

3-D Graphics Overview, http://msdn2.microsoft.com/en-us/library/ms747437.aspx3-D Graphics, http://msdn2.microsoft.com/en-us/library/ms746698.aspx

3-D Transformations Overview, http://msdn2.microsoft.com/en-us/library/ms753347.aspxNathan, Adam. Windows Presentation Foundation Unleashed, Sams Publishing, 2007. DirectX 9.0 SDK Documentation, 2003.Gray, K. Microsoft DirectX9 Programmable Graphics Pipeline, Microsoft Press, 2003.Open GL Super Bible. Waite Group Press, 1996.Miller, Tom. Managed DirectX® 9 Kick Start: Graphics and Game Programming, Sams Publishing 2003Walsh, Peter. 2003, Advanced 3D Game Programming Using DirectX 9.0, Wordware Publishing.

[1]

[2][3]

[4][5][6][7][8][9][10]

30

<<do

tNet

Man

ía<<dnm.plataforma.net

Page 31: dotNetManía · nº 53 noviembre 2008 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX • Silverlight • .NET Framework dotNetManía LINQ to SQL y N-Capas: esto es
Page 32: dotNetManía · nº 53 noviembre 2008 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX • Silverlight • .NET Framework dotNetManía LINQ to SQL y N-Capas: esto es

Introducción

Workflow Foundation (WF) es una tecnologíaMicrosoft que nos provee de un completísimo fra-mework que permite definir e implementar workflows(de aquí en adelante flujos de trabajo) que controlenel comportamiento y funcionamiento de nuestrasaplicaciones. Esta tecnología está disponible desdeel .NET Framework 3.0.

Windows SharePoint Services es el primer ser-vidor Microsoft que tiene soporte nativo para Work-flow Foundation (WF). Gracias a Visual Studio,podemos desarrollar potentes flujos de trabajo com-pletamente integrados en SharePoint, pero… ¿tra-bajamos más de la cuenta a la hora de crear un flu-jo? La respuesta en la mayoría de los casos es SÍ.

Todos sabemos que con Microsoft Office Sha-rePoint Designer 2007 se pueden crear sencillos flu-jos de trabajo basados en WF para SharePoint, perocuando pensamos en un flujo algo complicado, direc-tamente desechamos la idea de utilizar esta herra-mienta y pasamos a desarrollar con Visual Studio.En muchos de estos casos podemos jugar con Sha-rePoint Designer para conseguir implementar estosflujos mediante diferentes trucos con sus actividadespor defecto y mediante la creación de actividadespersonalizadas. Una actividad personalizada se desa-rrolla en Visual Studio y posteriormente se añadea SharePoint Designer, nos permite escribir cual-quier código y darle al asistente de SharePointDesigner unos parámetros de entrada y de salida

de muy diferentes tipos (enteros, cadenas, usuariosde SP, direcciones…)

¿Qué ganamos con esto? Desarrollamos las acti-vidades en Visual Studio pero nos beneficiamos dela sencillez de crear el flujo con SharePoint Desig-ner 2007 ya que los flujos se crean mediante unoscuantos pasos de un asistene y es más sencillo edi-tarlos en un futuro. Con esto lograremos desarrollarun flujo complejo en mucho menos tiempo.

Workflows en SharePoint¿Trabajo más de la cuenta al diseñar flujos de trabajo?

Sharepoint

Miguel TaberaPacheco

es software engineerde Raona. Miguel es

MCTS MOSS2007Configuration &

Application Develop-ment y MCTS de WSS.http://migueltabera.

blogspot.com

De todas las funcionalidades para SharePoint que incorpora SharePoint Desig-ner 2007, seguramente la más útil es el diseñador de flujos de trabajo. Permitediseñar flujos basados en Workflow Foundation mediante un pequeño asisten-te. Cuando queremos hacer algo complicado ya pensamos en pasar a Visual Stu-dio, que es más potente, pero perdemos la sencillez del Designer. ¿Y si pudiéra-mos combinar de alguna forma ambas tecnologías?

Miguel Tabera Pacheco

Page 33: dotNetManía · nº 53 noviembre 2008 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX • Silverlight • .NET Framework dotNetManía LINQ to SQL y N-Capas: esto es

dnm.servidores.sharepoint<<

Primeros pasosComenzaremos con un ejemplo de cre-ación de un flujo de aprobación; es elque utilizaremos en varias de las activi-dades por defecto que tenemos en Sha-rePoint Designer 2007. Después de cre-ar este flujo lo extenderemos con unaactividad personalizada. A priori, pode-mos pensar que las actividades pordefecto son muy simples (crear un ele-mento, enviar un correo…) pero tienenun gran potencial y casi siempre nos ser-virán para hacer lo que queramos.

Lo primero es elegir un sitio Sha-rePoint y una lista en concreto sobre laque aplicar ese flujo. En nuestro ejem-plo utilizaremos la lista “DocumentosTécnicos” de un sitio llamado dot-NetManía que hemos creado.

Como nuestro ejemplo consiste enaprobar elementos de la lista, es impor-tante que esté activada la aprobación dedocumentos para la lista “DocumentosTécnicos” (se activa en el enlace “Con-figuración de versiones” en la configu-ración de la lista).

Vamos a desarrollar un flujo queponga una tarea de aprobación a unusuario cuando alguien cree un docu-mento a la librería “Documentos Téc-nicos”. La tarea consistirá en un for-mulario en el que el usuario podrá escri-bir un dato en la columna “Informaciónadicional”, dejar un comentario y deci-dir si aprueba o rechaza el elemento. Sise rechaza se enviará un email a la per-sona que subió el documento.

Primera versión del flujo de trabajoPara crear el flujo de trabajo abrimos laherramienta Office SharePoint Designer2007.

Lo primero es abrir el sitio Share-Point llamado dotNetManía en el queestá nuestra librería.

Pinchamos en “Abrir sitio…”, en elmenú “Archivo” y pasaremos la ruta denuestro sitio dotNetManía para abrir-

lo. En nuestro ejemplo es http://Pues-to3/dotNetManía.

Si todo ha ido bien veremos en Sha-rePoint Designer todo el contenido denuestro sitio.

Y para crear el flujo nos iremos a“Archivo”| “Nuevo”|”Flujo de trabajo”.

Se les abrirá el asistente de crea-ción del flujo. En este primer pasopondremos un nombre al flujo, ele-giremos nuestra lista (“DocumentosTécnicos”) y marcaremos la opción“Iniciar automáticamente al crear unelemento” (figura 1).

Al igual que vamos a crear un for-mulario para la tarea, se podría crearuno al inicio mediante el botón Ini-cio. En cualquier momento, podemoscrear y consultar las variables localesque utilizaremos mediante el botón“Variables” y comprobar que todoestá correcto con el botón “Compro-bar flujo de trabajo”.

Nuestro flujo está preparado paracomenzar a crear actividades, así quepasaremos a la segunda ventana del asis-tente mediante el botón “Siguiente”.

La forma de trabajar es muy senci-lla. A la derecha tenemos los pasos delflujo de trabajo y un enlace para crearuno nuevo. En cada paso podemos cre-ar una o varias condiciones y acciones

correspondientes a realizar si se ha dadola condición (figura 2).

Ahora pensemos en nuestro flujo.Cuando se sube un documento, pordefecto, lo tenemos pendiente de apro-bación así que directamente podemospasar a crear la tarea al usuario. Nos sal-tamos el apartado de condiciones ypasamos al de acciones.

Nuestra primera acción es crear latarea al usuario con el formulario quele pida información. Pulsamos el botón“Acciones” y elegimos la acción “Reco-pilar datos de un usuario”.

Si la acción no está en la lista pode-mos encontrarla en “Más acciones…”En este apartado tenemos las accionesordenadas en varias categorías; nuestraacción está en “Acciones de tareas”.

La acción aparece en la ventana. Sinos fijamos, todas las condiciones /accio-nes tienen zonas de texto en azul subra-yado que nos permiten “rellenarlas” conalgún tipo de información. Nuestra tareaes sencilla: Recopilar datos de este usuario(enviar a Variable:recopilar). Si pinchamosen “Datos”, comenzará un sencillo asis-tente mediante el cual podremos crear elformulario de petición de datos. La infor-mación que el usuario cree en el formu-lario de petición de datos quedará alma-cenada en la tarea.

dotN

etM

anía

<<

33

Figura 1

Page 34: dotNetManía · nº 53 noviembre 2008 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX • Silverlight • .NET Framework dotNetManía LINQ to SQL y N-Capas: esto es

dnm.servidores.sharepoint<<

dotN

etM

anía

<<

3434

Una vez estemos en el asistente,pondremos un título a la tarea y una des-cripción que verá el usuario. Para elejemplo, pondremos de título “Debeaprobar un documento técnico” y dedescripción “Por favor, decida si aprue-ba o rechaza el documento. Si lo deseapuede escribir texto en la columna infor-mación adicional y un comentario”.

En el siguiente paso, añadiremos loscampos que tendrá el formulario. Alpinchar en el botón “Agregar” apare-cerá un asistente de dos pasos paraponer el nombre, descripción, tipo dedato y algún otro parámetro de confi-guración. El primero “Información adi-cional” será de tipo Una línea de texto,el segundo “Aprobación del documen-to” será de tipo Opción y el tercero“Comentarios” de tipo Varias líneas detexto. Deberíamos rellenarlos tal y comoaparece en la figura 3.

Es importante que en el tipo Opciónpongamos las opciones que vamos a tenerpara elegir (Aprobar o Rechazar) y decir-le que sean botones de opción.

Y con esto ya están completos loscampos que tendrá el formulario. En lalista de “Tareas” del sitio se crearán trescolumnas nuevas, una por cada campoque hemos definido. En ellas se guardarála información que el usuario rellene. Si

ya has añadido los tres campos puedesfinalizar ya este asistente.

Volviendo a la acción, podemos verqué datos se ha cambiado por el nombrede la tarea. Ahora pinchamos en este usua-rio y nos aparecerá una ventana con los

usuarios de SharePoint. Yo elegiré al usua-rio Puesto3\Miguel. Si nos fijamos en latercera opción “Enviar a: Variable: reco-pilar”, veremos que por defecto se nos hacreado una variable y la ha añadido ya. Lavariable se llama recopilar y podemosconsultarla en el botón “Variables”. Enesta variable de nuestro flujo se ha alma-cenado el ID de la tarea.

El siguiente paso, y el más útil, esrecuperar la información de la tarea. Paraello añadiremos tres acciones llamadas:Definir variable de flujo de trabajo envalor. Con estas acciones crearemos tresvariables para guardar la información decada uno de los tres campos del formu-lario de la tarea.

Si pinchamos en variable de flujode trabajo, crearemos tres variablesde tipo cadena: infoadicional, apro-bación y comentarios (figura 4).

Ahora queda guardar en cada varia-ble la información de la tarea. Vamos ahacer el ejemplo con la primera (infoadi-cional). Pinchamos en “Valor” y en elbotón “fx” para insertar un valor del flujo.

Figura 3

Figura 4

Fgura 2

Page 35: dotNetManía · nº 53 noviembre 2008 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX • Silverlight • .NET Framework dotNetManía LINQ to SQL y N-Capas: esto es

dnm.servidores.sharepoint<<

dotN

etM

anía

<<

35

En la ventana seleccionaremos comoorigen la “lista de tareas” y como campo,la columna “información adicional” (quese creó en la lista de tareas cuando crea-mos el campo del formulario). Con estoya tenemos la columna de “informaciónadicional” para guardar el valor en nues-tra variable pero… ¿de qué tarea? Debe-mos especificárselo. Si lo recuerda, en lavariable recopilar se ha guardado el IDde la tarea, con ese ID podríamos bus-carla en la lista. Pues efectivamente, alhaber seleccionado como origen la “listade tareas”, se nos han añadido otros doscampos para buscar la tarea en concretoque queremos. En campo pondríamosTareas:ID para que busque el ID que ledigamos en valor. En valor tenemos queponer el ID guardado en la variable reco-

pilar. Para ello pincharemos en “fx” parabuscar la variable y en la ventana selec-cionaremos “Datos del flujo de trabajo”y la variable recopilar (figura 5).

Y por fin, aceptar y aceptar y ya tene-mos en la variable infoadicional la infor-mación que el usuario va a introducir enel formulario de la tarea. Repetiremos lomismo para las variables aprobación ycomentarios. Con esto terminaría el pri-mer paso, le ponemos un nombre y que-dará tal y como se ve en la figura 6.

El siguiente paso es muy sencillo.Dependiendo de la variable aproba-ción aprobaremos o rechazaremos eldocumento.

Lo primero es crear un nuevo pasoPaso2. Dentro del paso 2 pincharemosen “Agregar rama condicional ‘O sí’”

para añadir una nueva rama de condi-ción. En una condición miraremos si lavariable aprobacion vale “Aprobar” yen la otra si vale “Rechazar”.

Para ello añadiremos una condiciónllamada “Comparar cualquier origen dedatos”. En el primer valor, tenemos queponer la variable, se busca igual que ante-riormente: pinchamos en “fx” y como ori-gen seleccionamos “Datos del flujo de tra-bajo”. En campo buscamos la variableaprobación. Una vez esté la variable aña-dida, rellenamos el segundo valor con eltexto “Aprobar” para una condición y“Rechazar” para la otra (este texto debe seridéntico al que pusimos al crear la tarea).

Al final quedará así:Condición: Si Variable:aprobación

es igual a AprobarAcciones:

Condición: O si Variable:aproba-ción es igual a Rechazar

Acciones:

Ahora podemos rellenar las accionesde cada una de las condiciones. En el casode “Aprobar”, vamos a rellenar la colum-na “Información Adicional” del docu-mento en la lista y a aprobar el elemen-to. Añadimos la acción “Definir campoen el elemento actual”. La acción aceptados parámetros: para el primero nos da aelegir una columna de la librería de docu-mentos, así que le decimos que queremos“Información Adicional”; en el segundohay que darle el valor de la variable asíque pulsaremos “fx” y buscaremos en“Datos del flujo de trabajo” la variableinfoadicional.

Ahora añadimos la acción “Esta-blecer estado de aprobación del conte-nido”. La primera entrada es una listaen la que seleccionaremos aprobado.En la segunda podemos escribir uncomentario (yo le he pasado el de lavariable buscando con “fx”).

Para la segunda condición, añadi-mos la acción “Enviar correo electró-nico”. Tiene un parámetro de entra-da y al abrirlo nos permite escribir uncorreo (figura 7).

Figura 5

Figura 6

Page 36: dotNetManía · nº 53 noviembre 2008 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX • Silverlight • .NET Framework dotNetManía LINQ to SQL y N-Capas: esto es

dnm.servidores.sharepoint<<

dotN

etM

anía

<<

36

En el campo “Para:” hemos pincha-do en el botón para que salga la lista deusuarios. Un usuario de la lista es “Usua-rio que ha creado el elemento actual” quees la persona que inició el flujo.

Para añadir los comentarios al men-saje, hemos buscado la variable pulsandoel botón “Agregar búsqueda al cuerpo”.

Finalmente, añadimos la acción de“Establecer estado de aprobación del con-tenido”, al igual que en la condición ante-rior, solo que ahora rechazando.

El segundo paso está terminado(figura 8).

Nuestro flujo está terminado porfin. Si pulsamos el botón “Finalizar” seguardará y estará todo listo.

Prueba del flujo

Para probar el flujo crearemos un nuevodocumento a la librería “DocumentosTécnicos” de SharePoint. El documen-to se queda “En espera de aprobación” yse crea la tarea en la lista de tareas.

El paso siguiente es editar la tarea. Sipinchamos en su enlace para editar, se abreel formulario que hemos creado (figura 9).

Ahora rellenamos la información adi-cional, marcamos “aprobar” y escribimoscomentarios. Para continuar pulsaríamosen “Realizar tarea”. Y… ¡lo que esperá-bamos!, el documento aparece comoaprobado y con la información adicional.

Como podemos observar, hemos cre-ado un flujo de aprobación con solo dospasos de un asistente. Éste es muy senci-llo, pero si vamos combinando otrasmuchas tareas de SharePoint Designerpodemos hacer flujos muy potentes quecubran nuestras necesidades y que sonsencillamente editables.

Acciones personalizadas paraflujos de SharePoint Designer2007

En SharePoint Designer 2007 tene-mos numerosísimas actividades paranuestros flujos de trabajo, pero siem-pre hay alguna cosa que queremoshacer y no es posible. Cuando algo senos escapa de las manos, directamen-te pensamos… “pues me creo el flujode trabajo entero en Visual Studio”.Efectivamente es una solución, peroperdemos más de lo que ganamos. Tra-bajamos mucho más, escribimosmucho código, nos peleamos con lasdepuraciones y es complicada la tareade instalarlo y reutilizarlo. Además, siqueremos hacer cambios en un futu-ro, tardaremos mucho más porquetenemos que editar el proyecto, guar-dar las DLL, instalar…, en cambio enSharePoint Designer volvemos a abrirel flujo y guardamos.Figura 8

Figura 9

Figura 7

Page 37: dotNetManía · nº 53 noviembre 2008 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX • Silverlight • .NET Framework dotNetManía LINQ to SQL y N-Capas: esto es

dnm.servidores.sharepoint<<

dotN

etM

anía

<<

37

Hay una solución, podemos crear acti-vidades personalizadas con Visual Studioque luego añadiremos a SharePoint Desig-ner. De esta forma tendremos mucha liber-tad para hacer lo que queramos. Es impor-tante saber, que aunque es buena solución,hay muchos casos en los que necesitare-mos hacer los flujos en Visual Studio, porejemplo, si queremos hacer bucles, o conflujos de máquina de estados… Aún así,en la mayoría de los casos, bastará con lasactividades personalizadas para cubrirnuestras necesidades.

Vamos a crearnos una actividad per-sonalizada de ejemplo. Esta actividad reci-birá una cadena de texto y creará un gru-po de SharePoint con ese nombre. Tam-bién abrirá una ventanita de “seleccionarusuario” y añadirá el usuario al grupo.Nos devolverá una variable de texto quecontendrá “true” si se ha creado correc-tamente y “false” en caso contrario.

El estilo de la acción sería: crear gru-po llamado pruebagrupo y añadir al usua-rio Puesto3\Miguel. Resultado en la varia-ble Variable: variableFunciona.

Pues comenzaremos abriendoVisual Studio –debemos tener instala-das las extensiones para SharePoint yWorkflow Foundation–, Creamos unnuevo proyecto de tipo workflow lla-mado “Workflow Activity Library”. Elnombre de nuestro proyecto va a serA ctividadCrearGrupo:

Por defecto, nos ha creado una acti-vidad A ctivity1 que renombramos porClassA ctividadCrearGrupo:

Definimos las DependecyProperties,que son propiedades de la actividad conlas que el flujo de trabajo podrá inte-

ractuar. En nuestro caso, necesitamosuna de entrada con el nombre del gru-po NombreGrupoEntrada, otra con elusuario UsuarioGrupoEntrada y una de

salida que contenga “true” o “false”HaFuncionadoSalida (listado 1).

Para cualquier actividad que hagapuede copiar una de éstas y editarlas.

namespace A ctividadCrearGrupo{public partial class

ClassA ctividadCrearGrupo: SequenceA ctivity

{public ClassA ctividadCrearGrupo(){InitializeComponent();

}}

}

public static DependencyProperty NombreGrupoEntradaProperty = DependencyProperty.Register(“NombreGrupoEntrada”, typeof(System.String), typeof(ClassA ctividadCrearGrupo));

/// <summary>/// NombreGrupoEntrada /// </summary>/// <value>NombreGrupoEntrada</value>[Description(“NombreGrupoEntrada”)][Category(“User”)][Browsable(true)][DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)][ValidationOption(ValidationOption.Required)]public System.String NombreGrupoEntrada{

get { return (System.String)base.GetValue(NombreGrupoEntradaProperty);}set { base.SetValue(NombreGrupoEntradaProperty, value);}

}

public static DependencyProperty UsuarioGrupoEntradaProperty = DependencyProperty.Register(“UsuarioGrupoEntrada”, typeof(System.String), typeof(ClassA ctividadCrearGrupo));

/// <summary>/// UsuarioGrupoEntrada /// </summary>/// <value>UsuarioGrupoEntrada</value>[Description(“UsuarioGrupoEntrada”)][Category(“User”)][Browsable(true)][DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)][ValidationOption(ValidationOption.Required)]public System.String UsuarioGrupoEntrada{

get { return (System.String)base.GetValue(UsuarioGrupoEntradaProperty); }set { base.SetValue(UsuarioGrupoEntradaProperty, value); }

}

public static DependencyProperty HaFuncionadoSalidaProperty = DependencyProperty.Register(“HaFuncionadoSalida”, typeof(System.String), typeof(ClassA ctividadCrearGrupo));

/// <summary>/// HaFuncionadoSalida /// </summary>/// <value>HaFuncionadoSalida</value>[Description(“HaFuncionadoSalida”)][Category(“User”)][Browsable(true)][DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)][ValidationOption(ValidationOption.Required)]public System.String HaFuncionadoSalida{

get{ return (System.String)base.GetValue(HaFuncionadoSalidaProperty);}set{ base.SetValue(HaFuncionadoSalidaProperty, value);}

}

Listado 1

Page 38: dotNetManía · nº 53 noviembre 2008 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX • Silverlight • .NET Framework dotNetManía LINQ to SQL y N-Capas: esto es

dnm.servidores.sharepoint<<

dotN

etM

anía

<<

38

El editor de workflows de SharePointDesigner tiene unos nombres especialesque se le dan a propiedades de WF. Pode-mos disponer siempre en nuestro flujo deestas propiedades. En esta tabla tenemosel nombre de la propiedad, a qué valor sele inicializa y el tipo de .NET de esa pro-piedad (tabla 1).

Para nuestra actividad personaliza-da utilizaremos __Context ya que deeste objeto podemos sacar el SPSite yel SPWeb actuales. Para poder utilizarlohay que añadir una DependecyPropertymás (listado 2).

Si nos fijamos, es de tipo Micro-soft.SharePoint.WorkflowA ctions.WorkflowContext que aparece en la tablapara __Context.

Ahora sobrescribimos el métodoExecute. Lo que escribamos en él se eje-cutará con la actividad (listado 3).

Siempre tiene que devolver ese Clo-sed para que finalice la ejecución de la

actividad. Lo que hacemos es ponernuestro código en el método, antes delClosed. El código creará el grupo cogien-do de NombreGrupoEntrada, creará el

usuario con el nombre de UsuarioGru-poEntrada y nos dirá si hubo fallo o noescribiendo la cadena “true” o “false” enHaFuncionadoSalida. No nos centrare-mos en lo que hace el código ya que noes el objetivo del artículo, hay formasmás optimas de manejar este código,pero para ilustrar el ejemplo nos basta.El método quedaría tal y como vemosen el listado 4.

Hemos definido los DependecyPro-perty y sobreescrito el método Execu-te. Con esto ya hemos acabado con elproyecto.

El siguiente paso es publicar la DLLen el GAC y editar el web.config de laaplicación web en la que vayamos a cre-ar el flujo. Tenemos que añadir nues-tro assembly como authorizedType (lis-tado 5).

Y ya solo nos queda instalar la acti-vidad a SharePoint Designer. Para ellonos vamos a la ruta C:\A rchivos de pro-grama\A rchivos comunes\MicrosoftShared\web server extensions\12\TEM-PLA TE\3082\Workflow (si SharePoint estáen inglés es 1033 en vez de 3082) y loca-lizamos el archivo WSS.A CTIONS. Eneste archivo tenemos todas las accio-nes de SharePoint Designer. Podemosañadir aquí nuevas acciones o crearotro archivo .A CTIONS nuevo. Para elejemplo editaremos el WSS.A CTIONS yescribiremos al final una nueva eti-

Nombre de Propiedad Valor que se le asigna Tipo de .Net

__A ctivationProperties __initProps, el SPWorkflowA ctivationProperties Microsoft.SharePoint.Workque es pasado vía OnWorkflowA ctivated. flow.SPWorkflowA ctivationDe aquí podemos sacar cosas tan útiles Propertiescomo la hora a la que se creó el flujo.

__ListId __list, el nombre de la SPList en la que se está System.Stringejecutando el flujo. Suele ser una tipo cadena que contiene el texto de de un System.Guid.

__ListItem __item, el valor entero del item en la lista en la System.Int32que se está ejecutando el flujo.

__Context __context, objeto que contiene métodos y objetos Microsoft.SharePoint.Workmuy útiles para utilizar como parte de las acciones flowA ctions.WorkflowContextdel flujo.

Tabla 1

public static DependencyProperty __ContextProperty = DependencyProperty.Register(“__Context”, typeof(Microsoft.SharePoint.WorkflowA ctions.WorkflowContext), typeof(ClassA ctividadCrearGrupo));

[ValidationOption(ValidationOption.Required)]public Microsoft.SharePoint.WorkflowA ctions.WorkflowContext __Context{

get{ return (Microsoft.SharePoint.WorkflowA ctions.

WorkflowContext)base.GetValue(__ContextProperty);}set

{ base.SetValue(__ContextProperty, value); }}

protected override A ctivityExecutionStatusExecute(A ctivityExecutionContext

executionContext){

return A ctivityExecutionStatus.Closed;}

Listado 2

Listado 3

Page 39: dotNetManía · nº 53 noviembre 2008 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX • Silverlight • .NET Framework dotNetManía LINQ to SQL y N-Capas: esto es
Page 40: dotNetManía · nº 53 noviembre 2008 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX • Silverlight • .NET Framework dotNetManía LINQ to SQL y N-Capas: esto es

dnm.servidores.sharepoint<<

dotN

etM

anía

<<

40

queta <A ction>. El código tal y como quedará pue-de verlo en el listado 6.

La primera parte es muy sencilla: nombre de laclase, información del ensamblado y categoría. Lacategoría es “Acciones personalizadas”. De esta for-ma nos aparecerá otro grupo en SP Designer al ele-gir acciones.

La etiqueta <RuleDesigner Sentence=…> con-tiene el texto que nos aparecerá en el diseñadordel flujo. Los valores %numero son las tres partesde la acción personalizada con las que podemosinteractuar (insertar texto, variables…) y se desa-rrollan a continuación en las etiquetas <FieldBind>.Tenemos tres etiquetas, una por cada parámetro,en Text escribimos el texto subrayado que apare-cerá en el diseñador y el Id para relacionarlo conla etiqueta anterior. DesignerType nos interesamucho, ya que depende de lo que le pongamos eldiseñador hará una cosa distinta al pinchar en eltexto subrayado. Algunos ejemplos de valores paraDesignerType:

TextA rea: nos aparece un área para escribir tex-to y el botón “fx”.SinglePerson: aparece una ventana de elecciónde usuario.ParameterNames: creará una variable del flujo.Date: ventana para elegir fecha.Integer: para escribir números enteros.Email: ventana para crear un email.ChooseListItem: para elegir un elemento deuna lista.

Hay muchos más, si investiga las acciones pordefecto que hay en el archivo, descubrirá su uso.Para que se pueda escribir el grupo, hemos pues-to un TextA rea, para elegir al usuario que se inser-tará en el grupo, un SinglePerson, y para la varia-ble en la que se guardará el éxito o no hemos pues-to un ParameterNames.

Las tres últimas etiquetas contienen el nombrede las tres DependecyProperty que teníamos en elcódigo y también la de __Context. Mediante estenombre se relacionan con el código y con las eti-quetas <FieldBind>. Definiremos su tipo y si sonvariables de entrada o de salida.

Ya hecho todo esto reiniciamos los servicios deIIS y podemos volver a SharePoint Designer. Si noscreamos un flujo de trabajo y pulsamos el botón paraañadir una acción tendremos nuestra acción “Creargrupo” en “Acciones personalizadas”.

Y si la insertamos todo funciona. Al pinchar loscampos subrayados podemos escribir texto, seleccio-

Listado 4

protected override A ctivityExecutionStatusExecute(A ctivityExecutionContext executionContext)

{try{

SPSite miSitio = (SPSite)__Context.Site;SPWeb miWeb = (SPWeb)__Context.Web;

miWeb.A llowUnsafeUpdates = true;string newMembersGroup = NombreGrupoEntrada;SPUser groupOwner = miWeb.A uthor;miWeb.SiteGroups.A dd(newMembersGroup, groupOwner, null, “”);SPGroup membersGroup = miWeb.SiteGroups[newMembersGroup];membersGroup.OnlyA llowMembersViewMembership = false;membersGroup.A llowMembersEditMembership = false;membersGroup.A llowRequestToJoinLeave = true;membersGroup.A utoA cceptRequestToJoinLeave = true;membersGroup.Update();

SPRoleDefinition contributor=miWeb.RoleDefinitions.GetByType(SPRoleType.Contributor);

SPRoleA ssignment membersRoleA ssignment=new SPRoleA ssignment((SPPrincipal)membersGroup);

membersRoleA ssignment.RoleDefinitionBindings.A dd(contributor);miWeb.RoleA ssignments.A dd(membersRoleA ssignment);

// A ñadir owner como miembromembersGroup.A ddUser(miWeb.A uthor);membersGroup.Update();

// A ñadir usuario como miembroSPUser userA ctual = miWeb.EnsureUser(UsuarioGrupoEntrada);membersGroup.A ddUser(userA ctual);membersGroup.Update();

miWeb.A ssociatedMemberGroup = membersGroup;miWeb.Update();

HaFuncionadoSalida = “true”;}catch (Exception ex)

{ HaFuncionadoSalida = “false”; }

return A ctivityExecutionStatus.Closed;

}

<System.Workflow.ComponenModel.WorkflowCompiler><authorizedTypes>

...<authorizedType A ssembly=”A ctividadCrearGrupo, Version=1.0.0.0,

Culture=neutral, PublicKeyToken=3cca32f0f5875c10” Namespace=”A ctividadCrearGrupo” TypeName=”*” A uthorized=”True” />

</authorizedTypes></System.Workflow.ComponentModel.WorkflowCompiler>

Listado 5

Page 41: dotNetManía · nº 53 noviembre 2008 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX • Silverlight • .NET Framework dotNetManía LINQ to SQL y N-Capas: esto es

dnm.servidores.sharepoint<<

dotN

etM

anía

<<

41

nar usuario y asignar variable tal y comopusimos en el archivo WSS.A CTIONS (figu-ra 10).

Con esto queda finalizado el ejemplode creación de una acción personalizada.

En Codeplex hay un paquete de acti-vidades personalizadas para SharePointDesigner 2007 que seguro que le seránmuy útiles. Nos permiten obtener un cam-po de un formulario Infopath, iniciar otroflujo, borrar permisos, dar permisos, con-sultar roles, enviar emails con adjuntos…Se puede descargar en http://www.code-plex.com/SPDA ctivities.

Acciones ya incluidas en Sha-rePoint Designer 2007

Éstas son las actividades incluidas:

Acciones de lista

• Actualizar elemento de lista: hace unupdate a un elemento de lista en elque hemos hecho cambios.

• Copiar elemento de lista: copia unelemento de una lista a otra.

• Crear elemento de lista: crea un nue-vo elemento en una lista.

• Descartar desprotección de elemento:si hemos desprotegido (check-out) unelemento deshace la desprotección.

• Desproteger elemento: desprotege(check-out) el elemento de una lista.

• Eliminar elemento: elimina el ele-mento de una lista.

• Proteger elemento: protege (check-in) un elemento.

Acciones de tareas

• Asignar un elemento de tarea: asig-na una tarea a un usuario.

• Recopilar datos de un usuario: el denuestro primer ejemplo, crea unatarea que consiste en un formula-rio de petición de datos personali-zado.

• Asignar un formulario a un grupo:similar al anterior pero podemosasignar a varios usuarios.

Acciones principales

• Agregar hora a la fecha: agregaminutos a una variable de tipo fechaya creada.

• Configurar parte de la hora del cam-po Fecha y Hora: cambia la hora a unavariable de tipo fecha.

• Definir campo en elemento actual:pone un valor en una de las colum-nas de la lista para el elemento rela-cionado con el flujo.

• Definir variable de flujo de trabajo:crea una variable para el flujo de tra-bajo y le asigna un valor.

• Detener durante: detiene el flujo eltiempo que le digamos.

• Detener flujo de trabajo: detiene yfinaliza el flujo.

• Detener hasta fecha: detiene el flujohasta una fecha concreta.

• Enviar correo electrónico: envía uncorreo electrónico a los destinatariosque queramos. Podemos agregarletexto de las variables.

• Esperar a que el campo cambie en elelemento actual: permanece a la espe-ra hasta que un determinado campodel elemento actual cambie.

Figura 10

<A ction Name="Crear grupo"ClassName="A ctividadCrearGrupo.ClassA ctividadCrearGrupo"A ssembly="A ctividadCrearGrupo, Version=1.0.0.0, Culture=neutral,

PublicKeyToken=3cca32f0f5875c10"A ppliesTo="all"Category="A cciones personalizadas"><RuleDesigner Sentence="Crear grupo llamado %1 y añadir al usuario %2. Resultado

en la variable %3."><FieldBind Field="NombreGrupoEntrada" Text="nombre del grupo" Id="1"

DesignerType="TextA rea"/><FieldBind Field="UsuarioGrupoEntrada" Text="usuario" Id="2"

DesignerType="SinglePerson"/><FieldBind Field="HaFuncionadoSalida" Text="variableFunciona" Id="3"

DesignerType="ParameterNames"/></RuleDesigner><Parameters><Parameter Name="NombreGrupoEntrada" Type="System.String, mscorlib" Direction="In" /><Parameter Name="UsuarioGrupoEntrada" Type="System.String, mscorlib" Direction="In" /><Parameter Name="HaFuncionadoSalida" Type="System.String, mscorlib" Direction="Out" /><Parameter Name="__Context" Type="Microsoft.SharePoint.WorkflowA ctions.WorkflowContext,

Microsoft.SharePoint.WorkflowA ctions" Direction="Out" /></Parameters>

</A ction>

Listado 6

Page 42: dotNetManía · nº 53 noviembre 2008 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX • Silverlight • .NET Framework dotNetManía LINQ to SQL y N-Capas: esto es

• Establecer el estado de aprobacióndel contenido: establece el estado deaprobación del elemento actual aaprobado, rechazado o pendiente.

• Generar cadena dinámica: generauna cadena de texto a partir de tex-to que escribamos y de informaciónde las listas y de las variables delflujo.

• Realizar el cálculo: hace sumas, res-tas, multiplicaciones, divisiones ymódulo.

• Registrar en la lista historial: regis-tra un mensaje personalizado en elhistorial del flujo de trabajo.

Pequeños trucos a la hora decrear flujosFinalizaremos con pequeños trucosque en Raona hemos ido descubrien-do que son muy útiles para esos deta-llitos que dejan a nuestros flujos de tra-bajo perfectos.

Abrir en Web un Infopath desde latarea

Cuando tenemos una acción querecopila datos de un usuario (la denuestro ejemplo) podemos ver que enel formulario de la tarea hay un enla-ce al elemento sobre el que se ha eje-cutado el flujo. Si este elemento es unformulario InfoPath, aunque estéhabilitado para Web nos va a inten-tar descargar el documento al pincharen el enlace.

Lo interesante sería que el for-mulario se abriera en Web. Si abri-mos la carpeta del flujo con Share-Point Designer veremos que ahí se

guarda el formulario .aspx de la tarea(su nombre será similar).

Si lo editamos y buscamos el texto:<a href="{substring-before(

@WorkflowLink, ', ')}">

Basta con añadirle:

<a href="{substring-before(@WorkflowLink, ', ')}?

DefaultItemOpen=1">

Y ya se abrirá en web en la tarea.

Crear cadena dinámica

La acción “Generar cadena diná-mica” puede sernos muy útil, ya quepermite crear una cadena de textoconcatenándole información de otrasvariables o campos de lista. Supon-gamos que tenemos un flujo de apro-bación que pasa por tres personas,cada una con su formulario. Seríamuy útil poder recopilar los comen-tarios de todos en una sola variablepara, por ejemplo, mandar un correo.Pues con “Generar cadena dinámi-ca” es posible.

Nos aparecerá una caja de texto enla que podremos escribir, para añadircampos de variables del flujo o de lis-tas del sitio de SharePoint podemosagregarlas con el botón “Añadir bús-queda”. Es una búsqueda de variable ocampo de lista, similar a los que hemoshecho en apartados anteriores.

Ejecutar acciones en paralelo

Lo normal es que nuestras accionesse ejecuten una detrás de otra, pero si

quisiéramos que se ejecutaran en para-lelo no tenemos más que pinchar en laopción de la imagen y se ejecutarántodas a la vez. Para ello buscamos unaflecha desplegable a la derecha de laacción, en ese desplegable tenemos laopción “Ejecutar acciones en paralelo”.

¿Cómo iniciar el flujo?

Cuando empezamos a crear el flu-jo tenemos tres opciones de inicio delflujo:

• Permitir que este flujo de traba-jo se inicie manualmente desdeun elemento.

• Iniciar automáticamente este flu-jo de trabajo cuando se cree unnuevo elemento.

• Iniciar automáticamente este flu-jo de trabajo siempre que se cam-bie un elemento.

La primera permitirá iniciar el flujoa mano. Esto se hará desde la lista en elmenú desplegable de un elemento. Lasegunda se iniciará cuando se cree nue-vo elemento en la lista y la tercera o seedite.

En Codeplex hay unpaquete de actividades

personalizadas para SharePoint Designer 2007que seguro que le serán

muy útiles. Se puede descargar en

http://www.codeplex.com/SPDActivities

42

<<do

tNet

Man

ía

<<dnm.servidores.sharepoint

Figura 11

Page 43: dotNetManía · nº 53 noviembre 2008 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX • Silverlight • .NET Framework dotNetManía LINQ to SQL y N-Capas: esto es

dotN

etM

anía

<<

43

dnm.servidores.sql<<

Opciones de migraciónAntes de abordar un proceso de migración de ins-tancias de SQL Server a SQL Server 2008, lo pri-mero que debemos hacer es planificar dicha migra-ción como cualquier otro proyecto, y sobre todo,realizar las copias de seguridad necesarias para cubrir-nos ante imprevistos. Lo primero que debemos revi-sar son las características que dejan de existir o quecambian de comportamiento desde las versionesanteriores. Disponemos de toda esta información enlos libros en pantalla, accesibles desde este enlacehttp://technet.microsoft.com/en-us/library/ms143532.aspx.

A la hora de decidir cuál es el mejor método paraactualizar nuestra plataforma de datos a SQL Ser-ver 2008, disponemos básicamente de dos opciones:• Actualización In-Place. En este escenario, actua-

lizaremos una instancia de SQL Server 2000 oSQL Server 2005 a SQL Server 2008, directa-mente en el mismo servidor físico, y en la mismainstancia de SQL Server. El instalador de SQLServer, nos da la opción de realizar dicha migra-ción directamente.

• Migración Side-By-Side. Se denominada así, por-que es el escenario en el que disponemos de unanueva instancia con SQL Server 2008, a la quedebemos de migrar nuestras bases de datos deSQL Server 2000 o SQL Server 2005. Para esto,disponemos a su vez de tres opciones:

Restaurar una copia de seguridad. Si dispone-mos de copias de seguridad de bases de datosen SQL Server 2000 o SQL Server 2005,podremos restaurarlas en SQL Server 2008.En estos casos, debemos tener en cuenta quelo que estamos restaurando es tan solo esa basede datos, por lo que todos los objetos a nivelde servidor, tales como Inicios de sesión o Tra-bajos del agente de SQL Server, no seránmigrados y deberemos de buscar alternativaspara ello. Uno de los problemas más comu-nes es el denominado Usuarios huérfanos, queocurre cuando los usuarios de nuestras basesde datos existen, pero no están enlazados consu correspondiente Inicio de Sesión a nivel deinstancia. Para comprobar las posibles opcio-nes que nos ayuden a resolver estos proble-mas tenemos toda la información en los librosen pantalla http://technet.microsoft.com/en-us/library/ms175475.aspx.Adjuntar la base de datos. Otra de las opcionesdisponibles, consiste en desasociar la base dedatos de una versión anterior (SQL Server2000 o SQL Server 2005) y adjuntar poste-riormente esa base de datos en la instancia deSQL Server 2008. En este escenario, nosencontramos con los mismos problemas quesi realizamos una restauración, puesto que solo

Migración de bases de datos aSQL Server 2008

SQL Server

Antonio Soto esDirector de Opera-

ciones de SSolid Qua-lity Mentors en

España y Portugal.Con más de 12 añosde experiencia en elmundo de las bases

de datos relacionalessobre SQL Server, enlos últimos años se ha

especializado en lastecnologías de bús-queda e indexación,

tanto en SQL Server,como en SharePoint

y Search Server.Antonio es MCSE,

MCDBA, MCTS,MCITP y MCT

En este artículo analizaremos las consideraciones que debemos tener en cuen-ta a la hora de realizar la migración de una instancia de SQL Server a la nuevaversión SQL Server 2008. Las versiones que están soportadas son las actuali-zaciones desde SQL Server 2000 y SQL Server 2005. En el caso de que dis-pongamos de versiones anteriores de SQL Server, deberemos pasar por algu-na de estas versiones intermedias antes de llegar a SQL Server 2008.

Antonio Soto

Page 44: dotNetManía · nº 53 noviembre 2008 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX • Silverlight • .NET Framework dotNetManía LINQ to SQL y N-Capas: esto es

dotN

etM

anía

<<

44

dnm.servidores.sql<<

estaremos adjuntando la base dedatos, y no los objetos a nivel deinstancia que existían en la ins-tancia anterior. Cabe reseñar queuna vez adjuntemos la base dedatos en SQL Server 2008, nopodremos utilizar esos mismosficheros de base de datos paraadjuntarlos en SQL Server 2000o SQL Server 2005, así quedeberemos utilizar siempre unacopia de los mismos. Utilizar el Asistente de copia de basede datos. El Asistente de copia debase de datos también nos sirve

como método de migración,puesto que nos permite utilizarcomo instancia origen una ins-tancia de SQL Server 2000 oSQL Server 2005. Nos permiteademás, seleccionar si queremosmover o copiar las bases de datos,y como mecanismo de copia,podemos optar por desasociar yasociar la base de datos o utilizarel SQL Management Object, queserá más lento, pero que nos per-mite mantener la base de datosoriginal en línea y no tenerningún tipo de parada. La gran

ventaja de esta opción, es que nospermite, además de copiar la basede datos, copiar los Inicios desesión, Trabajos de SQL Server,Errores definidos por el usuarioy los procedimientos almacena-dos de la master, evitando lospasos adicionales que debemosdar en los dos casos anteriores. Ypara facilitar todavía más el pro-ceso, el resultado del asistente esun paquete de SQL Server Inte-gration Services, que nos permi-tirá almacenar y que podremosejecutar tantas veces como nece-

sitemos para realizar las pruebasnecesarias, sin necesidad de vol-ver a lanzar el asistente.

Algo bastante habitual, cuando sequiere abordar una migración, es apro-vechar para “migrarlo todo”. Cambia-mos el hardware, y además, pasamos de32 a 64 bits, aprovechamos para actua-lizar la versión de Sistema Operativo yde paso migramos la versión de SQLServer. Y queremos que todo esto seacasi transparente y que funcione a laprimera. Desde nuestra experiencia, trasmultitud de proyectos de migración,

creemos que se deben limitar este tipode escenarios y tratar cada cambio comoun proyecto de actualización diferente,puesto que cada uno de los puntos men-cionados, pueden ser fuentes de pro-blemas y pueden afectar al comporta-miento de nuestras aplicaciones basa-das en SQL Server.

Consideraciones sobre las opciones de migraciónPara tomar la decisión de que meca-nismo de migración es el más adecua-do para en determinado entornos, debe-mos tener en cuenta, entre otras, lassiguientes consideraciones:

• Minimizar el tiempo de parada. Pla-nificar cuál va a ser el tiempo duranteel que tengamos disponible nuestra ins-tancia de SQL Server es –probable-mente– uno de los aspectos más impor-tantes de una migración. No todas lasopciones tienen el mismo nivel de para-da, y si este tiempo es crucial para noso-tros, deberemos pensar bien cuál es lamejor opción. En términos generales,el Asistente de copia de base de datos,es el mecanismo menos impacta en eltiempo de parada.

• ¿Y la vuelta atrás? Ya saben: si algopuede ir mal..., irá mal, así que másvale prevenir que curar. Es impor-tante definir un plan de vuelta atrás,en caso de que la actualización a SQLServer 2008 no vaya todo lo bien quedebería. Planificar una vuelta atrás,no es igual de sencillo en todos losescenarios. Obviamente, en unaactualización in-place, no existe vuel-ta atrás. Estamos actualizando la ins-tancia en SQL Server 2000 o SQLServer 2005 a SQL Server 2008 y sialgo va mal, no tenemos otra opciónmás que desinstalar SQL 2008, re-instalar la versión anterior y restau-rar las bases de datos. Sin embargo,en una migración Side-By-Side, siem-pre dispondremos de la versión ante-rior para volver atrás, lo que nos pro-porciona mayor protección ante cual-quier posible problema. Sin embar-go, es posible que, si no hemos hecho

Figura 1. Asistente de copia de seguridad de base de datos

Page 45: dotNetManía · nº 53 noviembre 2008 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX • Silverlight • .NET Framework dotNetManía LINQ to SQL y N-Capas: esto es

dotN

etM

anía

<<

45

dnm.servidores.sql<<

las pruebas correspondientes, nosencontremos con algún problema untiempo después de la actualización,cuando ya hayamos puesto en pro-ducción nuestro sistema y los datoshayan sufrido modificaciones. Obvia-mente, la mejor solución a este posi-ble problema es realizar unas pruebassuficientemente completas antes dedar la actualización por finalizada.Pero en todo caso, es posible imple-mentar sistemas de replicación, demodo que se vayan replicando loscambios que se realizan en SQL Ser-ver 2008, en la versión anterior, y deese modo, si es necesario realizar unavuelta atrás, podamos hacerlo sin pro-blema.

• Mis aplicaciones cliente. ¿Qué ocu-rre con las aplicaciones cliente? Comoera de esperar, SQL Server 2008 man-tiene compatibilidad con anterioresopciones de acceso a datos. Solo en elcaso de que tengamos instalado lasherramientas cliente de SQL Serveren nuestros clientes, o estemos utili-zando el SQL Native Client, necesi-taremos actualizar dichos componen-tes en los equipos desde los que acce-derán las aplicaciones.

Niveles de compatibilidad de base de datosUna de las características más importan-tes para mantener compatibilidad con ver-siones anteriores de SQL Server, es lapropiedad de base de datos denominadaNivel de compatibilidad. Este nivel decompatibilidad nos permite mantener elcomportamiento de SQL Server, a nivelde base de datos, de igual forma que enversiones anteriores. Esta opción, deberíaser temporal. Está pensada para poderrealizar la migración y retrasar algunoscambios en nuestras bases de datos, y nopara que vayamos arrastrando ese nivelde compatibilidad entre nuestras actua-lizaciones, simplemente para asegurarnosde que las cosas funcionan correctamen-te, porque además, no podremos sacarpartido a las mejoras que SQL Serverincorpore en los nuevos niveles de com-patibilidad. SQL Server no cambiará de

forma automática el nivel de compatibi-lidad de nuestras bases de datos de usua-rio, a no ser que alguna de ellas esté ennivel de compatibilidad 70 (el corres-pondiente a SQL Server 7.0), puesto queese nivel de compatibilidad deja de estarsoportado en SQL Server 2008 (tantosolo se soporta el 80, 90 y 100) y se actua-lizará automáticamente a nivel de com-patibilidad 80.

Si realizamos una actualización in-place, SQL Server actualizará el nivel decompatibilidad de todas las bases de datosde sistemas, excepto de la base de datosmaster, que mantendrá el nivel de com-patibilidad que tenía antes de la actuali-zación. Las nuevas bases de datos quetengamos, siempre heredarán el nivel decompatibilidad de la base de datos model,al igual que el resto de opciones.

SQL Server 2008 UpgradeAdvisorEs la herramienta imprescindible, que nospermitirá investigar instancias de SQLServer 2000 y SQL Server 2005 para ana-lizar el impacto de una posible migracióna SQL Server 2008. Nos reportará aque-

llas configuraciones que puedan dar lugara conflictos de actualización, y además,nos permite analizar también trazas yscripts de SQL Server, por lo que podre-mos analizar tanto el código embebido ennuestras aplicaciones como los scripts queestemos ejecutando en las versiones ante-riores. Y además, nos proporciona ayudasobre varios problemas que no pueden serdetectados por el propio asistente, pero

que se nos muestran como checklist paraque podamos comprobar si nos encon-tramos ante esta situación. Y lo que esmejor, siempre se nos da la solución, lospasos que debemos dar para poder actua-lizar a SQL Server 2008.

A pesar de que esta herramienta estádisponible con la instalación de SQLServer 2008, lo recomendable es buscarla última versión en la Web de Micro-soft, puesto que se está actualizandocontinuamente con nuevos problemasdetectados, aunque de todos modos,desde la propia herramienta podemoscomprobar si existen actualizaciones.

Este asistente se hace indispensablepara cualquier tipo de proyecto deactualización o migración. Entre otrascosas nos permite revisar las opciones“deprecadas” y las que cambian de com-

Figura 2. Niveles de compatibilidad de bases de datos

Page 46: dotNetManía · nº 53 noviembre 2008 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX • Silverlight • .NET Framework dotNetManía LINQ to SQL y N-Capas: esto es

dotN

etM

anía

<<

46

dnm.servidores.sql<<

portamiento, así como evaluar la posibilidad de subirel nivel de compatibilidad de nuestra base de datos,puesto que nos dirá específicamente qué problemasnos podemos encontrar si subimos ese nivel de com-patibilidad.

Tareas post-migración

Una vez hemos actualizado nuestras bases de datos,debemos realizar algunas tareas de mantenimiento,básicamente:

• Al menos, actualizar las estadísticas, utilizandoel comando sp_updatestats con el fin de actua-lizar estadísticas de las tablas de usuario.

• Actualizar la cuenta de filas y páginas de nues-tras bases de datos, a través del comando DBCC UPDA -TEUSA GE.

• Si disponemos de índices de texto, rellenar denuevo dichos índices.

• Revisar la posibilidad de aumentar el nivelde compatibilidad de nuestras bases de datos.

Recuerde que SQL Server no lo aumentará pornosotros.

Y sobre todo recuerde: todo el tiempo que dedi-quemos a planificar y probar nuestra actualizaciónserá tiempo que nos ahorraremos a la hora de inten-tar resolver problemas una vez realizada la migracióny evitar la presión de hacer funcionar nuestras apli-caciones.

Migración de un clúster SQLServerSi disponemos de un clúster de tole-rancia a fallos en una instancia de SQLServer, debería ser porque necesitamosproporcionar un servicio ininterrum-pido a las aplicaciones cliente (lo que sedenomina disponibilidad 24x7). Es porello, que todos los procesos de actuali-zación o migración deben planificarseadecuadamente, poniendo especialinterés en los tiempos de parada nece-sarios para dar soporte a dicho proce-so de actualización en el menor tiem-po posible y manteniendo la disponibi-lidad del servicio. En el caso de unaactualización side-by-side, las considera-ciones a tener en cuenta son las mismasque para el resto de escenarios, no debe-mos tener ninguna consideración adi-

Figura 3. Componentes para comprobardesde el SQL Server Upgrade Advisor

Figura 4. Informe de ejemplo de SQL Server Upgrade Advisor

Si deseas instalar SQL Server 2008 UpgradeAdvisor en un equipo que no tenga SQL Server2008 instalado, debes asegurarte de que ese equi-po tiene instalado Windows Installer 4.5, que seinstala como requisito durante la instalación deSQL Server 2008.[ ]NOTA

Page 47: dotNetManía · nº 53 noviembre 2008 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX • Silverlight • .NET Framework dotNetManía LINQ to SQL y N-Capas: esto es

dotN

etM

anía

<<

47

dnm.servidores.sql<<

cional en el caso de que la instancia estéo no esté en un clúster de tolerancia afallos, puesto que al tratarse de instan-cias diferentes, disponemos de mayor fle-xibilidad a la hora de escoger el momen-to de cambio y controlar las paradas. Sinembargo, en el caso de una actualizaciónin-place sí debemos tener en cuenta algu-nas consideraciones.

Lo primero que debemos de teneren cuenta es que el proceso de actuali-zación desde el asistente de instalación,se realizará en un nodo cada vez. Deeste modo, aunque el proceso será másengorroso, dispondremos de mayorcontrol sobre el comportamiento denuestro clúster y podremos manejaradecuadamente los tiempos de no-dis-ponibilidad del servicio, balanceandoentre los nodos cuando sea necesario.En SQL Server 2008 se ha mejoradoeste proceso, permitiéndonos decidircómo queremos que el clúster balanceedurante la instalación.

Durante el proceso de actualizaciónde un clúster SQL Server 2000 o SQLServer 2005, debemos pensar y diseñar elmecanismo de failover que deseamos uti-lizar durante la instalación, con el objeti-vo de minimizar el tiempo de parada. Lasopciones que nos proporciona son:

• Hacer failover a un nodo ya actuali-zado. Seleccionando esta opción, elprograma de instalación realizará fai-lover a alguno de los nodos del clús-ter que ya esté actualizado.

• Hacer failover a un nodo no actuali-zado. Con esta opción, el programade instalación realizará failover a algu-no de los nodos del clúster quetodavía no está actualizado

• Si estamos actualizando un clúster deun solo nodo, el programa de insta-lación deberá de poner offline losrecursos del clúster SQL Serverdurante la instalación.

A través de estas configuraciones,disponemos de la posibilidad de deci-dir cómo queremos que se comporteel clúster de SQL Server durante elproceso de actualización. El princi-pal objetivo es minimizar el tiempode parada de servicio. Tal y comohemos comentado, y al realizarse la

actualización en un nodo en cadamomento, deberemos ir alternandoentre las dos opciones, dependiendodel nodo que estemos actualizando encada momento y del número total denodos que conformen el clúster aactualizar.

Bases de datos en mirroring

Si disponemos de un sistema de alta dis-ponibilidad con mirroring configurado,debemos analizar cuál es el mejor meca-nismo para realizar la migración con elmenor tiempo de parada, realizando unaactualización gradual. Para ello realiza-remos los siguientes pasos:• Configuraremos el mirror en modo

de Alta-Seguridad.• Quitaremos el testigo de la sesión de

mirroring.• Actualizamos los servidores que están

actuando como espejos.• Una vez actualizados los espejos, reali-

zamos un failover manual desde el ser-vidor principal a uno de los espejos.

• Actualizar el servidor que actuaba deprincipal al comienzo.

• Realizar el failover manual.• Actualizar el testigo.• Unir el testigo a la sesión de mirroring.• Configurar el modo de funciona-

miento del mirror tal y como estabaal comienzo de la migración.

Para obtener todos los detalles conun paso a paso incluido visita http://msdn.microsoft.com/es-es/library/bb677181.aspx.

Sistemas con trasvase deregistros o Log ShippingEn aquellos escenarios en los que dis-pongamos de un sistema de alta disponi-bilidad utilizando trasvase de registros,debemos tener en cuenta algunas consi-deraciones a la hora de realizar la actuali-zación de dichos escenarios. Fundamen-talmente deberemos de considerar:• La instancia que está actuando como

monitor, puede actualizarse en cual-quier momento.

• Deberemos actualizar siempre los ser-vidores secundarios, puesto que unacopia de seguridad de una base datosrealizada en SQL Server 2008, nopuede ser restaurada en una instan-cia de SQL Server 2005 ni de SQLServer 2000, pero sí al contrario.

• Una vez actualizados los secundarios,procederemos a actualizar el servidorprimario.

Figura 5. Actualización de un clúster de dos nodos

Page 48: dotNetManía · nº 53 noviembre 2008 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX • Silverlight • .NET Framework dotNetManía LINQ to SQL y N-Capas: esto es

dotN

etM

anía

<<

48

dnm.servidores.sql<<

Con los pasos descritos con anterio-ridad, el tiempo de parada durante laactualización será el tiempo empleadodurante la migración del servidor princi-pal. Durante ese intervalo de tiempo, noproporcionaremos servicio a nuestras apli-caciones cliente. Si deseamos reducir esetiempo de parada, podríamos realizar unfailover a uno de los servidores secunda-rios, antes de proceder con la instalacióndel servidor principal. De este modo, eltiempo de parada tan solo será el tiemponecesario para realizar ese failover. Paraun paso y paso y buenas prácticas en lamigración de un entornos con trasvase deregistros visite http://msdn.microsoft.com/es-es/library/cc645954.aspx.

Bases de datos con índices de textoSQL Server 2008 proporciona una nue-va arquitectura de Full-Text, completa-mente integrada con el motor de base dedatos, aunque el equipo de desarrollo harealizado un gran esfuerzo para que loscambios de arquitectura no tenganimpacto en la sintaxis utilizada en las con-sultas, lo que es de agradecer. Uno de losprincipales problemas que vamos a sufrircuando abordamos una migración debases de datos que disponen de índicesde texto, radica en el hecho de que esnecesario realizar una re-indexación

completa de dichos índices, lo que encondiciones normales, suele ser una ope-ración de horas y con gran consumo derecursos. Es por ello que en SQL Server2008, se ha incorporado una opción deconfiguración, a nivel de instancia, conla que podemos controlar el comporta-miento de estos índices de texto. Estaopción se denominada Full-Text Upgra-de Option. Las opciones que tenemos deconfiguración son:• Import. Es la opción predetermi-

nada, a través de la cual, se importael contenido de los índices de textoen la migración. Esta opción solo es

posible si la base de datos que esta-mos actualizando es una base dedatos SQL Server 2005, no está dis-ponible para bases de datos SQLServer 2000. Si esta opción está con-figurada para una base de datos SQLServer 2000, se reconstruirán losíndices de texto. La opción deimportación es mucho más rápidaque la reconstrucción de los índices,sin embargo, no podremos disponerde las mejoras introducidas por SQLServer 2008.

• Reset. Con esta opción, creamos losíndices de texto en la base de datosSQL Server 2008, pero estaránvacíos. Ni se importan los datos, nise reconstruyen los índices. Está pen-sado para aquellos escenarios en losque necesitan una rápida disponibi-lidad de la base de datos y en la querealizaremos después el llenado delos índices.

• Rebuild. Con esta opción se recons-truyen completamente los índicesde textos, lo que –como comenta-mos con anterioridad– es una ope-ración que consume recursos de for-ma intensiva y que en escenarios enproducción, con gran cantidad deinformación indexada, puede tardarhoras.

A través de estas configuraciones,disponemos de diferentes opciones, que

Figura 6. Configuración de Log Shipping en SQL Server 2008

Figura 7. Opción de configuración para la actualización de bases de datos con índices Full-Text

Page 49: dotNetManía · nº 53 noviembre 2008 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX • Silverlight • .NET Framework dotNetManía LINQ to SQL y N-Capas: esto es

dotN

etM

anía

<<

49

dnm.servidores.sql<<

nos permiten manejar el comporta-miento de los índices de texto, lo quenos permite controlar cómo queremosrealizar la migración de estas bases dedatos. Uno de los aspectos que debe-mos tener en cuenta a la hora de deci-dir el mecanismo a utilizar, son loscambios introducidos en los Word Bre-akers. Microsoft ha mejorado algunosde estos Word Breakers, lo que tiene unarelevancia importante en las actualiza-ciones, puesto que si decidimos impor-tar los índices de texto, éstos estaránindexados con unWord Breaker dife-rente al utilizado para realizar la bús-queda, por lo que los resultados pue-den ser diferentes a los obtenidos enversiones anteriores. Para un listado dequé Word Breakers han cambiado y cuá-les no puede visitar http://msdn.micro-soft.com/en-us/library/ms142509.aspx.

Otro de los aspectos importantes, ala hora de actualizar bases de datos coníndices de texto, radica en los ficherosde Thesaurus y los ficheros de ruido.Estos componentes no se actualizarán,por lo que si hemos realizado modifi-caciones en ellos, deberemos volver arealizarlas en la instancia de SQL Ser-ver 2008. En el caso de los ficheros deruido, éstos son reemplazados por lasStop Lists y Stop Words, que realizan elmismo papel, pero que pueden mane-jarse a través de sentencias DDL y grá-ficamente desde SQL Server Manage-ment Studio, en lugar de tener que tra-bajar con ficheros de texto.

¿Y qué ocurre con SQL Express?

Seguro que muchos de ustedes disponende aplicaciones que están utilizando la ver-sión gratuita de SQL Server, ya seaMSDE 2000 o SQL Server Express 2005.¿Debemos tener alguna consideraciónespecial a la hora de migrar estas instan-cias? Pues sí, si lo que queremos es reali-zar una actualización in-place. En el casode MSDE 2000, si hemos utilizado elmétodo de instalación de Merge Module,como parte de la instalación de nuestraaplicación, el instalador de SQL Server2008 no será capaz de detectar dicha ins-talación (igual que no lo era el de SQL

Server2005), puesto que esa instancia for-mará parte de la instalación de otro apli-cación. No habrá ningún problema en elcaso de que la instalación de MSDE sehaya realizado de modo independiente,ésta será detectada por el programa de ins-talación y podremos actualizarlo comocualquier otra edición de SQL Server. Losrecursos que puede gestionar la versiónSQL Server 2008 Express son mayoresque los de las versiones anteriores, por loque no encontraremos ningún inconve-niente en ese sentido.

Si lo que deseamos realizar es unaactualización side-by-side, no existe ningu-na consideración adicional a tener encuenta. Podemos utilizar cualquiera de lasopciones descritas en el anterior artículoal igual que en el resto de ediciones,teniendo en cuenta que la edición SQLServer 2005 Express with Advanced Ser-vices, puede tener bases de datos con índi-ces de texto y una instancia de ReportingServices instalada, por lo que deberemostener en cuenta las consideraciones paraestos componentes en ese caso.

Hemos dejado para un nuevo artículolas peculiaridades en la migración de ins-tancias de SQL Server que utilicen com-ponentes de la pila de Inteligencia de Nego-cio de SQL Server, tales como Analysis Ser-vices, Integration Services y Reporting Ser-vices. Estas migraciones las abordaremosen el siguiente número.

Figura 8. Upgrade Advisor en una instancia de SQL Server Express

Cumulative update package 1 para SQL Server 2008

El pasado 23 de septiembre se liberó el primer paquete acumulativo de actualiza-ciones para SQL Server 2008 que incluye todos los parches liberados hasta el momen-to. Pueden encontrar toda la información sobre los parches incluidos en este paque-te aquí http://support.microsoft.com/kb/956717. Como podrá observar, algunos de ellos sonproblemas encontrados durante el proceso de actualización/migración de las ins-tancias de SQL Server. Es importante señalar que estos paquetes acumulativos inclu-yen todos los parches, para todos los idiomas, pero obviamente, solo instalan los par-ches de los componentes instalados en ese momento. Es decir, en el caso de quenosotros no tengamos instalado, por ejemplo, SQL Server Reporting Services, no seinstalarán los parches relativos a Reporting Services. Si posteriormente nosotros ins-talamos ese componente, tenemos que volver a instalar el paquete.

Si tiene interés en saber el porqué de estos parches acumulativos, y los dife-rentes tipos de actualizaciones que puede esperar de SQL Server, puede encon-trar más información sobre el modelo de servicio del equipo de SQL Server eneste enlace: http://support.microsoft.com/kb/935897.

Page 50: dotNetManía · nº 53 noviembre 2008 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX • Silverlight • .NET Framework dotNetManía LINQ to SQL y N-Capas: esto es

Uno de los problemas más importantes en la ges-tión de proyectos software suele ser la definiciónerrónea de los procesos que intervienen en el desa-rrollo y mantenimiento de las aplicaciones.

Como se puede observar en el gráfico de la figu-ra 1, el número de proyectos abortados ha ido des-cendiendo progresivamente en la última década, sinnotarse una subida en el mismo porcentaje de losproyectos terminados con éxito, los cuales parecenestar estancados en un valor del 28-29%.

Analizando la situación de dichos proyectosse llega a la conclusión de que parece que algofunciona mal en el desarrollo de software cuan-do no se aprecia una evolución positiva en la con-clusión de los proyectos iniciados. El problema

de los desarrollos lo encontramos en el procesoque siguen las compañías para crear las aplica-ciones solicitadas.

Sin dejar a un lado nuestra parte de culpa comomiembros del equipo de gestión de proyectosdebemos tener en cuenta otro factor muy impor-tante en que los proyectos se concluyan en tiem-po, coste y alcance. Este factor se refiere directa-mente al cliente que contrata el desarrollo.

El cliente ofrece opiniones que nos deben hacerreflexionar como:

• No hay visibilidad del estado del proyecto.• No hay comunicación efectiva.• Es difícil equilibrar demandas y riesgos.• Es necesario proyectos de desarrollo ligeros.• Se echan en falta pruebas más exhaustivas

del producto.

Para mejorar los procesos seguidos para el desa-rrollo de software contamos con CMMI (CapabilityMaturity Model Integration), modelo propuesto porel SEI (Software Engineering Institute).

• Diseñado originalmente para contratos delgobierno de EE.UU.

• Está basado en el diseño de procesos de pro-ducción.

• Se puede auditar mediante métricas.• Incluye mucha documentación a entregar.

Integración de CMMI en Visual Studio Team System

ALManía

Ángel M. Rayo es forma-dor en AAlhambra-Eidos.Ángel tiene las certifica-ciones de MCITP, MCTS,

ITILF v2 y v3.

La certificación CMMI permite a las empresas presentarse a los clientes comouna organización que lleva a cabo unos procesos bien estructurados y con unseguimiento continuo. Está demostrado que las empresas que trabajan con pro-cesos bien definidos y optimizados consiguen mejores resultados en sus proyec-tos y sobretodo consiguen lo más importante “La satisfacción de los clientes”.Team System permite trabajar con CMMI en los entornos de desarrollo .NET

Ángel M. Rayo

Figura 1. Éxito de los proyectos (Fuente: The Standish Group International)

Page 51: dotNetManía · nº 53 noviembre 2008 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX • Silverlight • .NET Framework dotNetManía LINQ to SQL y N-Capas: esto es

dotN

etM

anía

<<

51

dnm.ALManía<<

CMMI v1.2 está dividida en tres constelaciones:• CMMI para el Desarrollo (CMMI-DEV) v 1.2

desde agosto de 2006.• CMMI para la Adquisición (CMMI-ACQ) v

1.2 desde noviembre de 2007.• CMMI para los Servicios (CMMI-SVC) en

borrador.

Dentro de la constelación CMMI-DEV, que es laque nos ocupa, se ofrecen 2 modelos (CMMI-DEVy CMMI-DEV + IPPD (Integrated Product and Pro-cess Development).

Actualmente existen unas 2.500 organizaciones eva-luadas a nivel mundial en su implantación CMMI, delas cuales un 33% corresponden a nivel 2, un 44% a nivel3, un 5% a nivel 4 y un 19% a nivel 5. En España elnúmero actual de empresas evaluadas llega a unas 70.

El modelo CMMI-DEV 1.2 viene definido por22 áreas de procesos las cuales se pueden representarde dos maneras: continua y escalonada.

La representación escalonada ofrece la visión decada una de las áreas de proceso con sus componen-tes (objetivos genéricos/específicos, prácticas genéri-cas/específicas) mientras que la representación con-tinua define 6 niveles de madurez para medir la capa-cidad de nuestros procesos:

0. Incompleto1. Ejecutado/Realizado

No hay control en los procesos por lo que elresultado de nuestros proyectos no es prede-cible y se realiza sin una planificación inicial.

2. GestionadoSe cumple con los objetivos del proyecto al con-tar con una planificación de tareas y recursos.

3. DefinidoSe desarrollan una serie de procesos quecubren las principales áreas de diseño.

4. Cuantitativamente gestionadoTodos los aspectos de un proceso poseen métri-cas que permiten controlarlo.

5. OptimizandoMejora continua de los procesos.

Uno de los problemas con los que se han encon-trado las empresas dedicadas al desarrollo de softwa-re es que no contaban con una herramienta que lesofreciese la posibilidad de llevar a cabo cada una delas áreas de proceso definidas por sus actividades yobjetivos.

Microsoft, dándose cuenta de esta situación, deci-dió salir al rescate de sus desarrolladores, reinven-tando sus principales productos orientados al desa-rrollo de software (Visual Studio, Project, Visio y elpaquete Office) para facilitar esta implantación deCMMI.

CMMI se trata de un framework pesado (enten-der pesado como contrario a ágil) por lo que puedesuponer una traba a la hora de implantarlo.

Microsoft ha decidido incorporar a sus herra-mientas de desarrollo orientadas a la plataforma .NET(Visual Studio y Team Foundation Server principal-mente) su modelo MSF (Microsoft Solutions Frame-work) para integrarlo en CMMI con lo que obten-dremos una interpretación “ágil”.

MSF se trata de un conjunto integrado y confi-gurable de procesos de desarrollo software, princi-pios y prácticas ya probadas. A la hora de crear pro-yectos de equipo en Team Foundation Server a travésdel Team Explorer de Visual Studio, deberemos ele-gir qué conjunto de procesos nos van a guiar en nues-tro desarrollo, ofreciendo Visual Studio Team Sys-tem dos plantillas configurables como son MSF paraCMMI y MSF para el desarrollo ágil.

Las plantillas MSF ofrecen los siguientes proce-sos relacionados con CMMI:

• MSF para el desarrollo ágil:Pruebas funcionales y de exploración, pla-nificación de las iteraciones, desarrolloorientado a pruebas, arquitectura oculta,pruebas dirigidas por el coste.

• MSF para CMMI:Las que incluye MSF para el desarrollo ágil.Solicitudes de cambio, revisiones formales,análisis de requisitos, actividades de mejo-ra de procesos, aprobaciones.

Equiparando los procesos de la plantilla MSF paraCMMI y los niveles de madurez de CMMI, obtendría-mos la representación que puede ver en la figura 3.

De momento, la versión de CMMI asociada a laplantilla MSF para CMMI es la 1.1 esperando que selibere a corto plazo la correspondiente a la versión 1.2de CMMI.

Figura 2. Herramientas de desarrollo Microsoft

Page 52: dotNetManía · nº 53 noviembre 2008 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX • Silverlight • .NET Framework dotNetManía LINQ to SQL y N-Capas: esto es

La plantilla MSF para CMMI inclu-ye 200 actividades, con 50 documentosasociados y 50 consultas automatizadase informes.

El método SCAMPI (Standard CMMIAppraisal Method for Process Improvement)se trata del método propuesto por el SEIpara ofrecer medidas de rendimiento aso-ciadas a los modelos de CMMI. SCAM-PI se utiliza para localizar las fortalezas ydebilidades de nuestros procesos actuales,revelar riesgos de desarrollo o adquisicióny determinar los niveles de madurez denuestra organización.

Con SCAMPI se obtiene un modelode valoración de nuestros procesos cimen-tado en evidencias directas e indirectasutilizando como elemento de gestión lapropia documentación de los proyectos.

Podemos valorar nuestros procesosmediante múltiples herramientas free-ware disponibles a través de Internet.Entre ellas se encuentra la herramien-ta Appraisal Assistant disponible enhttp://www.sqi.gu.edu.au/A ppraisa-lA ssistant/about.html.

En la guía de MSF para CMMI sedetallan las actividades que resaltan evi-dencias para SCAMPI (figura 4).

Las plantillas incluidas en VisualStudio Team System 2005 y 2008 sonpersonalizables, contando incluso conla posibilidad de utilizar plantillas defi-nidas por partners de Microsoft o crearnuestras propias plantillas que identifi-quen los procesos que lleva a cabo nues-tra organización.

En las plantillas de procesos se defi-nen los siguientes elementos:

• Work items.- Tipos.- Workflow.- Campos.

• Áreas e eteraciones.• Control de código fuente.• Documentos.• Informes.• Gestión de usuarios, grupos y

permisos.

Todos estos elementos se encuentrandefinidos por ficheros XML que mantie-nen su estructura organizativa (campos,tipos de datos y validaciones). Lo mismosucede con la propia plantilla de procesos,la cual está vinculada acada elemento median-te referencias al resto deficheros XML.

Los work itemsestán relacionados conlos entregables denuestros proyectos:requisitos, tareas, fa -llos, solicitudes decambio, escenarios…En el caso de CMMI,se encuentran defini-dos los siguientes tiposde work items:

• Bug: representa unproblema o poten-cial problema ennuestra aplicación.

• Change Request: representa una pro-puesta de cambio en nuestra aplicación.

• Issue: representa una situación quepodría bloquear o está bloqueandoel trabajo.

• Requirement: representa una descrip-ción de lo que nuestra aplicacióndebería incluir para resolver el pro-blema del cliente. Todos los requisi-tos definen el alcance del proyecto.

• Review: representa los resultados deuna revisión de código, diseño odespliegue.

• Risk: representa un posible evento ocondición que podría tener un impac-to negativo o positivo en el proyecto.

• Task: representa la necesidad de quealgún recurso del equipo realice untrabajo.

dotN

etM

anía

<<

52

dnm.ALManía<<

Figura 3. MSF para CMMI vs Niveles de Madurez Figura 4. Área de Proceso con actividades SCAMPI

Figura 5. Process Editor

Page 53: dotNetManía · nº 53 noviembre 2008 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX • Silverlight • .NET Framework dotNetManía LINQ to SQL y N-Capas: esto es

dnm.ALManía<<

Si queremos crear nuestros work itemspersonalizados, podemos utilizar el edi-tor de work items incluido en las PowerTools de Team Foundation Server.

De cara a la creación del proyectosoftware en sí debemos considerar lassiguientes situaciones:

• ¿Hay integración entre los miembrosdel equipo?

• ¿Tienen herramientas que sopor-tan una integración personalizada?

• ¿Obliga a un cambio en la forma detrabajar de nuestros recursos?

Con Team Suite, Microsoft nosofrece una edición de Visual Studioorientada a cada uno de los roles delequipo (puede encontrar informacióndetallada en el número de octubre dedotNetManía, monográfico de ALM):

• Edición para arquitectos.• Edición para desarrolladores.• Edición para profesionales de bases de

datos.• Edición para responsables de pruebas.

Cada una de las ediciones tienencomo funcionalidad base la de la edi-ción Profesional de Visual Studio, inclu-yendo además complementos para cadarol (diagramas de aplicaciones, de cla-ses, de sistemas, pruebas unitarias, decarga, comparación de esquemas…).

Con estas ediciones se consigueofrecer aquello que necesita cada rol enuna herramienta común para todos losmiembros. Para la integración entrecada uno de ellos se encuentra TeamFoundation Server con la herramientaTeam Explorer instalada en cada equi-po, permitiendo que cada miembropueda actualizar work items, definir nue-vos requisitos, establecer períodos deconstrucción y pruebas software, etc.

Los miembros que ocupen el rol deresponsables de proyecto pueden echaren falta las funcionalidades incluidas enMicrosoft Project, pero no se debenpreocupar, ya que Project también seencuentra integrado con Team Foun-dation Server, pudiendo asociar tareas

a work items o incluso descargar median-te los servicios Web de Team FoundationServer el listado de work items a la vistade tareas de Project.

Si vemos al principio del artículo, lasquejas o sugerencias que tenían los clien-tes relativos a integración, pruebas oseguimiento, veremos que por lo vistohasta ahora, los clientes siguen igual dedespistados debido a que no vamos a obli-gar a nuestros clientes a utilizar una herra-mienta como Visual Studio orientada almundo del desarrollo de software.

Microsoft, al darse cuenta de quecontaba con todo el equipo de proyec-to integrado, informado y colaborati-vo, decidió incluir al cliente dentro dela gestión del proyecto para que actua-ra de manera reactiva, a partir de losdatos facilitados por los informes pre-sentados, y de manera proactiva, tenien-do la posibilidad de añadir comentariosa las diferentes versiones construidas dela aplicación, a los requisitos o a losdocumentos de los proyectos.

Page 54: dotNetManía · nº 53 noviembre 2008 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX • Silverlight • .NET Framework dotNetManía LINQ to SQL y N-Capas: esto es

dotN

etM

anía

<<

54

dnm.ALManía<<

Si contamos con toda la infraes-tructura necesaria: informes, docu-mentos, elementos de trabajo, compi-laciones y pruebas, solo nos faltaofrecérsela al cliente. Para esto,Micro soft ofrece la herramienta VisualStudio Team System Web Access,consistente en una aplicación Web,que se conecta con Team FoundationServer y permite al cliente del pro-yecto realizar un seguimiento de todaslas actividades llevadas a cabo o pen-dientes, revisar los entregables con-tando con la posibilidad de incluircomentarios en las revisiones de códi-go o añadir nuevas necesidades.

Esto siempre se deberá permitirde manera controlada para evitar queel cliente se adueñe del proyecto y nosañada o quite funcionalidades o nece-sidades a su antojo, ya que al final, la planificación,los costes y la asignación de recursos se va a ver afec-tada en mayor o menor medida.

Con la integración del cliente dentro de la ges-tión del ciclo de vida de las aplicaciones, habremoscerrado el círculo que permite mantener una inte-gración completa entre todos los interesados de unproyecto software siguiendo el modelo de roles defi-nido en MSF (figura 6).

Utilizando este modelo de roles y las herra-mientas ya comentadas: Visual Studio Team Sys-tem con su edición dirigida a cada rol (arquitecto,desarrollador, responsable de pruebas, responsablede bases de datos), Team Foundation Server (con-

trol de versiones, construcciones, pruebas (unita-rias, de carga, ordenadas, cobertura de código,Web), informes y pruebas), SQL Server (almace-namiento de la infraestructura de TFS), Team Sys-tem Web Access (seguimiento del estado de los pro-yectos a través de Web) y el Editor de procesos,conseguiremos cubrir todas las tareas del ciclo devida propuesto por MSF, en la figura 7.

Si a esto le añadimos la realización de las prácti-cas genéricas y específicas de cada área CMMI de lasdiferentes áreas de procesos correspondientes, con-seguiremos cumplir con los objetivos de nuestros pro-yectos en tiempo y coste adecuados, teniendo tam-bién la capacidad, según vayamos avanzando en nues-tro nivel de madurez CMMI, de mejorar nuestrosprocesos en el desarrollo de software.

Podemos encontrar más información acerca delas diferentes áreas de proceso y sus actividades y finesen las siguientes ubicaciones:

1. CMMI for Development versión 1.2:http://www.sei.cmu.edu/publications/documents/06.reports/06tr008.html

2. Browser CMMI: http://www.cmmi.de/cmmi_v1.2/browser.html#hs:CA R

3. Team Development with Visual Studio Team Foun-dation Server: http://msdn.microsoft.com/en-us/library/bb668991.aspx

4. Visual Studio Team System: http://msdn.microsoft.com/es-es/vsts2008/products/default.aspx

Figura 6. Modelo de Roles MSF

Figura 7. Ciclo de vida de las aplicaciones según MSF

Page 55: dotNetManía · nº 53 noviembre 2008 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX • Silverlight • .NET Framework dotNetManía LINQ to SQL y N-Capas: esto es

dotN

etM

anía

<<

55

Antes de nada, una Dependency Property (DP, des-de ahora) es solamente una propiedad. Pero algu-nas características heredadas del contexto de WPF,le hacen aparecer un tanto especial. La segundacuestión es que las DP son de interés principal-mente para desarrolladores de controles. Si el códi-go que escribes no incluye controles de usuario opersonalizados, probablemente, te puedes olvidardel asunto.

Las DP fueron introducidas por WPF comouna facilidad para permitir la definición de esti-los, DataBinding, y otras características avanzadas.Y también para potenciar la programación decla-rativa directamente desde XAML.

Una DP, “depende” de múltiples proveedorespara determinar su valor en un instante dado. Com-parada con una propiedad clásica, una DP no tienesu valor almacenado en un contenedor controladopor el desarrollador. Tampoco tiene un proveedorsimple de datos, tal como un campo fijo en la imple-mentación del control. Vamos a comparar las imple-mentaciones de ambos. El código del listado 1 esuna propiedad estándar.

El valor asociado con la propiedad puede alma-cenarse en un miembro privado o ser escrito o leí-do de algún otro objeto, tal como una propiedad deun elemento visual. En el código, la propiedad Sym-

bolName, debe su valor a la propiedad Text de la cajade texto TextSymbol.

En las DP, el contenedor del dato no se estable-ce ni controla explícitamente por el programador.La implementación típica de la misma propiedadcomo DP puede verla en el listado 2.

GetValue y SetValue son métodos definidos en laclase base de los controles, para leer de (y escribiren) su contenedor cualquier valor dado. Estos méto-dos nos aíslan de los detalles de dónde y cómo vie-ne exactamente ese valor. Digamos que el runtimede WPF contiene un proveedor que se encarga decualquier tarea de almacenamiento relativa a pro-piedades declaradas como DP.

Programacióncon WPF

Dino Esposito

Arquitecto en IDesign,Dino Esposito es una delas autoridades mundia-les reconocidas en tec-nologías Web y arqui-

tectura de software. Suslibros más recientes son"Programming ASP.NET3.5-Core Reference" e"Introducing Microsoft

ASP.NET AJAX" (Micro-soft Press). Es ponente

regular en eventos de laindustria de ámbito

mundial, como TechEd oDevConnections, y

europeos, como Dev-Week y Basta.

Me he encontrado con el tema de las Propiedades de Dependencia (Dependency Properties) en WPF. Es un concepto que nunca escuché antes en 20 años como programador. He leído algunas descripciones del concepto, pero parecen escritas por la misma gente que lo programó.¿Puede arrojar algo de luz al respecto?

public string SymbolName{

get{

return this.txtSymbol.Text;}set{

this.txtSymbol.Text = value;}

}

todonet@qa

WPF y Silverlight 2 tienen mucho en común respecto a sus modelos de programación. Sinembargo, Silverlight no debiera ser considerada como una plataforma para portabilidad decódigo existente en WPF a la Web. Es una plataforma Web para escribir aplicaciones ricasusando una aproximación sintáctica similar a la de WPF. En esta sección, vamos a revisar unpar de problemas de programación que implican a programadores de WPF y Silverlight.

tod

otN

et.q

a@

dot

net

mania

.com

Listado 1

Page 56: dotNetManía · nº 53 noviembre 2008 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX • Silverlight • .NET Framework dotNetManía LINQ to SQL y N-Capas: esto es

dotN

etM

anía

<<

56

Además de suministrar una imple-mentación especial, también necesitasregistrar la propiedad como DP, paraque el proveedor de datos subyacentelo reconozca. Se hace tal y como vemosen el listado 3.

Las DP reciben un nombre quees el resultado de su nombre público(por ejemplo, SymbolName), con el sufi-jo “Property”. Es un objeto estáticocreado por el método de registro dela clase estática DependencyProperty.Este método anota como argumen-tos, entre otras cosas, el tipo de pro-piedad y el tipo del control padre.

¿En qué escenarios son útiles lasDP? Existen para hacer que la decla-ración de enlaces de datos en WPF seamás poderosa que nunca. Una vezestablecido el enlace a datos, la pro-piedad enlazada recibe actualizacio-nes de los datos de la propiedad ori-ginal cada vez que éstos cambien. Conpropiedades implementadas total-mente en el control que los define sepuede necesitar una maquinaria nota-ble para conseguir notificaciones ypropagación de valores.

Consideremos un elemento Label ysu propiedad (de dependencia) FontSize.Cuando colocamos ese Label dentro deun panel, con un tamaño de fuente con-creto en WPF, se da una herencia deltamaño de la fuente, que no sucede enASP.NET. ¿Por qué? Porque en

ASP.NET cada propiedad es almacena-da internamente (o en su ViewState) y nohay ninguna lógica (salvo la que añadael usuario) que se aplique a la recupera-ción del dato. Como resultado, eltamaño permanece el predeterminado

para un control Label o el que se here-dase de su ViewState.

En WPF, al tener la propiedadFontSize declarada como DP, la ini-cialización depende del proveedor delsistema. Éste determina el valor ade-cuado de la propiedad en función delas animaciones activas o de las accio-nes que el control padre realice pararecuperar valores.

El runtime de WPF maneja las DPy, cuando se produce un cambio enuna de ellas, puede lanzar una serie

de acciones tales como notificacioneso propagación de cambios en valoresa lo largo de todo el árbol de ele-mentos de interfaz de usuario.

Como programador de WPF, uti-lizas las DP y no te preocupas acer-ca de su definición o detalles deimplementación. Como programa-dor de controles de WPF, podríastener que decidir cuáles de tus pro-piedades públicas quieres declararcomo Propiedades de Dependencia.Normalmente, suele estar relaciona-do con las propiedades públicas quepienses que van a estar implicadas enprocesos de DataBinding.

Las Propiedades Adjuntas son uncaso especial de DP. El propósito deuna Propiedad Adjunta es permitirque un elemento hijo pueda declararciertas propiedades de su controlcontenedor. Por ejemplo, todos loselementos, que puedas situar dentrode un Canvas, disponen de propie-dades Top y Left. Sin embargo, parasimplificar y mejorar la plataforma,Top y Left se definen como propieda-des del Canvas y se exponen de for-ma que cada control hijo las puedaestablecer individualmente. Sinembargo, las propiedades adjuntas,solo funcionan de esta forma cuan-do operan como hijos de la clase quedefine las propiedades. Por ejemplo,Top y Left se asocian con cualquiercontrol dentro del Canvas, pero nodispondríamos de esas mismas pro-piedades dentro de un elemento Grid.

Finalmente, en términos deimplementación, una propiedadadjunta necesita ser registrada de for-ma similar a las DP, pero no requie-re del envoltorio de una propiedadpública. En su lugar, se define comove en el listado 4.

Para registrarla, usamos el méto-do estático RegisterA ttached, del obje-to DependencyObject, en lugar del méto-do usado para las DP.

Tod

otN

et.q

a@

dot

netm

ania

.com

Tod

otN

et.q

a@

dot

netm

ania

.com

public static readonly DependencyProperty SymbolNameProperty = DependencyProperty.Register("SymbolName",

typeof(string), typeof(MyControl));

public static void SetSymbolName(UIElement element, string value) {

element.SetValue(SymbolNameProperty, value);}public static string GetIsBubbleSource(UIElement element){

return (string) element.GetValue(SymbolNameProperty);}

dnm.todonet@qa<<

public string SymbolName{

get{

return (string) GetValue(SymbolNameProperty);}set{

SetValue(SymbolNameProperty, value);}

}

Listado 2

Listado 3

Listado 4

Page 57: dotNetManía · nº 53 noviembre 2008 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX • Silverlight • .NET Framework dotNetManía LINQ to SQL y N-Capas: esto es

dotN

etM

anía

<<

57

¿Es seguro trabajar con la propiedad Template de los elementos visuales, en lugar de crearcontroles personalizados? Cambiando la plantilla puedo conseguir la mayor parte de las cosas que haría de la otra forma. ¿Estoy pasando algo por alto?

No, realmente, no. Incluso diría quehas ido al punto justo. En WPF, y enmuchos sentidos, también en Silver-light, no se necesita diseñar nuevoscontroles personalizados (o controlesde usuario), para aquellos casos don-de solo se necesita una aparienciadiferente. Ciertamente, en WindowsForms o ASP.NET, si quieres unbotón con una forma irregular, no tie-nes más remedio que crearte el tuyopropio. Y eso significa no solo creartoda la interfaz de usuario, sino repli-car igualmente la lógica que hace queun control se comporte como tal.

WPF es distinto. Como bien indi-cas, todos los elementos de la inter-faz de usuario disponen de una pro-piedad Template (su plantilla). Y serefiere al aspecto visual del control,pero no afecta para nada su compor-tamiento. Consideremos el siguientefragmento de código:

Tenemos un botón con la etiqueta“OK” usual, un manejador de eventoClick y unas dimensiones concretas. Sinembargo, no parece un botón clásico,como puede verse en la figura 1.

La nueva forma depende del con-tenido de la propiedad Template. Elcódigo de marcado define una elipserellenada con un gradiente, ademásde un elemento ContentPresenter. Ese

Template específico reemplaza al están-dar que obtendríamos con un botóncomo un rectángulo en gris.

Usamos el elemento ContentPresen-ter para mostrar el contenido del con-trol. Y usamos los elementos Templa-teBinding para apuntar a algunas pro-piedades públicas de la interfaz de

usuario del control. De esa forma,mantenemos el comportamiento pre-determinado, pero cambiamos la apa-riencia. Y, más importante, podemoshacer eso sin crear un control nuevo.Trabajar con la propiedad Template, es,por tanto, absolutamente seguro eincluso recomendado cuando todo loque se necesita es modificar la apa-riencia de un control. De forma que,

¿cuándo se necesita unnuevo control en WPFo Silverlight?

Cuando se requiereuna nueva API o cuandose precisa construir unnuevo control con un tipode funcionalidad inexis-tente. Para comprendermejor lo que “una nuevaAPI” significa, considere-mos el ejemplo del botóny supongamos que quere-mos un botón clásico conun icono y una etiqueta.

No te hace falta modificar la plantilla eneste caso. Puede bastar con modificar lapropiedad ContentProperty, como se mues-tra a continuación:

Tienes dos opciones: una, dupli-car este código para cada botón de laaplicación que requiera un texto eimagen distintos; y dos, crear un con-trol personalizado, sobrescribir lapropiedad Content, como hemos hechomás arriba, y exponer el texto y laURL de la imagen mediante un parde propiedades.

Así pues, solo se necesita un con-trol nuevo en WPF y/o Silverlight sihace falta una API nueva.

<Button Width="50" Height="50"><Button.Content>

<StackPanel><Image Source="Green.gif"

Width="20" Height="20">

</Image><TextBlock Padding="2"

FontSize="12">Ecooo!</TextBlock>

</StackPanel></Button.Content>

</Button>

<custom:Button ImageUrl="…" Text="…" />

<Button Width="80" Height="80" Padding="25" Content="OK" Click="Button_Click">

<Button.Template><ControlTemplate>

<Grid><Ellipse Width="50" Height="50">

<Ellipse.Fill><RadialGradientBrush GradientOrigin=".3,.2">

<GradientStop Offset=".2" Color="White" /> <GradientStop Offset="1" Color="Blue" />

</RadialGradientBrush></Ellipse.Fill>

</Ellipse><ContentPresenter Margin="{TemplateBinding

Button.Padding}"Content="{TemplateBinding

Button.Content}" /> </Grid>

</ControlTemplate></Button.Template>

</Button>

Figura1: botón elíptico con un gradiente

dnm.todonet@qa<<

Page 58: dotNetManía · nº 53 noviembre 2008 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX • Silverlight • .NET Framework dotNetManía LINQ to SQL y N-Capas: esto es

dotN

etM

anía

<<

58

desván

PDC 2008

Este mes dedicamos enteramen-te esta sección al que –sin duda–ha sido el evento más importantedel año para desarrolladores detecnologías Microsoft. Con Sil-verlight 2.0 ya en producción,Professional Developers Con-ference 2008 acaparó todas las

novedades, eclipsando un tanto a otros eventos como Tech-Ed 2008Europe, y presentando los nuevos paradigmas del desarrollo: Win-dows 7, Windows "Azure", Office 14 (y la familia de servidores on-line),Visual Studio 2010, el último estado de las herramientas de virtuali-zación, computaciónen paralelo, Oslo y elciclo de vida de lasaplicaciones, el futu-ro de Silverlight, C#4.0 (y .NET 4.0),VB10, etc.

Un análisis delas sesiones explicaclaramente la línea que va a seguir Micro soft: potenciar la filosofíade Software-plus-Services, con herramientas que faciliten la creaciónde la que se está denominando 5ª generación de aplicaciones: la pro-gramación en la nube (in-the-cloud). Debido a ello, la primera keyno-te, impartida por Ray Ozzie y Bob Muglia (en la foto superior),abrió el fuego con una de las apuestas más esperadas: Windows Azu-re: el nuevo sistema operativo en la red, con la idea de permitir eldesarrollo de software utilizando miles de servidores que Microsoftva a poner a disposición con este objetivo. Azure presenta carac-terísticas que competen a cinco distintas áreas de negocio: los desa-rrolladores Web, los desarrolladores corporativos, los ISV, los inte-gradores de sistemas y los gestores de negocio (ver sitio oficial enhttp://www.microsoft.com/azure, donde existe un enlace a unaCTP), y se organiza sobre 5 áreas principales de servicio: Live Ser-vices, .NET Services, SQL Services, SharePoint Services y Dynamics CRMServices.

Windows 7 (antiguo nombre en clave Blackcomb) estará másenfocado al rendimiento del sistema operativo. Microsoft ya publicóseis de los aspectos más relevantes a potenciar: empleo de memoria,utilización de CPU, operaciones de entrada y salida a disco, opera-ciones de arranque, cierre y reposo, rendimiento del sistema base yempleo de disco por parte del sistema. Habrá versiones de 32 y 64bits, pero la versión de servidor será exclusivamente de 64.

El equipo que creó la interfaz ribbon de Office 2007 ha estadocolaborando en el rediseño del explorador de Windows y otros ele-mentos de la interfaz de usuario, que será más intuitiva y fácil (ademásde incluir la tecnología multitouch, para pantallas táctiles), y se con-trolará la forma en que actúa la famosa UAC de una manera muchomenos intrusiva. La compatibilidad hacia atrás se pretende que seacasi absoluta (hasta el punto de que las versiones de 32 bits sopor-tarán ejecución de programas Win16 y MS-DOS, si bien en un con-texto controlado).

Silverlight proseguirá su desarrollo, y también se anunció la dis-ponibilidad de nuevos controles gracias a la liberación del primer

Silverlight Toolkit, que incluye TreeView, Chart, DockPanel, View-Box, Expander, AutoComplete y así hasta 12 nuevos controles. Además,para 2009 vendrá una nueva versión donde se potenciarán especial-mente las características multimedia y el soporte de capacidades grá-ficas y de integración de datos. Esto enlaza con algunas de las nue-vas posibilidades que se anticipan para Visual Studio 2010, totalmenteconstruido en WPF, que dispondrá de diseñadores específicos parael trabajo con Silverlight. Esa versión de 2009 estará potenciada porun conjunto de controles que compondrán la denominada Silver-light Business Logic Framework.

Oslo ha sido otra de las estrellas de esta edición. Es el nombrede la estrategia de Microsoft para desarrollo basado en modelos, quepermitirá el diseño y codificación de aplicaciones con un alto nivelde abstracción. Por un lado, consta de herramientas para la defini-ción de los modelos, y por otro, un repositorio relacional que hacedisponibles esos modelos a las herramientas y a la plataforma. Comonexo de unión, el lenguaje M (declarativo, de tipo DSL, manejablea través de la nueva herramienta Quadrant), creado especialmentepara el trabajo en este entorno.

También se habló de las capacidades con que contará ASP.NET4.0: mejoras en formularios Web, soporte por defecto para MVC,cacheado distribuido, AJAX mejorado, con herramientas paraAJAX/JavaScript en Visual Studio 2010, soporte para CSS2 y nue-vas funcionalidades Publish & Deploy. Todo esto añadido a la presen-tación de las nuevas opciones del llamado “Astoria Offline” (para per-mitir la programación de aplicaciones que utilicen servicios que pue-dan no estar siempre disponibles), junto a las nuevas versiones quese esperan de ADO.NET Entity Framework.

Por otro lado (no podía ser de otra forma), el admirado AndersHejlsberg presentó algunas de las novedades que incorporará elnuevo C# 4.0, basado en nuevos conceptos dinámicos aplicadosal lenguaje: covarianza y contravarianza, parámetros con nombrey objetos tipados dinámicamente, mejor interoperabilidad conCOM… y todo ello gracias a un nuevo runtime que permitirá,entre otras cosas, el binding a objetos de otros lenguajes, talescomo JavaScript (Silverlight), Python o Ruby, entre otros. Inclu-so presentó un prototipo de evaluador capaz de interpretar diná-micamente código C#.

Por último, Office 14 presenta como gran novedad su capacidadpara poder trabajar con documentos Word, Excel, PowerPoint, etc.,desde el navegador, en las llamadas Office Web Applications, quemejorarán el trabajo colaborativo desde los entornos típicos de hoy:el PC, los móviles y la Web. Además, como complemento de todaesta plétora de novedades, se presentaron interesantes trabajos de laslíneas de investigación de Microsoft. Como muestra, basta el botónde Windows Telescope (ver sitio y programa descargable enhttp://www.worldwidetelescope.org/Home.aspx).

noticias.noticias.noticias.noticias.noticias.noticias.noticias

Marino Posadas

Page 59: dotNetManía · nº 53 noviembre 2008 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX • Silverlight • .NET Framework dotNetManía LINQ to SQL y N-Capas: esto es
Page 60: dotNetManía · nº 53 noviembre 2008 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX • Silverlight • .NET Framework dotNetManía LINQ to SQL y N-Capas: esto es