60
Introducción a Windows Live Web Services • XNA. ¿Presente o futuro? • VS 2005 Team Edition para profesionales de bases de datos (I) • Herramientas genéricas para los componentes. Cuando de coleccionar se trata • Depuración en .NET. El depurador que lo depure... podrá editar y continuar entrevista Jesse Liberty Senior Program Manager Silverlight Developer Division Microsoft Corporation nº 44 enero 2008 6,50 Visual Basic • C# • ASP.NET • ADO.NET • SQL Server • Windows System dedicada a los profesionales de la plataforma .NET dotNetManía www.dotnetmania.com dotNetManía Comunidad.NET ValenciaDev.NET TodotNet@QA UpdatePanel y la caché en LINQ to SQL El Marco de trabajo de entidades de ADO.NET v3.5

dotNetManía - WordPress.com...Introducción a Windows Live Web Services • XNA. ¿Presente o futuro? • VS 2005 Team Edition para profesionales de bases de datos (I) • Herramientas

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: dotNetManía - WordPress.com...Introducción a Windows Live Web Services • XNA. ¿Presente o futuro? • VS 2005 Team Edition para profesionales de bases de datos (I) • Herramientas

Introducción a Windows Live WebServices • XNA. ¿Presente o futuro? •VS 2005 Team Edition paraprofesionales de bases de datos (I) •Herramientas genéricas para loscomponentes. Cuando de coleccionarse trata • Depuración en .NET. Eldepurador que lo depure... podráeditar y continuar

entrevistaJesse LibertySenior Program ManagerSilverlight Developer DivisionMicrosoft Corporation

nº 44 enero 2008 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • SQL Server • Windows System

www.

dotne

tman

ia.co

m

dedicada a los profesionales de la plataforma .NET

dotNetManíawww.

dotne

tman

ia.co

m

dotNetManía

Comunidad.NETValenciaDev.NET

TodotNet@QAUpdatePanel y la caché en LINQ to SQL

El Marco de trabajo de entidades de

ADO.NET v3.5

Page 2: dotNetManía - WordPress.com...Introducción a Windows Live Web Services • XNA. ¿Presente o futuro? • VS 2005 Team Edition para profesionales de bases de datos (I) • Herramientas
Page 3: dotNetManía - WordPress.com...Introducción a Windows Live Web Services • XNA. ¿Presente o futuro? • VS 2005 Team Edition para profesionales de bases de datos (I) • Herramientas

Bienvenido al número 44, de enero de 2008, dedotNetManía.

Con este número cumplimos 4 años y lo quetoca es agradecer a todos los que hacen posibleque sigamos publicando esta revista cada mes.El primer agradecimiento es para usted, amigolector, que confía en nosotros en un momentoen el que la información impresa no atraviesasus mejores momentos; en segundo lugar, a todosnuestros patrocinadores, especialmente a Micro-soft Ibérica por darnos un papel destacado ensu proyecto de difusión de sus tecnologías. Elloshacen un trabajo increíble para los desarrolla-dores, pero por desgracia son una excepción enla industria. Sin ellos y sin el resto de empresasque colaboran de forma estable (Solid QualityMentors, Alhambra-Eidos, Krasis y Abox) eincluso los que lo hacen de forma esporádica,esta labor pasaría de difícil a imposible; por últi-mo, pero no menos importantes, a todos losautores que han confiado en éste, como un buenmedio donde difundir parte de su excelente tra-bajo. La cantera de buenos autores castellano-hablantes es inagotable. Así que, a pesar de lodifícil que pudiera parecer, no puedo en modoalguno tener ni un gesto de pedantería, ya quecon tan buena gente a nuestro alrededor, estalabor no tiene gran mérito; el mérito es vuestroy nuestra es la suerte de teneros.

Seguramente tendrá usted un libro de untal Jesse Liberty en su librería. Este mes le tra-emos una charla que hemos tenido recientemen-te con él, que sirve de confirmación de que losautores míticos como él son de carne y hueso.Ahora trabaja para una empresa que se llamaMicrosoft Corporation en Redmond comoexperto en Silverlight.

Octavio Hernández y Unai Zorrilla, quie-nes acaban de publicar sus primeros libros(www.krasispress.com), parece que han queridoaprovechar la inercia que esta ardua tarea gene-ra, y publican el artículo de portada de este mes

“El Marco de trabajo de entidades deADO.NET v3.5”, que es el primero de una seriesin numerar que pretende enseñar qué es el Mar-co de trabajo de entidades y cómo aprovecharsus posibilidades.

José Luis Latorre publica su trabajo “Intro-ducción a Windows Live Web Services”. Win-dows Live Web Services ofrece servicios y apli-caciones a los desarrolladores para crear aplica-ciones Web muy interesantes. Este artículo es unadescripción de todos estos recursos. Por aquí habíaque empezar, pero profundizaremos más sobreellos en el futuro.

No pasa un mes que no tengamos firmas invi-tadas, como prueba de lo que le decía sobre lacantera hispana. Iñaki Ayucar, quien ha trabaja-do en un impresionante proyecto de simulaciónpara la conducción —el proyecto SIMAX(www.simax.es)—, publica el artículo “XNA. Pre-sente o futuro”, con el que nos mete el venenoen el cuerpo al decirnos que podemos desarro-llar juegos completos para la Xbox 360 desdenuestro garaje, al margen de las grandes produc-ciones, como se hacía hace ya unos añitos.

Le presento también a Rubén Garrigós,nuestro otro invitado de este mes, que escribe“VS 2005 Team Edition para profesionales debases de datos (I)”, una herramienta de enormeutilidad para todos aquellos que tengan que admi-nistrar bases de datos.

Recuerdo que en febrero de 2004, cuandopresentamos nuestra revista en el DevDays deaquel año, una persona me preguntó ¿pero haytanta materia como para tener una revista men-sual enfocada a la tecnología .NET? Esta indus-tria avanza de tal modo, que no solo había y haytemas para tratar cada mes, sino que incluso todoslos artículos que les he presentado en este edito-rial hablan sobre tecnologías de las que nunca anteshabíamos escrito. Y antes de agotarlas, ya habránuevos temas que tratar. Espero que usted y todosnosotros lo veamos juntos por muchos años.

dotN

etM

anía

<<

3

¿Materia suficiente para 4 años?

editorialDedicada a los profesionales de la plataforma .NET

Vol. III •Número 44 • Enero 2008Precio: 6,50 €

EditorPaco Marín ([email protected])

Redactor jefeMarino Posadas([email protected])

Editor técnicoOctavio Hernández([email protected])

RedacciónDino Esposito, Guillermo 'Guille' Som, JoséManuel Alarcón, Luis Miguel Blanco y MiguelKatrib (Grupo Weboo)

Empresas Colaboradoras

Alhambra-Eidos

Krasis

Plain Concepts

Raona

Solid Quality Learning

Además colaboran en este númeroDaniel Seara, Iñaki Ayucar, José Luis Latorre,Rubén Garrigós y Unai Zorrilla.

Corresponsal para América LatinaPablo Tilotta

IlustracionesMascota (Clico): Yamil HernándezPortada: Javier Roldán

FotografíaRoberto Mariscal

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

Edición, suscripciones y publicidad.netalia

c/ Thomas Edison, 4, 1406Parque empresarial Rivas Futura

28521 - 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 - WordPress.com...Introducción a Windows Live Web Services • XNA. ¿Presente o futuro? • VS 2005 Team Edition para profesionales de bases de datos (I) • Herramientas

sumario 44Entrevista a Jesse Liberty 10-12

Previamente había sido director de Liberty Associates y publicado varios libros sobre tecnologíasMicrosoft, especialmente centrados en el lenguaje C# (algunos reseñados en la sección de Bibliografíade esta revista). En el pasado Tech-Ed de Barcelona, Liberty se presentaba con su nuevo y flamanteempleo en Microsoft (Redmond), como experto en Silverlight. Aprovechamos ciertos contactosanteriores con él para solicitarle esta entrevista.

Introducción a Windows Live Web Services 14-18Windows Live Web Services (WLWS) es la apuesta de Microsoft en la línea de orientación aservicios a la que últimamente está tendiendo. La filosofía de WLWS se basa en ofrecer unosservicios y aplicaciones que nos permiten generar atractivas e interesantes aplicaciones Web muyrápidamente.

XNA. ¿Presente o futuro? 20-26El desarrollo de software está en constante evolución hacia modelos de desarrollo cada vez “máselevados”. Ser más eficientes y productivos es la máxima que todo el mundo busca, y el sector de losvideojuegos no iba a librarse eternamente de esta tendencia. XNA nace para acercar al sector esosdos objetivos y para fomentar la comunidad de desarrolladores “indie”, actualmente desplazada porproyectos multimillonarios. ¿Será una apuesta acertada?

El Marco de trabajo de entidades de ADO.NET v3.5 28-36La versión 3.5 de ADO.NET, que estará disponible al completo dentro de muy poco tiempo,incluirá el Marco de trabajo de entidades (Entity Framework), todo un aparato conceptualdestinado a aumentar nuestra potencia expresiva a la vez que a simplificar la programación deaplicaciones con acceso a base de datos. Este artículo es el primero de una serie destinada a mostrarqué es el Marco de trabajo de entidades y cómo podemos aprovechar las posibilidades que nos ofrece.

VS 2005 Team Edition para profesionales de bases de datos (I) 38-41Visual Studio 2005 Team Edition for Database Professionals (Datadude para los amigos) es laapuesta de Microsoft para aumentar la productividad de los profesionales de bases de datos,mejorando la integración entre éstos y el resto de equipos que participan en un proyecto de desarrollode software. Datadude nos proporciona valiosas funcionalidades que, independientemente de formarparte de la gestión del ciclo de vida de nuestros modelos, añaden valor a este producto desde el mismomomento en que nos decidimos a probarlo.

Herramientas genéricas para los componentes. Cuando de coleccionar se trata 42-45En esta oportunidad, nos ocuparemos de crear una clase que nos permita algo más de libertad a lahora de manejar colecciones y listas de nuestros propios objetos, o inclusive de cualquier otro conjuntode valores que necesitemos.

Depuración en .NET. El depurador que lo depure... podrá editar y continuar 46-51En esta ocasión, seguimos tratando el tema de depuración con Visual Studio, pero nos centraremosmás en la característica de “editar y continuar”, de forma que veamos las posibilidades que tenemosa la hora de hacer esas modificaciones tan necesarias cuando el código de nuestra aplicación no secomporta como esperamos que lo haga.

dnm.todotnet.qaUpdatePanel y la caché en LINQ to SQL 52-54

Este mes responderé a dos preguntas sobre ASP.NET AJAX y LINQ to SQL que apuntan a temasde amplio interés. Siga leyendo para conocer cómo poblar programáticamente un controlUpdatePanel y cómo implementar una capa de caché sobre los datos recuperados mediante LINQ toSQL.

dnm.comunidad.net 56ValenciaDev.Net. Grupo de usuarios de .NET de Valencia

dnm.biblioteca.net 57C# 3.0 in a Nutshell: A Desktop Quick ReferenceC++/CLI in Action

dnm.desvan 58

Page 5: dotNetManía - WordPress.com...Introducción a Windows Live Web Services • XNA. ¿Presente o futuro? • VS 2005 Team Edition para profesionales de bases de datos (I) • Herramientas
Page 6: dotNetManía - WordPress.com...Introducción a Windows Live Web Services • XNA. ¿Presente o futuro? • VS 2005 Team Edition para profesionales de bases de datos (I) • Herramientas

Los días 26 a 30 de Noviembre de 2007 se celebró laIV edición de ExpoQA, lugar de encuentro para losprofesionales de calidad y testing del software, conunos 130 asistentes. Esta edición fue organizada porSogeti, empresa líder en calidad y pruebas de soft-ware. La semana se dividió en dos bloques claramen-te diferenciados: los tres primeros días estuvieron dedi-cados a la realización de cursos prácticos para todoslos profesionales que desearan ampliar sus conoci-mientos sobre calidad y pruebas de software; mien-tras que los dos últimos fueron destinados a confe-rencias con temáticas muy similares a las de los cur-sos. Entre los ponentes destacó la presencia de gran-des expertos en la gestión de la calidad del software,tanto nacionales como extranjeros.

Los cursos fueron los siguientes:• “Verificación, validación y pruebas del software-

Conceptos, estándares y prácticas” (PatriciaRodríguez Dapena, SoftWCare S.L.).

• “Cómo asegurar la usabilidad de mi software ypágina web” (Raquel Navarro Prieto, Directo-ra del Laboratorio de Interacción Centrada en elUsuario).

• “Gestión de pruebas business driven” (Rob Baar-da, Sogeti Holanda).

• “Principios de las pruebas de rendimiento” (ScottBarber).

• “TMap Basics” (Ewout Van Driel y Pilar Blan-co, Sogeti España).

• “Pruebas de seguridad de aplicaciones Web” (AnaLópez-Mancisidor Rueda, IBM/Rational).

• “A Rapid Introduction to Rapid Software Testing”(Michael Bolton, creador junto con James Bachde la metodología Rapid Software Testing).

Tras estos tres días, llegaron los dedicados a con-ferencias, que comenzaron después de la keynote deapertura, que estuvo a cargo de Raynald Korchia,Director de la División de Software Control y Tes-ting de Sogeti España. Entre las muchas sesiones queacapararon el interés de los asistentes podemos des-tacar las siguientes:• “La gestión del cambio como base para la Cali-

dad”, de Antonio Rodríguez (Telelogic). En

esta sesión se presentó la herramienta TelelogicChange, que permite no sólo la gestión sino tam-bién el control de los artefactos sujetos al cambiocomo son los requisitos, el código o las pruebas,entre otros.

• “Watchfire: Solución para optimizar la calidad,seguridad y cumplimiento de estándares de apli-caciones Web”, de Ana López-Mancisidor(IBM). Aquí IBM nos mostró su herramientaWatchfire, que proporciona soluciones para detec-tar vulnerabilidades en las aplicaciones Web.

• “Estrategias de calidad end-to-end”, de Jordi Bor-ja (Borland). Luego de una primera parte en laque se mostró cómo Borland entiende la calidada través de sus soluciones de Ciclo de Vida, se pre-sentó la última versión de SilkPerformer, queunida a dynaTrace, para la monitorización a nivelde código de aplicaciones J2EE y .NET, propor-cionan una solución de testing única en el mer-cado.

• “Performance Testing for Managers”, de ScottBarber. En esta charla se enseñó cómo trabajarcon probadores de rendimiento experimentadospara conseguir los resultados deseados, por quélas pruebas de rendimiento deben comenzarmucho antes de que la aplicación esté plenamen-te funcional y las mejores prácticas para integrarel personal de pruebas de rendimiento en el equi-po de desarrollo.

• “Two Plus Two and Other Testing Exercises”, deMichael Bolton, que a partir de problemas apa-rentemente simples, mostró la forma en que elconocimiento sobre esos problemas puede expan-dir dramáticamente nuestro concepto de calidady riesgo.

• “Cómo mejorar el análisis estático de código fuen-te con Klockwork y Cantata++”, de Luke Mars-den (IPL), donde se hizo una presentación teó-rica y práctica de dichos productos.

• “Del control a la garantía de calidad: maduraciónde los procesos de calidad de software”, de AnnaAscasso (Compuware), que propuso estrategiaspara madurar los procesos de calidad y tener éxi-to en los mismos.

expo:QA4ª Jornadas Profesionales de Calidad y Testing de Software

eventos

<<

Sergio Holgado

Sergio Holgadoes Software Engine-er de Raona. Certifi-

cado en ITIL yMCTS MOSS 2007

Page 7: dotNetManía - WordPress.com...Introducción a Windows Live Web Services • XNA. ¿Presente o futuro? • VS 2005 Team Edition para profesionales de bases de datos (I) • Herramientas

• “Técnicas de selección y combina-ción de buenos valores de prueba”, deMacario Polo (UCLM), que tras unbreve repaso a los conceptos subya-centes presentó diferentes estrategiasde combinación para la obtención debuenos casos de prueba.

Todas estas conferencias fueronacompañadas por un buen coctel, que dioa los asistentes la oportunidad de con-versar y compartir experiencias relacio-nadas con el evento.

Con la participación de este año, esteevento se consolida como el principal en

temas de Calidad de software; para el añoque viene, se espera que la asistencia seaaún mayor.

El evento estuvo patrocinado porempresas del calibre de IBM, Sogeti, Bor-land, Telelogic, CompuWare, IPL, EXINy Visure Solutions.

dotN

etM

anía

<<

7

dnm.directo.eventos<<

El día 4 de diciembre pasado se celebróen Madrid, en el hotel Meliá Castilla,SOA Conference 2007, donde Micro-soft dio a conocer, ante más de 120 asis-tentes, su oferta de productos y solu-ciones, y su estrategia en las iniciativasde Procesos de Negocio y Arquitectu-ra Orientada a Servicios. SOA confe-rence 2007, además de proporcionar unaguía de referencia, prestó especialinterés en Arquitectura de soluciones,Arquitectura de infraestructura y Valorde negocio.

Contamos con la presencia de tresejecutivos de Microsoft Corporation:Zubair Murtaza, Director of ProductManagement for BizTalk Server, KrisHorrocks, Senior Technical ProductManager for SOA y Gavin King, CoreProduct Manager.

Después de la presentación de la con-ferencia por parte de Fernando Boci-gas, Jefe de Producto Plataforma deAplicaciones de Microsoft Ibérica, tomóla palabra Zubair Murtaza para impar-tir su charla “Real World SOA y Estra-tegia de Software + Servicios de Micro-soft”, al que siguieron Gavin King y KrisHorrocks con la conferencia “Noveda-des de BizTalk Server 2006 R2 y Road-map futuro: Oslo”. Oslo es el codenamede un conjunto de inversiones tecnoló-gicas que tienen por objetivo simplificarsignificativamente el diseño, la cons-trucción, la gestión y el escalado orien-tado a servicios y aplicaciones com-puestas que pueden abarcar desde elnegocio a Internet. La primera versiónde Oslo se entregará mediante las pró-ximas versiones de los productos de pla-

taforma de aplicaciones, tales comoMicrosoft Visual Studio 10, System Cen-ter 5, BizTalk Server 6, BizTalk Services1 y .NET Framework 4.

Después del café comenzaron lassesiones simultáneas según la siguienteagenda:

Puede encontrar más informacióny el material de las presentaciones en:http://www.microsoft.com/spain/sunego-cioconectado y más información sobrela visión de SOA de Microsoft (eninglés) en el sitio http://www.micro-soft.com/soa.

SOA Conference 2007

12:00-12:45

Anatomía de una aplicación de nego-cio basada en Software + Servicios.Salvador Sánchez, Principal Tech-nology Specialist y Carlos Oramas,.NET Architect Advisor, ambos deMicrosoft Ibérica.

BizTalk Server 2006 R2 for SOAand BPM.Juan Carlos González, Kabel.

12:45-13:30

El futuro de la experiencia deusuario.Carlos Oramas.

Cómo elegir la combinación ade-cuada de Microsoft Office SharePointServer, Windows Workflow Foun-dation y BizTalk. Eduardo Azanza, Principal Tech-nology Specialist, Microsoft Ibérica.

14:30-15:15

BizTalk Adapters for WCF Tomás Hernández, MVP Biz-Talk. responsable de Integraciónde Ilitia Technologies.

Arquitecturas de aplicaciones com-puestas sobre Office System. Pablo Peláez, MVP Visual StudioTools for Office, Plain Concepts.

15:15-16:00

Conectando aplicaciones LOB(Line of Business Applications) conMicrosoft BizTalk Adapter Pack.Roberto González, MVP BizTalkde Renacimiento.

AgilePoint: El Modelo es la Apli-cación.Juan José Rodríguez, directorgerente de Organización y Mas-soud Dehkordi, director general,ambos de Ascentn Iberia.

16:00-16:45

Microsoft Enterprise Service Bus.Juan Carlos González, arquitecto de soluciones de Microsoft Innovation Center.

Agenda sesiones paralelas

Page 8: dotNetManía - WordPress.com...Introducción a Windows Live Web Services • XNA. ¿Presente o futuro? • VS 2005 Team Edition para profesionales de bases de datos (I) • Herramientas

dotN

etM

anía

<<

8

dnm.directo.eventos<<

El día 18 de diciembre se celebró en Madrid,en el Hotel Velada, el Microsoft InnovationDays, un evento dirigido exclusivamente a losISV y, desde el año pasado, también a los lla-mados CDS, desarrolladores de software amedida. Desde las 9:00 y hasta las 18:00 seestuvieron impartiendo charlas técnicas, asícomo información del programa de partnersde desarrollo de Microsoft Ibérica.

Las charlas técnicas estuvieron imparti-das por personal de la división de platafor-ma y desarrollo de Microsoft Ibérica, con laayuda de Marino Posadas de Solid QualityMentors y redactor jefe de esta revista.Empezó César de la Torre con “ServiceOriented Architecture (SOA) en .NET 3.5.Windows Communication Foundation yWorkflow Foundation”. César tambiénimpartió la sesión “Microsoft DynamicsCRM 4.0 Titan. Integrando aplicacionesexistentes con Titan o construyendo aplica-ciones sobre CRM 4.0”. Isabel Gómez seencargó de “Estado del arte de Windows Pre-sentation Foundation” con la ayuda de Mari-no Posadas, quien mostró como caso prác-tico de implantación de las tecnologías WPFun lector que desde Solid Quality Mentorshan realizado para el periódico “La Nación”de Costa Rica, contando en todo momentocon la ayuda del equipo de desarrollo delSDK desde Redmond. José Murillo, eldirector de esta orquesta, impartió inmedia-tamente después las sesiones “La nueva pla-taforma de acceso a datos. UtilizandoADO.NET Entity Framework, LINQ toEntities y el futuro de Astoria” y “Office Busi-ness Applications. Construyendo aplicacio-nes OBA con SharePoint 2007, SharePointDesigner, Workflow Foundation y VisualStudio Tools for Office v3”. Para terminarel día, Isabel Gómez volvió a intervenir conla charla “Desarrollo Web Extremo. Aplica-ciones ASP.NET AJAX con Silverlight yWindows LIVE Services, la combinación

perfecta”. Un día entero repa-sando algunas de las noveda-des más importantes de .NETFramework 3.5 y Visual Stu-dio 2008.

En cuanto a la informa-ción de los beneficios del pro-grama de partners de desarro-llo, José Murillo ([email protected]) nos explicó algu-nos de los beneficios y requi-sitos de los distintos progra-mas: el programa Empower,que ofrece licencias MSDN yde servidor a un precio real-mente competitivo; el progra-ma Metro de adopción tem-prana de tecnologías Micro-soft, que además proporcionarecursos de formación y sopor-te; y el programa Royalty, quepermite distribuir software deMicrosoft (como SQL Server, MS Office, etc.)con nuestros productos, embebido dentro dela instalación. Estos programas están dirigi-

dos a top partners (gold certified y certified) yMicrosoft es muy estricto en el cumplimien-to de los requisitos.

Microsoft Innovation Days

Si su compañía aún no es un top partner, puede registrarse en el programa de part-ners de Microsoft y acceder al Microsoft Action Pack, que ofrece los nuevos lanza-mientos de software además de material de ventas y marketing actualizado, para ayu-darle a cumplir sus objetivos de ventas e impulsar el crecimiento de su negocio. Encada suscripción se incluye un kit de bienvenida y tres kits de actualización trimestra-les por 320€. Puede ver en detalle las licencias de software y material de ventas y mar-keting que incluye este programa en http://www.microsoft.com/spain/partner/ven-tasmarketing/actionpack/nuevo.mspx. Además, suscribiéndose a Action Pack y consolo pasar un examen online tendrá acceso al Kit Web Solutions Provider para diseña-dores Web y desarrolladores —o cualquiera que lleve un negocio basado en solucio-nes Web—. Este kit incluye Visual Studio 2008 Standard y Expression Studio.

Encontrará más información en la página: http://www.microsoft.es/partner.

Microsoft Action Pack

Page 9: dotNetManía - WordPress.com...Introducción a Windows Live Web Services • XNA. ¿Presente o futuro? • VS 2005 Team Edition para profesionales de bases de datos (I) • Herramientas

dotN

etM

anía

<<

9

noticiasnoticias

noticias

noticias

noticias

Liberada Beta 3 de ADO.NET EntityFramework

El primer Service Pack paraOffice 2007, disponible

Microsoft puso el pasado 11 dediciembre a disposición de sus clien-tes el primer Service Pack (SP1) deOffice System 2007, adelantándoseasí a la fecha prevista inicialmente,que situaba el lanzamiento a princi-pios de 2008.

Según la compañía “Gracias a losavanzados canales de comunicación conclientes, como el sistema de comunica-ción de errores ‘Dr. Watson’, el equi-po de Microsoft Office ha podido darrespuesta a los requerimientos máscomunes de los usuarios que trabajandía a día con las herramientas Office.Como resultado, el SP1 de Office 2007proporciona un importante avance enestabilidad y rendimiento de las aplica-ciones”.

El SP1 de Office 2007 ofreceademás otros interesantes avances,como una mayor facilidad para el des-pliegue de Office 2007 e importantesmejoras en productos como ProjectServer o Sharepoint, como el soportepara el futuro Windows Server 2008.

El Service Pack 1 de Office 2007no se distribuirá de momentomediante actualizaciones automáti-cas. Su descarga y la informaciónsobre su instalación está disponible através de la página de descargas deMicrosoft.

Para acceder al Service Pack 1 dela suite de aplicaciones Office 2007:http://www.microsoft.com/downloads/details.aspx?FamilyId=9EC51594-992C-4165-A997-25DA01F388F5&display-lang=es.

Para acceder al Service Pack 1 delos servidores de Office 2007:http://www.microsoft.com/downloads/details.aspx?FamilyID=ad59175c-ad6a-4027-8c2f-db25322f791b&DisplayLang=es.

El pasado 5 dediciembre Micro-soft puso a dispo-sición del públicouna presentaciónpreliminar de Vol-ta, un conjunto de herramientas des-tinadas a que los desarrolladores pue-dan crear aplicaciones Web de múlti-ples capas utilizando herramientas,técnicas y patrones familiares. La sepa-ración en capas que permite Volta,totalmente declarativa, permitirá pos-poner las decisiones relacionadas conla distribución hasta el último momen-to. Gracias a un modelo de progra-mación compartido a través de lascapas, Volta admite técnicas de depu-ración y testeo integrales que haránposible alcanzar niveles más altos derendimiento, robustez y fiabilidad.Utilizando la separación en capasdeclarativa, los desarrolladores podránrefinar las decisiones sobre arquitec-tura en base a los datos de perfilado.De hecho, Volta extenderá la plata-forma .NET para facilitar el desarro-llo de aplicaciones del tipo “software+ servicios”.

Con Volta,usted diseñará ydesarrollará suaplicación comouna aplicacióncliente .NET,

asignando en el último momento (sinnecesidad de cambios en el código fuen-te) qué partes de la aplicación se ejecu-tarán en la capa cliente y en la capa deservidor en el último momento. Ustedpodrá indicar que desea orientarse anavegadores Web o al CLR como clien-tes, y Volta se encargará de gestionar lascomplejidades derivadas de la separa-ción en capas. El compilador crearáJavascript compatible con todos losnavegadores para la capa cliente, servi-cios Web para la capa del servidor y todoel código de comunicaciones, seriación,sincronización, seguridad, etc. necesa-rio para que las capas interactúen entresí. Efectivamente, Volta ofrecerá unaexperiencia óptima de desarrollo paramúltiples entornos sin requerir modi-ficación alguna de la aplicación.

Para más información y des-carga de la CTP, visite http://labs.live.com/volta.

Volta

A principios de diciembre, Micro-soft liberó la Beta 3 de ADO.NETEntity Framework, la próximaversión de ADO.NET, que seráoficial dentro de muy poco tiem-po. Esta nueva beta, además deincluir diversas novedades y mejo-ras con relación a su predecesora,ya opera sobre la versión definiti-va de .NET Framework 3.5. Estemismo mes, dotNetManía da ini-cio a una serie de artículos sobreesta tecnología, destinada a revo-lucionar el mundo del acceso abases de datos relacionales desdelas aplicaciones .NET.

Asimismo, también se ha liberadola CTP 2 de las Entity FrameworkTools, las herramientas interactivas quese integrarán dentro de Visual Studio2008 para ofrecer una experiencia deusuario productiva a la hora de utilizarADO.NET Entity Framework. Estanueva CTP debe instalarse sobre la ver-sión definitiva de Visual Studio 2008.

Para descargar la Beta 3 deADO.NET Entity Framework, visi-te http://go.microsoft.com/fwlink/?Lin-kId=104981. Para descargar la CTP2 de Entity Framework Tools, visi-te http://go.microsoft.com/fwlink/?Lin-kId=104983.

Page 10: dotNetManía - WordPress.com...Introducción a Windows Live Web Services • XNA. ¿Presente o futuro? • VS 2005 Team Edition para profesionales de bases de datos (I) • Herramientas

Marino Posadas

Marino Posadases director de tec-nologías de desa-

rrollo para Españay Portugal de Solid

Quality Learning.Puedes leer su blog

en http://www.elavefenix.net.

entrevista

entrevista a Jesse LibertyPreviamente había sido director de LibertyAssociates y publicado varios libros sobretecnologías Microsoft, especialmentecentrados en el lenguaje C# (algunosreseñados en la sección de Bibliografía deesta revista). En el pasado Tech-Ed deBarcelona, Liberty se presentaba con sunuevo y flamante empleo en Microsoft(Redmond), como experto en Silverlight.Aprovechamos ciertos contactos anteriorescon él para solicitarle esta entrevista.

Comienza Jesse hablando de la pasión por suactividad actual, sin presentación previa, eindicándonos que –para él– con la apariciónde Silverlight, y en especial cuando se produzcala salida final de la versión 1.1 (ó 2.0, comomás adecuadamente parece que va a llamar-se al final), estaremos ante un auténtico hitoen la producción de software de Microsoft, solocomparable a la aparición del propio .NETFramework. Comprendemos el entusiasmo,pero reconducimos la entrevista por derrote-ros más habituales:

Hagamos primero una introduc-ción. Yo te conocía por tus libros sobreC# y he recomendado alguno de ellosen la sección de Bibliografía de dot-NetManía, pero nos gusta conocer,

Page 11: dotNetManía - WordPress.com...Introducción a Windows Live Web Services • XNA. ¿Presente o futuro? • VS 2005 Team Edition para profesionales de bases de datos (I) • Herramientas

antes que nada, cuál ha sido la trayec-toria de nuestros entrevistados…

Comencé a hacer cosas con ordena-dores en la escuela, en 1971. Y teníamosque usar lenguaje de máquina, que yoodiaba. Lo mismo me sucedió luego enla Universidad. Pero a partir de 1983decidí que me gustaba la Informática,aprendí Ensamblador del 8088 (sí, con ellibro de Peter Norton del que hemos esta-do hablando antes), después C bajo Unixy comencé a trabajar desarrollando soft-ware para la cadena de televisión BBS.Después continué mi evolución con C++

y proseguí con el desarrollo por variosaños. De hecho, mi primer libro fue “Tea-ching yourself C++ in 21 days”. Fue unasorpresa, porque esperábamos venderunas 10.000 copias, pero acabamos ven-diendo ¡750.000! Más tarde comencé acolaborar con la editorial Wrox sobretemas de Análisis y Diseño Orientado aObjetos. Finalmente, cuando Microsoftmostró los primeros bits de C# allá por2000, decidí cambiar completamente mimodelo de trabajo, y centrarme en .NETy nada más.

Sin embargo, yo tengo en casa unlibro tuyo de C# que es de la editorialO’Reilly…

Es que justamente en ese momentoescribí al director de la editorial ofre-ciéndole la posibilidad de escribir el libroque tú tienes, y eso cayó muy bien comoiniciativa y desde ese momento he segui-do colaborando con esta editorial…

Creo que hay dos razones por las que loslibros de O’Reilly son tan notables. Laprimera es que, cuando les preguntascuánto tiempo tienes para escribir unaobra, ellos responden con “¿Cuántotiempo te llevará?”. La segunda es quese toman tanto tiempo en editar, refinary mejorar la edición final del libro, comoyo tardo en escribirlo. En cada edicióncontrolan cada sentencia que se incluyeel libro, cada línea de código fuente, etc.Eso es lo que ha sucedido con la 5ª edi-ción de mi libro de C#, donde se hanincluido nuevos temas como LINQ, el

acceso a datos, WPF, WinForms,ASP.NET e incluso cosas como el tra-tamiento de streams o la gestión dememoria, cuya necesidad vemos apare-cer con el tiempo. Así que no podría estarmás contento con la labor editorial.

En la actualidad estoy terminando unlibro que se llamará “Programming.NET 3.5”, que será un libro general acer-ca de todo lo que es crucial en la versión3.5: WPF, WCF, WF, AJAX, etc., y cuan-do termine con ése, para principios deenero, comenzaré con lo que ahora es miobjetivo principal: un libro sobre Silver-light, ya basado en la versión que siga aesta primera versión 1.0.

He estado en las dos presentacio-nes que has hecho sobre Silverlight,el lunes y ayer en el auditórium, y esta-ban abarrotadas. Eso significa que haymuchas expectativas por parte de lagente en este producto…

Así es. Las expectativas son real-mente grandes. Cuando tienes 800personas en el auditórium pendientesde una tecnología que todavía está enfase alfa, te das cuenta de hasta dóndellega el interés. Y tuvimos que repe-tirla, porque había más gente quequería asistir a la segunda presenta-ción. Cuando comencé a escribir miblog exclusivo sobre Silverlight tuvi-mos cerca de 14.000 suscriptores en laprimera semana… Eso significa que lagente ve oportunidades increíbles vin-culadas con Silverlight.

Yo pienso que una vez que entiendesel nuevo modelo de programación pue-des enfocarte inmediatamente en lo quecomo programador quieres hacer, y esoes válido tanto para aplicaciones de escri-torio como para aplicaciones Web.Específicamente, la versión 1.1 de Sil-verlight va a suponer una revolución enla forma en que abordamos el desarrolloWeb de calidad hoy en día. Y en eso, lasherramientas de Expression tendránmucho que ver, por la fácil integracióncon Visual Studio y todo el ciclo de vidade las aplicaciones.

Una de las cuestiones críticas acer-ca del desarrollo en Silverlight es, cla-ramente, el tema de la versión. Todoel mundo está esperando la versión1.1 por sus capacidades y superiorprogramabilidad, por la posibilidad deusar lenguajes .NET en vez de Javas-cript (que no es precisamente el amor do

tNet

Man

ía<<

11

dnm.directo.entrevista<<

Jesse Liberty y Marino Posadas en un momento de la entrevista.

Page 12: dotNetManía - WordPress.com...Introducción a Windows Live Web Services • XNA. ¿Presente o futuro? • VS 2005 Team Edition para profesionales de bases de datos (I) • Herramientas

dotN

etM

anía

<<

12

dnm.directo.entrevista<<

platónico de los programadores), ymuchos se están lanzando ya a hacercosas con esta versión alfa. ¿Mantie-nes ese mensaje? ¿O pides prudenciaa la comunidad antes de abordar desa-rrollos con un producto que todavíaestá en ciernes?

Pues depende mucho de las necesi-dades. A día de hoy, la versión estable,soportada y fiable es la 1.0. Y la mayorparte de las cosas que podrás hacer en la1.1 las puedes hacer en 1.0, solo que deotra forma. Estoy de acuerdo con que lasventajas de utilizar lenguajes .NET admi-nistrados son enormes, y que Javascriptno es lo más agradable desde el punto devista del desarrollador; pero, por poderhacerse, se puede hacer casi todo con estaversión disponible.

El problema actual de la versión 1.1es, sobre todo, el hecho de que cualquiercosa puede cambiar. Cualquier cosa. Alno haber alcanzado todavía el estado debeta, pueden producirse cambios demucha importancia incluso en la estruc-tura básica del producto. Ahora bien, entérminos de aprendizaje, por supuestoque merece la pena comenzar ahora mis-mo con la versión 1.1. Tienes que teneren cuenta que las promesas realizadas res-pecto al producto son muy grandes, y esosupone que las expectativas sobre el mis-mo también lo son.

Después de todo esto, es inevitablepreguntarte por la fecha de aparición.Incluso aunque no la sepas exactamen-te, ¿tienes alguna idea aproximada, parair haciéndonos una idea del estado actualde desarrollo del producto?

Me encantaría poder darte una fecha,pero como empleados de Microsoft, debe-mos tener un infinito cuidado con estostemas, porque podría significar que sehicieran por parte de nuestros partners pre-visiones e inversiones que luego no se vie-ran correspondidas en el tiempo. Preferi-mos no decir nada por el momento hastaque el producto no esté más maduro.

El gran cambio de la versión 1.1respecto a la 1.0, ¿serán los lenguaje autilizar, el modelo de ejecución ensandbox, o alguna otra cosa?

Para mí, los grandes cambios que cabeesperar de la siguiente versión serán dos:la inclusión de un subconjunto del CLR,que capacitará la programación en muchoslenguajes .NET, cosa que a día de hoy noestá soportada, y en segundo lugar, comohemos prometido, la disponibilidad de ungran conjunto de controles. Scott Guth-rie lo ha comentado en su blog: tenemosfeedback por parte de usuarios e interesa-dos en el tema con respecto a las necesi-dades de controles para abordar desarro-llos dentro de este escenario, y vamos ahacernos eco de esa necesidad. Eso no sig-nifica que sean los únicos cambios impor-tantes; habrá muchos otros. Cambios enmovilidad, en el modo de distribución, enel tipo de dispositivos receptores de estatecnología (como electrodomésticos), etc.Eso por no hablar de la facilidad de pro-gramación mediante Visual Studio y laintegración del producto con el entornode desarrollo. Tienes que tener en cuen-ta que esta tecnología está todavía en suinfancia, por lo que es probable que apa-rezcan cosas asociadas a ella que ahoramismo ni podemos imaginar.

Respecto a la necesidad de lasherramientas de diseño, tipo Expres-sion, ¿piensas que seguirán siendonecesarias (incluso más necesarias queahora), ya que gran parte del uso deSilverlight será en la Web?

Seguirán potenciándose como hastaahora, porque la gente está compren-diendo que muchos de los problemas dela utilización del software no están en lacalidad de su codificación sino en su pobre

diseño visual. Una aplicación bien diseña-da se convierte en intuitiva y hace mássuave la curva de aprendizaje. La granventaja de herramientas como Expressiones que permiten la comunicación entrelos dos mundos, el del diseñador y el deldesarrollador, a través de un lenguajecomún (XAML) que ambos pueden com-prender, que es manejado por las herra-mientas de ambos y que sirve como nexode unión entre esos dos mundos.

Has mencionado antes que para tiSilverlight va a ser un auténtico acon-tecimiento, comparable a la llegada de.NET. ¿Qué más podemos esperar detoda esta explosión de expectativas?

Para empezar, nosotros no vemos esteproducto como el killer de ningún otro,aunque las comparativas con Flash seaninevitables en la calle. Simplemente tene-mos la posibilidad de crear una tecnologíade amplio espectro, con un escenariopotencial de distribución y aceptaciónenorme, que será fácil de usar y que va adar grandes oportunidades a los desarro-lladores y diseñadores para hacer mejorsoftware y a los usuarios para tener unaexperiencia de usuario más rica.

Por supuesto, Silverlight no está limi-tado en absoluto a la distribución de con-tenido multimedia, ni tampoco a la cre-ación de ciertos tipos de aplicaciones. Yolo veo como un mecanismo multiplata-forma, independiente del navegador, quepermite un entorno de desarrollo muyrico y, por consiguiente, muy rico en eltipo de aplicaciones que se pueden crearcon él. De hecho, Silverlight puede cam-biar completamente la forma en que seaborden e implementen las aplicacionesen un futuro inmediato. Ésa es para mí laauténtica revolución.

Eso es un reto interesante. Paraconcluir, ¿puedes imaginar qué serácapaz de hacer Silverlight dentro decinco años?

Claro. Estoy pensado en acceso totala cualquier enciclopedia virtual en la red,en telepatía virtual… (Sonrisas). En fin,es inimaginable. Lo que se pueda hacercon software se podrá hacer con Silver-light, esa sí que es mi predicción.

Page 13: dotNetManía - WordPress.com...Introducción a Windows Live Web Services • XNA. ¿Presente o futuro? • VS 2005 Team Edition para profesionales de bases de datos (I) • Herramientas
Page 14: dotNetManía - WordPress.com...Introducción a Windows Live Web Services • XNA. ¿Presente o futuro? • VS 2005 Team Edition para profesionales de bases de datos (I) • Herramientas

La fórmula es muy clara, ofreciéndonos estos recur-sos mediante unos términos de uso consistentes paratodo el rango de servicios que abarca WLWS. Pode-mos tomar ventaja de estas aplicaciones y serviciosWeb para ofrecer unas experiencias ricas y persona-lizadas sobre interfaz Web o sobre la interfaz queprefiramos, ya que también, en según qué servicios,WLWS nos permite acceder a la API de forma direc-ta, obviamente vía servicios Web.

La infraestructuraAl ser una plataforma de servicios internacional, sehalla distribuida globalmente, con el objetivo de ofre-cer los mejores servicios en tiempo real, optimizan-do la gestión de la petición derivándola al centro deservicios más cercano que nos pueda dar respuestaen el menor tiempo posible. Realmente, se ha mon-tado una infraestructura global para obtener unostiempos de respuesta que actualmente son muy bue-nos, prácticamente inmediatos. Por poner detalles,la red global, de nombre Content Delivery Network(CDN), dispone de un ancho de banda de 1 tera-bit/segundo.

Los serviciosLos servicios que ofrece esta nueva platafor-

ma, también conocida como Windows Live, sonmuy interesantes, tanto por su facilidad de imple-mentación como por su bajo costo, además de queestán en evolución constante. Se podrían destacarlos siguientes:

Rich Media

Todos conocemos Silverlight (o al menos nossuena). En cualquier caso, este servicio tambiénse denomina Silverlight Streaming y realmentehace honor a su nombre, complementando amplia-mente a dicha tecnología, a modo de tándem. Estees un servicio gratuito para todo aquel que quie-ra incluir aplicaciones y contenido basados en Sil-verlight en un sitio Web de una forma rápida, sen-cilla y no intrusiva.

Este servicio nos ofrece hospedaje gratuito dehasta 4 gigabytes y ancho de banda prácticamenteilimitado. El único límite, actualmente, es que losvídeos no pueden superar los 20 Mb de tamaño o 10minutos de duración, por temas legales del códecactualmente en uso. Eso sí, es perfectamente posi-ble ubicar vídeo en alta definición (720p) sin ningúnproblema. También podemos hospedar aplicacionesSilverlight y ponerlas en nuestras páginas Web conla inclusión de un simple IFRAME. Para más infor-mación, visite http://silverlight.live.com.

Photos

Windows Live Spaces Photos permite a los usua-rios finales compartir las imágenes que tengan en susMicrosoft Spaces, habilitando a otros sitios Web elacceso a las mismas, así como ofrecer servicios aña-didos sobre éstas, evitando realizar múltiples uploads,al ofrecer permisos de uso. También permite el desa-rrollo de servicios que ofrezcan valor añadido, apro-

Introducción a Windows Live Web Services

plataforma.net

José Luis Latorre es .NET SoftwareArchitect de IN2

(http://www.in2.es),especializado en

tecnologías RIA (WPF,Silverlight) y en .NET

Framework 3.5. Coordina el grupo de

usuarios .NET de Barcelona, BcnDev

(http://www.bcndev.net) ycolabora activamente

con INETA Europacomo VP Sponsorship(http://europe.ineta.org).

Windows Live Web Services (WLWS) es la apuesta de Microsoft en lalínea de orientación a servicios a la que últimamente está tendiendo. Lafilosofía de WLWS se basa en ofrecer unos servicios y aplicaciones quenos permiten generar atractivas e interesantes aplicaciones Web muyrápidamente.

José Luis Latorre

Page 15: dotNetManía - WordPress.com...Introducción a Windows Live Web Services • XNA. ¿Presente o futuro? • VS 2005 Team Edition para profesionales de bases de datos (I) • Herramientas

dotN

etM

anía

<<

15

dnm.plataforma.net<<

vechando las ventajas de una comparti-ción programática y las posibilidades denetworking que esto nos ofrece. Actual-mente existen 120 millones de usuarios yse generan cerca de 60 millones de fotosal día. Para más información, visitehttp://dev.live.com/spacescontrol.

Contacts

Windows Live Contacts nos permi-te utilizar el almacén de contactos pro-pio del servicio para utilizar los contac-tos con un sitio Web. Ello permite inte-grar una aplicación Web que utilice, pre-vio consentimiento del usuario, los datosde contacto que actualmente existan enWindows Live, ofreciendo una nuevadimensión social a cualquier Web en laque esto se aplique, permitiendo la inte-racción vía otras herramientas y servi-cios de Windows Live, como la mensa-jería instantánea (IM), entre otros. Lared de contactos actual está compuestapor 500 millones de libros de direccio-nes y 26.000 millones de registros decontactos. Para más información, visitehttp://dev.live.com/contacts.

Maps

El servicio de mapeado de WindowsLive, más conocido como Virtual Earth,es uno de los servicios más interesantes.Se trata de una nueva generación de ser-vicios de mapeado y localización, queofrece innovadoras visualizaciones comola “vista de pájaro”, satelital y aérea. Tam-bién nos ofrece estilos de mapa y bús-queda local ampliada. Recientemente seha ampliado con la posibilidad de utili-zar Live Search sobre tales ubicaciones,y está plenamente integrado con Map-Point Web Services.

Actualmente existen 17 petabytes dedatos cartográficos distribuidos geográ-ficamente por todo el mundo. Para másinformación, visite http://dev.live.com/virtualearth.

Search

Este servicio nos permite accederdirectamente o vía API al motor de bús-queda Windows Live Search. Esto nos

permite la creación de un amplio abani-co de aplicaciones que utilicen búsque-das especializadas. Hay que destacar elSDK y las posibilidades de búsqueda queeste servicio ofrece, permitiendo buscarpor localización, en Web, imágenes, noti-cias (news), phonebook, etc. Actualmenteexisten 5 billones de documentos y alre-dedor de 500 millones de imágenes en labase de datos. Y ha mejorado enorme-mente la calidad de las respuestas y la loca-lización de las mismas. La URL del ser-vicio es http://dev.live.com/livesearch.

Authentication

El servicio de autenticación de Win-dows Live, también conocido como LiveID, y anteriormente conocido como la redPassport, es un sistema de gestión de iden-tidades que podemos utilizar en un sitioWeb o una aplicación cliente. Con ellopodemos autentificar a visitantes de un sitioWeb o aplicación y ofrecerles un servicioo contenido personalizado. Live ID dis-pone actualmente 450 millones de identi-dades, y cada día se realiza una media de1.000 millones de autentificaciones. Parasaber más, visite http://dev.live.com/liveid.

Otros servicios

No solamente existen los serviciosantes comentados, sino que ademásestán vivos y en expansión y/o mejoraotros como los siguientes:

• Alerts. • Custom Domains.• Expo.• Messenger.• Spaces.• Writer.• Gadgets.• Microsoft MapPoint Web Service.• Windows Live Data SDK, Alpha 1.0.• Microsoft AdCenter API.• Windows Live Spaces MetaWeblog

API.• Windows Live Toolbar Custom

Button SDK.

Otros tantos se encuentran endesarrollo. Para estar al día sobre losservicios, la URL de referencia es:http://dev.live.com/services.

Términos de contrato

Básicamente, los términos de contrata-ción de estos servicios son por volumeno cuota de uso, en base a los UsuariosÚnicos (UU) de la página o aplicaciónWeb. Esto está pensado para eliminar cos-tes asociados a muchas aplicaciones Web(servidores, licencias, mantenimiento,etc.) y proporcionar unas estimaciones decostes predecibles para grandes aplica-ciones Web o con un gran volumen devisitas. Concretamente, los sitios Webcon un volumen inferior a un millón deUU por cuatrimestre no pagarían nin-guna tarifa. Por otro lado, los serviciosutilizados vía controles Web no deberíanpagar nunca tarifa alguna, independien-temente del volumen de uso. Los sitiosque sí excedan del millón de UU pagarán$0.25 por UU al año por el servicio, o loabonarán vía compartición con Micro-soft de los beneficios de publicidad.

No obstante, hay algunas excepcio-nes a este modelo basado en UU: Search,Virtual Earth y Silverlight Streaming. Enel caso de Search, las primeras 750.000búsquedas del mes son gratuitas; para Vir-tual Earth, son gratuitas los primeros 3millones de celdas servidas del mes songratuitas, y en Silverlight Streaming nohay límite para el uso gratuito de los 4Gb;si se desea obtener o aplicar otro uso,habrá que realizar un acuerdo comercialcon Microsoft. Es interesante referirse ala Web de Windows Live para consultarlos términos, ya que éstos pueden variar:http://dev.live.com/terms.

Y como ejemplo, un botón(digo, un vídeo)

A continuación, veremos cómo desa-rrollar y adaptar una sencilla aplicaciónSilverlight para su uso en la Web median-te el servicio de streaming. Como lasactuales prestaciones de Silverlight lohacen idóneo para el tratamiento y dis-tribución de vídeos, realizaremos unapequeña aplicación que reproduzca uno.Esto lo haremos apoyándonos en lasmejores y más recientes herramientasactualmente disponibles: Visual Studio2008 y las Silverlight 1.1 Tools (Alpha)for Visual Studio 2008. Puede descargar

Page 16: dotNetManía - WordPress.com...Introducción a Windows Live Web Services • XNA. ¿Presente o futuro? • VS 2005 Team Edition para profesionales de bases de datos (I) • Herramientas

dotN

etM

anía

<<

16

dnm.plataforma.net<<

Visual Studio 2008 desde aquí: http://msdn2.microsoft.com/en-us/ie/bb188238.aspx. Las extensiones de Silverlightestán accesibles desde este otro enlace:http://www.microsoft.com/downloads/details.aspx?FamilyId=25144C27-6514-4AD4-8BCB-E2E051416E03&displaylang=en.

Desde Visual Studio 2008 realizamos“File” | “New” | “Project”, y especifi-camos que queremos crear un proyectode tipo Silverlight, al que le daremos denombre SilverlightMediaTest. Esto noscrea un proyecto Silverlight en blancoque ya funciona de por sí tanto en localcomo desplegado en un servidor.

Seguido, añadiremos al proyecto unvídeo (no mayor de 20 Mb, debido a laslimitaciones actuales del servicio Sil-verlight Streaming). Para el ejemploutilizaremos el archivo thebutterfl-yandthebear.wmv, incluido en el SDK deSilverlight 1.0, que copiaremos al direc-torio del proyecto; sobre el proyectoharemos “Add” | “Existing item” yseleccionaremos el vídeo.

Posteriormente, abriremos Page.xamle insertaremos la siguiente línea de códi-go dentro de la etiqueta Canvas:

El atributo x:Name=“media” esimprescindible para luego poder refe-rirnos al objeto XAML en cuestión ycontrolarlo, bien sea desde Javascript odesde código manejado.

En este punto, podríamos probar laaplicación y validar que el vídeo sereproduce adecuadamente.

Seguidamente, añadiremos losbotones para controlar el vídeo, envuel-tos por un Canvas (listado 1).

A continuación, añadiremos el com-portamiento, introduciendo en el archi-vo Page.xaml.cs el código que gestionarálos diferentes eventos de los botones paracontrolar el MediaElement (listado 2).

Por último, en el evento Page_Loa-ded se asigna un delegado al eventoFullScreenChange del objeto que hospe-da el navegador, BrowserHost (en el espa-

<MediaElement x:Name=”media”Source=”thebutterflyandthebear.wmv”Width=”300” Height=”300” Stretch=”UniformToFill” />

<Canvas x:Name=”buttonPanel”>

<!—Detener la reproducción—><Canvas MouseLeftButtonDown=”media_stop”

Canvas.Left=”10” Canvas.Top=”265”><Rectangle Stroke=”Black”

Height=”30” Width=”55” RadiusX=”5” RadiusY=”5”><Rectangle.Fill><RadialGradientBrush GradientOrigin=”0.75,0.25”><GradientStop Color=”Orange” Offset=”0.0” /><GradientStop Color=”Red” Offset=”1.0” />

</RadialGradientBrush></Rectangle.Fill>

</Rectangle><TextBlock Canvas.Left=”5” Canvas.Top=”5”>Stop</TextBlock>

</Canvas>

<!—Pausar la reproducción —><Canvas MouseLeftButtonDown=”media_pause”

Canvas.Left=”70” Canvas.Top=”265”><Rectangle Stroke=”Black”

Height=”30” Width=”55” RadiusX=”5” RadiusY=”5”><Rectangle.Fill><RadialGradientBrush GradientOrigin=”0.75,0.25”><GradientStop Color=”Yellow” Offset=”0.0” /><GradientStop Color=”Orange” Offset=”1.0” />

</RadialGradientBrush></Rectangle.Fill>

</Rectangle><TextBlock Canvas.Left=”5” Canvas.Top=”5”>Pause</TextBlock>

</Canvas>

<!—Iniciar la reproducción —><Canvas MouseLeftButtonDown=”media_play”

Canvas.Left=”130” Canvas.Top=”265”><Rectangle Stroke=”Black” RadiusX=”5” RadiusY=”5”

Height=”30” Width=”55”><Rectangle.Fill><RadialGradientBrush GradientOrigin=”0.75,0.25”><GradientStop Color=”LimeGreen” Offset=”0.0” /><GradientStop Color=”Green” Offset=”1.0” />

</RadialGradientBrush></Rectangle.Fill>

</Rectangle><TextBlock Canvas.Left=”5” Canvas.Top=”5”>Play</TextBlock>

</Canvas>

<!—Cambiar a modo de pantalla completa —> <Canvas MouseLeftButtonDown=”toggle_fullScreen”Canvas.Left=”190” Canvas.Top=”265”><Rectangle Stroke=”Black” RadiusX=”5” RadiusY=”5”

Height=”30” Width=”85”><Rectangle.Fill><RadialGradientBrush GradientOrigin=”0.75,0.25”><GradientStop Color=”Gray” Offset=”0.0” /><GradientStop Color=”Black” Offset=”1.0” />

</RadialGradientBrush></Rectangle.Fill>

</Rectangle><TextBlock x:Name=”FullScreenButton” Canvas.Left=”5” Canvas.Top=”5”Foreground=”White” >Full Screen</TextBlock>

</Canvas>

</Canvas>

Listado 1

Page 17: dotNetManía - WordPress.com...Introducción a Windows Live Web Services • XNA. ¿Presente o futuro? • VS 2005 Team Edition para profesionales de bases de datos (I) • Herramientas

cio de nombres System.Windows.Inte-rop) para añadir la funcionalidad de pan-talla completa, y añadimos el bloque decódigo que ejecuta las acciones corres-pondientes (listado 3).

Con esto, ya podríamos pulsar [F5] yprobar que nuestra aplicación se ejecutacorrectamente.

Ahora para subirlo a Silverlight Stre-aming debemos registrarnos enhttps://silverlight.live.com y asociar nues-tra cuenta Live ID al servicio. Luegohemos de realizar unas modificacionesmenores para que nuestra aplicación seejecute vía Silverlight Streaming, ya quela aplicación se hospedará en una ubica-ción diferente de la página Web que lacontendrá. También varía la forma derenderizar el control Silverlight vía Sil-verlight Streaming. Las diferencias que-dan resumidas en la tabla 1.

Para aplicar los cambios, procede-remos a cambiar varios aspectos de laaplicación.a) Primero, cambiaremos la referencia

a Silverlight.js en TestPage.html de:

A:

b) Segundo, abriremos TestPage.html.jsy sustituiremos la función createSil-verlight por:

Cambiando XXXX por el ID de cuenta deSilverlight Streaming.

function createSilverlight(){Silverlight.createHostedObjectEx({source: “streaming:/XXXX/SilverlightMediaTest”,parentElement: document.getElementById(

“SilverlightControlHost”),id: “SilverlightControl”,events: {},initParams: [“”]

});}

dotN

etM

anía

<<

17

dnm.plataforma.net<<

#region Media controlsvoid media_stop(object sender,

MouseEventArgs e){

this.media.Stop();}void media_pause(object sender,

MouseEventArgs e){

this.media.Pause();}void media_play(object sender,

MouseEventArgs e){

this.media.Play();}#endregion Media controls

<script type=”text/javascript”src=”Silverlight.js”>

</script>

using System.Windows.Interop;

public void Page_Loaded(object o, EventArgs e){

// Required to initialize variablesInitializeComponent();

BrowserHost.FullScreenChange += newEventHandler(BrowserHost_FullScreenChange);}

#region Full Screenvoid toggle_fullScreen(object sender, MouseEventArgs e){

BrowserHost.IsFullScreen = BrowserHost.IsFullScreen? false : true;}void BrowserHost_FullScreenChange(object sender, EventArgs e){

if (BrowserHost.IsFullScreen)FullScreenButton.Text = “Click to Return to Browser”;

elseFullScreenButton.Text = “Full Screen”;

if (BrowserHost.IsFullScreen == true){

buttonPanel.Opacity = 0;media.Width = BrowserHost.ActualWidth;media.Height = BrowserHost.ActualHeight;

}else{

buttonPanel.Opacity = 1;media.Width = 300;media.Height = 300;

}}#endregion Full Screen

Listado 2

Listado 3

Entorno host

RenderizaciónHTML

Silverlight.js

Interacción

La página Web que hospeda laaplicación se almacena junto conel código de la misma.

Directamente en la etiqueta<object>.

Se utiliza la copia local en el servidor;invocando a CreateObjectEx().

La página Web que hace de hostinteractúa libremente con el códi-go de la aplicación.

La página Web que hospeda la apli-cación se almacena de forma separa-da del código de la misma.

Vía un <iframe>, aunque hay másopciones.

Se utiliza una copia remota; invocan-do a CreateHostedObjectEx().

La página que hace de host queda limi-tada a facilitar los parámetros de inicioen el momento de carga de la aplicación.

Tabla 1. Diferencias entre aplicaciones publicadas con y sin Streaming.

Non-Streamed Streamed

<script type=”text/javascript”src=”http://agappdom.net/h/silverlight.js”>

</script>

Page 18: dotNetManía - WordPress.com...Introducción a Windows Live Web Services • XNA. ¿Presente o futuro? • VS 2005 Team Edition para profesionales de bases de datos (I) • Herramientas

dotN

etM

anía

<<

18

dnm.plataforma.net<<

c) Tercero, en la cabecera del archivo Page.xaml, cam-biaremos la referencia al ensamblado de .NET de:

A:

d) El cuarto paso implica la creación de un archivo XMLnuevo en el proyecto, de nombre manifest.xml, alcual le asignaremos el siguiente contenido:

El último y quinto paso radica en empa-quetar la aplicación para subirla a SilverlightStreaming, copiando los siguientes archivos aun directorio: la DLL SilverlightMedia-Test.dll, el archivo de manifiesto manifest.xml,la página XAML y el archivo de vídeo, thebut-terflyandthebear.wmv en nuestro caso. Los com-primimos directamente, en un archivo ZIPestándar, SilverlightMediaTest.zip y subimosel resultado al servicio de streaming, estandoautenticados en la Web de gestión del servicio,https://silverlight.live.com/files.aspx; se debehacer clic en “Upload a Silverlight Applica-tion” y seguir los pasos descritos. Despuésde haber subido la aplicación, deberemosesperar un minuto aproximadamente a queésta se replique por la red de distribución decontenidos de Live. Podremos probarla des-de la propia página de resultado, que nosofrece la opción “Launch Application TestPage” (figura 1).

Como detalle, desde hace poco también podemosejecutar la aplicación directamente desde un IFRAME,mediante la siguiente sintaxis (fuente: el blog de Cat-herine Heller, en http://blogs.msdn.com/cheller):

En cualquier caso, todo esto nos permite desarro-llar aplicaciones o componentes con una alta escalabi-lidad, distribuidos geográficamente y que hagan uso deunos servicios que de otro modo nos costarían valiososrecursos, como la infraestructura necesaria para la emi-sión de vídeo. Como nota final, solo añadir que el ser-vicio dispone de una API REST para ser utilizado pro-gramáticamente, lo que amplía aún más las posibilida-des del mismo.

Todo el código presentado en este artículo, tanto dela aplicación estándar como de la versión adaptada paraSilverlight Streaming, está disponible para su descargaen http:// www.silverlightguy.com.

x:Class=”SilverlightMediaTest.Page;assembly=ClientBin/SilverlightMediaTest.dll”

x:Class=”SilverlightMediaTest.Page;assembly=/SilverlightMediaTest.dll”

<SilverlightApp>

<source>Page.xaml</source><version>1.0</version><width>100%</width><height>100%</height><inplaceInstallPrompt>true

</inplaceInstallPrompt><background>#FFFFFF</background><framerate>24</framerate><isWindowless>false</isWindowless>

</SilverlightApp>

<html><body>

<iframesrc=http://silverlight.services.live.com/

invoke/AccountID/AppName/iframe.htmlscrolling=”no” frameborder=”0” width=”500” height=”400”>

</iframe>

</body></html>

Figura 1. La aplicación desplegada.

Page 19: dotNetManía - WordPress.com...Introducción a Windows Live Web Services • XNA. ¿Presente o futuro? • VS 2005 Team Edition para profesionales de bases de datos (I) • Herramientas
Page 20: dotNetManía - WordPress.com...Introducción a Windows Live Web Services • XNA. ¿Presente o futuro? • VS 2005 Team Edition para profesionales de bases de datos (I) • Herramientas

Hace algunos años, el equipo de Tom Millercomenzó su andadura en el desarrollo de Mana-ged DirectX (en adelante MDX): un envoltorio.NET para DirectX nativo. En un mundo mono-polizado por el lenguaje C++, aparecieron muchosdetractores de esta iniciativa, por lo que la prime-ra motivación para cometer semejante herejía fuemeramente práctica: tener acceso a la funcionali-dad DirectX desde lenguajes como C# o VisualBasic .NET.

Con el tiempo, MDX ha demostrado (con tasasde rendimiento situadas entre el 90% y el 98% delas ofrecidas por una aplicación nativa), que es unaalternativa a DirectX perfectamente válida. Aho-ra bien, ¿es necesaria dicha alternativa? ¿Real-mente necesitamos un cambio en el sector de losvideojuegos? La respuesta probablemente sea “sí”.Veamos por qué.

Problemática actual

En ocasiones, la elaboración de videojuegos es unatarea de índole artesanal, algo no deseable en unmercado que ha convertido cada proyecto en unainversión multimillonaria. Por ello, se hace nece-saria la aparición de metodologías de desarrolloestandarizadas, tan versátiles y eficientes como seaposible.

Además, en estos proyectos intervienen per-sonas con perfiles muy distintos: dibujantes, escri-tores, publicistas, programadores, músicos, ges-tores de proyecto, etc. Coordinar el trabajo detodos ellos puede convertirse en una labor muycomplicada. Brian Keller (Product Manager,Microsoft Corp.) afirmó en la Game DevelopersConference de 2006 que puede llegar a costar undía entero conocer el estado real de un proyecto.

También existe un grave problema de inte-roperabilidad de datos, ya que los contenidos delos títulos actuales llegan a suponer varios Gb dedatos, con miles de modelos 3D, texturas, soni-dos, textos, etc.

Por último, el software que compone un juegoha de ser muchas veces multiplataforma. Esto impli-ca rescribir gran parte del código para adaptarlo alas peculiaridades de un hardware determinado.

La propuesta de Microsoft para afrontar estoscuatro problemas pasa por la adopción del mode-lo de desarrollo .NET, junto con Visual Studio2005 (en adelante VS2005) o superiores.

MDX al rescateComo primer modelo .NET para el desarrollo dejuegos, Microsoft propuso MDX bajo VS2005.Utilizar este “tándem” implica adoptar el mode-

XNA ¿Presente o futuro?

plataforma.net

Iñaki Ayucares Ingeniero

en Informática, ha trabajado cuatroaños como analista

.NET y siete en el sector de la

simulación. Es el creador del proyecto Simax.

Más información en sublog:

http://graphicdna.blogspot.com

El desarrollo de software está en constante evolución hacia modelosde desarrollo cada vez “más elevados”. Ser más eficientes y producti-vos es la máxima que todo el mundo busca, y el sector de los video-juegos no iba a librarse eternamente de esta tendencia. XNA nace paraacercar al sector esos dos objetivos y para fomentar la comunidad dedesarrolladores “indie”, actualmente desplazada por proyectos multi-millonarios. ¿Será una apuesta acertada?

Iñaki Ayucar

Page 21: dotNetManía - WordPress.com...Introducción a Windows Live Web Services • XNA. ¿Presente o futuro? • VS 2005 Team Edition para profesionales de bases de datos (I) • Herramientas

dotN

etM

anía

<<

21

dnm.plataforma.net<<

lo de desarrollo según la guía de estilos.NET, con menos líneas de código (has-ta un 25% menos, según Tom Miller)y un sistema de excepciones estructu-radas, que nos permite librarnos de losodiados códigos 0x8876086C. Puedeincorporar un sistema de pruebas com-pleto (tests de cobertura de código,pruebas unitarias, etc.) que implicagenerar software más robusto, y ademásse cometen menos errores gracias avariables fuertemente tipadas. Se dis-pone de infinidad de tareas ya resuel-tas (System.Collections, System.Drawing,System.Xml, System.IO, etc.) y una mayorfacilidad de depuración para dejar detoparnos con el famoso IUnknown. Tam-bién incluye enormes ayudas al pro-gramador (Intellisense, refactorización,etc.) que posibilitan el desarrollo rápi-do de prototipos.

Basándome en mi experiencia per-sonal con ambas versiones de DirectX,los tiempos de desarrollo de los pro-yectos MDX pueden reducirse hasta un40%, y los resultados pueden apreciar-se en la figura 1. Además, la gestión deproyectos se simplifica, completa y cen-traliza, proporcionando más y mejoresherramientas al gestor. Esto reduce ries-gos y permite conocer más rápidamen-te el estado de un proyecto.

Todo esto es magnífico y nos ayuda aafrontar los dos primeros problemas men-cionados en el apartado “Problemáticaactual”. ¿Qué ocurre con los otros dos?

Nace XNACon el tiempo, y una vez MDX hademostrado ser una API perfectamen-te funcional, le han ido acompañandouna serie de utilidades que ayudan alprogramador con las tareas más mecá-nicas y repetitivas. Estas utilidades, lide-radas por una clase denominada Frame-work, resultaron ser las auténticas pre-cursoras de XNA. Entonces, ¿qué esXNA?

Según Microsoft, es un frameworkconstruido sobre DirectX 9.0c (no sobreDirectX10, como algunos creen, ya queéste solo funciona en Windows Vista yXNA es perfectamente compatible con

XP). Viendo esa definición, a muchos denosotros nos asaltan más preguntas. ¿Quées exactamente un framework? ¿Es unalibrería de utilidades? ¿Una API? ¿Unenvoltorio construido sobre una deter-minada tecnología, como MDX? En rea-lidad, es eso y algo más…

“Cuando usas una librería, tú escri-bes el cuerpo principal del programa, yreutilizas métodos proporcionados porésta para realizar ciertas acciones. Cuan-do utilizas un framework, reutilizas elcuerpo principal y escribes los métodosa los que éste llama” [1].

Esta aclaración resulta importan-te, ya que XNA está diseñado exacta-mente así: proporciona al desarrolla-dor la posibilidad de centrarse en loque realmente le importa (la lógica del

juego), y le permite olvidarse de todala infraestructura que hay por debajo.Utiliza el denominado Principio deHollywood: centrarse únicamente enlos métodos Inicializar, Actualizary Dibujar.

“La consecuencia directa de utili-zar un framework es que los desarrollosson más ágiles y tienen estructurassimilares, por lo que su mantenimien-to también resulta más sencillo” [3].

Resumiendo, XNA nos facilita todoel cuerpo principal de una aplicación: ini-cialización y configuración de dispositi-

vos, bucle principal, gestión de eventos,mensajes, recursos, etc. Así, solo debe-mos preocuparnos de cargar los conteni-dos cuando sean necesarios y de escribirlos métodos Actualizar y Dibujar.

Figura 1: Motor gráfico y físico desarrollado en .NET para el proyecto Simax

XNA nos facilita todo el cuerpo principal de una aplicación. Así, sólo debemos

preocuparnos de cargar los contenidos cuando sean necesarios

y de escribir los métodos Actualizar y Dibujar

Page 22: dotNetManía - WordPress.com...Introducción a Windows Live Web Services • XNA. ¿Presente o futuro? • VS 2005 Team Edition para profesionales de bases de datos (I) • Herramientas

dotN

etM

anía

<<

22

dnm.plataforma.net<<

Objetivos de XNA

XNA nace con tres objetivos muyclaros:

El primero, completar el camino ini-ciado por MDX para acelerar y facilitaraún más la creación de videojuegos, siem-pre manteniendo la potencia de DirectX.Además, Microsoft pretende que vuelvaa ser posible desarrollar un juego desdecasa, con una cantidad de recursos limi-tada. Potenciando la comunidad de desa-rrolladores “indie”, incluso se ha llegadoa hablar de un futuro “YouTube de losjuegos”, donde los desarrolladores modes-tos puedan compartir sus creaciones.

El segundo, mejorar la gestión decontenidos, integrándola con VisualStudio. De hecho, este concepto ha teni-do tanto peso que ha estado presente entodo el proceso de diseño de XNA, loque sin duda ayudará a paliar el tercerproblema expuesto en el apartado “Pro-blemática actual”.

Por último, unificar varias platafor-mas (obviamente Microsoft) bajo unmismo SDK. Mediante una capa deabstracción, se elimina la necesidad deportar entre dispositivos móviles, PC yXBox360. Éste era el último aspectoque quedaba por cubrir.

En definitiva, la aplicación conjun-ta de XNA, Visual Studio y .NET nosofrece soluciones o ayudas para los cua-tro problemas mencionados. Solo que-da descubrir cómo se van a aportar esassoluciones.

Estructura

Como puede verse en la figura 2,XNA está construido en tres capas, alas cuales se añade, en la parte superior,la capa de aplicación.

La primera de estas capas es la pla-taforma tecnológica (el conocido portodos DirectX 9.0c). Por encima deésta, a modo de envoltorio, se constru-ye el núcleo del Framework, dividi-do en cinco apartados según el campoal que van dirigidos (gráficos, audio,adquisición de datos, funcionesmatemáticas y almacenamiento).

La tercera capa, el Frameworkextendido, es el locutor con el que los

d e s a r r o l l a d o r e svamos a tratar. Estádividido en dos gran-des grupos:

El ContentPipeline mereceríaun artículo entero, yaque supone toda unarevolución en la ges-tión de contenidos.Aunque por motivosde espacio no vamosa entrar en demasia-dos detalles, diremosque se trata de un fra-mework personaliza-ble, extensible e inte-grado en Visual Stu-dio, pensado para gestionar los conte-nidos de las aplicaciones de forma sen-cilla. Uno de los cambios más notablesque incorpora es la compilación inte-ligente de contenidos. De forma aná-loga a un fichero de código fuente, quese compila para pasar a formar parte deun ejecutable o DLL, el Content Pipe-line compila los modelos 3D, texturas,etc, y los convierte a un formato dearchivo intermedio que acompaña alejecutable. En este proceso, que se lan-za al compilar la solución, primero seimporta cada fichero a un formatointermedio, y se hace pasar al resulta-do a través de un procesador, el cualpuede transformar los datos o añadirinformación personalizada. Tanto los

importadores de formatos como losprocesadores pueden ser modificadospor el usuario ([2] incluye un tutorialsobre el tema).

Por último, Application Model esla parte del Framework que incluyetodas las clases y métodos con los quese interactúa en tiempo de ejecución,dando cobertura a tareas de gráficos,audio, lectura de datos, etc. Iremosviendo más detalles de esta parte a con-tinuación.

La capa de aplicación

Para ayudarnos en el desarrollo denuestra aplicación, se introducen inte-resantes novedades:

Figura 2: Capas del XNA Framework

Adaptado al futuro y a XBox360

Existen varios cambios en la tecnología base que presenta XNA. El primero de elloses la ausencia de referencias a Windows Forms. Esto se debe al diseño cross-platformcon XBox360, en el cual la inicialización y gestión del dispositivo gráfico corre a car-go de la clase GraphicsDeviceManager. El segundo cambio, y quizá el más radical detodos, es la desaparición del Fixed Pipeline. Ésta es una evolución que las propiasnecesidades del sector han impuesto y ni en DirectX10, ni en XBox360, encontrare-mos ya rastro del Fixed Pipeline. Esto implica innumerables cambios en la forma dedibujar los objetos, ya que desaparecen gran parte de los estados y propiedades deldispositivo: materiales, el Flexible Vertex Format, transformaciones, modos de som-breado, todo el sistema fijo de iluminación, etc. Ahora todos estos estados se gestio-nan como parámetros de los Vertex y Pixel Shaders, que pasan a ser de uso obligato-rio. También se ha eliminado el sistema de coordenadas Left Handed, por lo quetodos los métodos y propiedades relacionados con él desaparecen. Para más infor-mación acerca de estos cambios, revisar la guía de migración de MDX 1.1 a XNA:

http://msdn2.microsoft.com/en-gb/library/bb197956.aspx

Page 23: dotNetManía - WordPress.com...Introducción a Windows Live Web Services • XNA. ¿Presente o futuro? • VS 2005 Team Edition para profesionales de bases de datos (I) • Herramientas

dotN

etM

anía

<<

23

dnm.plataforma.net<<

Por un lado, están los Starter Kits,que no son más que nuevos tipos de pro-yectos Visual Studio orientados a la cre-ación de juegos, tanto para Windowscomo para XBox360. Algunas de estasplantillas son para comenzar desde (casi)cero, y otras para comenzar proyectosque constituyen juegos completos en símismos (es el caso de SpaceWar for Win-dows o para XBox360, distribuidos en elRelease 1 de XNA). Actualmente, yaestán disponibles varios Starter Kits des-cargables desde Internet. Personalmen-te, no imagino a Id Software ™ comen-zando su nuevo proyecto con una plan-tilla de tipo “Quake Unlimited for Win-dows”, pero es un buen punto de parti-da para usuarios menos experimentados.

El segundo gran componente de estacapa es el juego en sí (el código que debe-remos escribir). Existen dos grandes cam-bios aplicables a este apartado: el prime-ro, la filosofía comentada en el apartado4, basada en el Principio de Hollywood.

El segundo fomenta el desarrollobasado en componentes. De igual formaque actualmente añadimos a un formu-lario Windows controles de tipo ListBoxo Button, añadiremos ahora componen-tes de juego del estilo: Balón, Jugador,etc. Utilizando palabras de Microsoft, unGame Component es una pieza inde-pendiente, reusable, con la que se puedeinteractuar, y que sigue un diseño basa-do en el Principio de Hollywood. Depuertas afuera solo expone los métodos:Inicializar, Actualizar y Dibujar.

Un ejemplo prácticoPara terminar, veremos un sencilloejemplo que carga y dibuja un modelo3D en pantalla, y que se completa conapenas 30 ó 40 líneas de código y 5minutos de trabajo.

Inicialización de la aplicación

En Visual C# Express, escogemosla opción “Archivo” | “Nuevo Proyec-to”, y después, la plantilla “WindowsGame”. Como podemos observar en lafigura 3, el sistema creará un nuevo pro-yecto con dos referencias y dos archi-

vos. El primero es Program.cs, que úni-camente contiene el método Main parainstanciar y ejecutar un objeto de la cla-se Game1 (invocando su método Run). Elsegundo archivo es el que contiene lapropia clase Game1, en la que se va aincluir el código de la aplicación.

Dentro de esta clase, el primermétodo en el que debemos fijarnos essu constructor, cuyo código aparece enel listado 1. En él únicamente se creanlos objetos GraphicsDeviceManager y Con-tentManager, utilizados a lo largo de todala aplicación. Como ejemplo, hemosañadido las tres últimas líneas, que per-sonalizan algunos aspectos de la venta-na donde se va a dibujar.

Carga de un modelo 3D

En XNA, el contenido es parte dela solución, así que para añadir nuestroprimer modelo 3D a la escena, prime-ro debemos incluirlo en una carpeta delExplorador de soluciones (ver figura 3).Para este ejemplo utilizaremos el mode-lo bigship1, incluido en el SDK deDirectX.

Dado que Content Pipeline estáintegrado con Visual Studio, participaen la gestión del modelo desde elmomento en que lo añadimos a la solu-ción. Puede observarse en las propieda-des del fichero que aparecen datos comolos módulos que se van a encargar deimportarlo y procesarlo. En este caso,como es un fichero de formato conoci-do (.X), el sistema añade la configura-ción por defecto. Es aquí donde un usua-rio puede especificar sus propios impor-tadores y procesadores de formatos.

Otro dato importante es el AssetName, o el nombre con el que el Con-tent Pipeline va a identificar al recurso(la identificación se hace teniendo encuenta la ruta de carpetas que está pordebajo de la solución, en este caso Con-tenido\\Modelos\\bigship1).

Cada vez que se compila el modelo3D, se genera un fichero en formatointermedio (en este caso XNB) en eldirectorio de salida. Para realizar su car-

public Game1(){mGraphics = newGraphicsDeviceManager(this);

mContent = newContentManager(Services);

// Modificar propiedades // del dispositivomGraphics.PreferredBackBufferWidth=

640;mGraphics.PreferredBackBufferHeight=

480;

mGraphics.IsFullScreen = false;}

Listado 1

Figura 3: Contenido dentro de la solución

Page 24: dotNetManía - WordPress.com...Introducción a Windows Live Web Services • XNA. ¿Presente o futuro? • VS 2005 Team Edition para profesionales de bases de datos (I) • Herramientas

dotN

etM

anía

<<

24

dnm.plataforma.net<<

ga, podemos utilizar el método Load-GraphicsContent (ver listado 2), invoca-do por el Framework una vez ha crea-do e inicializado el dispositivo gráfico.

El método Load es un ejemplo quemuestra que cómo el uso de genéricosse extiende por todo el código de XNA.El resultado de la carga es una variablede tipo Model que se almacena en lavariable miembro mShip.

Dibujado en pantalla

Para dibujar los objetos en panta-lla, el Framework invoca en cada foto-grama al método Draw, en el que debe-mos realizar dos tareas: primero lim-piar el buffer de dibujo (que actualmentecontiene el resultado del fotogramaanterior) y después dibujar la escena enla situación actual.

Dado que el Fixed Pipeline ha desa-parecido por completo, los estados deconfiguración de dibujo se ven reduci-dos drásticamente, siendo reemplaza-dos por parámetros de los shaders. Parafacilitarnos la migración desde las APIque usan el Fixed Pipeline, XNA incor-pora un shader que actúa como sustitu-to y que es asignado por defecto a todoslos modelos, hasta que nosotros explí-citamente asignemos uno diferente.Dicho shader se denomina BasicEffecty proporciona cálculos estándar de ilu-minación, materiales, texturas y trans-formación de geometría.

La clase Model (que alberga el obje-to cargado) puede estar compuesta pormás de una malla (mesh), por lo quedebemos recorrerlas todas, dibujándo-las una a una. Además, cada una de estasmallas puede dibujarse mediante uno omás shaders (disponibles en la colecciónMesh.Effects).

En el listado 3 podemos ver el con-tenido del método Draw utilizado en elejemplo. Primero se limpia el buffer de

dibujo, luego se configuran los pará-metros de los shaders (ver más adelan-te) y por último se invoca el dibujo decada malla.

Configuración de shaders

Para que el dibujo quede como el dela figura 4, es necesario configurar dosaspectos del shader. Por un lado estánlos parámetros de iluminación. En ellistado 3 se configuran mediante elmétodo EnableDefaultLightning, el cualaplica una fuente de luz con parámetroshabituales, válida para ejemplos senci-llos en los que no es necesario perso-nalizar la iluminación.

En segundo lugar, debemos indicaral shader cómo ha de transformar lageometría. Para ello se utilizan las clá-sicas matrices World (transformación delobjeto), View (transformación de cáma-ra) y Projection (proyección de la geo-metría a un plano 2D).

En el listado 3 se aplica una matrizidentidad a la primera, ya que el modelova a dibujarse en su estado natural. En

este punto podríamos aplicar matrices derotación, traslación o escalado para cam-biar este comportamiento.

También se aplica una matriz de cáma-ra que observa desde el punto (5, 8, 20),mirando hacia el punto Vector3.Zero, eneste caso el centro del modelo.

protected override void LoadGraphicsContent(bool loadAllContent){

mShip = mContent.Load<Model>(“Contenido\\Modelos\\bigship1”);}

Listado 2

protected override void Draw(GameTime gameTime){

mGraphics.GraphicsDevice.Clear(Color.CornflowerBlue);

foreach (ModelMesh mesh in mShip.Meshes){foreach (BasicEffect effect in mesh.Effects){effect.EnableDefaultLighting();effect.World = Matrix.Identity;effect.View = Matrix.CreateLookAt(

new Vector3(5,8,20), Vector3.Zero, Vector3.Up);

effect.Projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(45.0f),1.3f, 1.0f, 10000.0f);

}mesh.Draw();

}base.Draw(gameTime);

}

Listado 3

Figura 4. Visualización del modelo

Para facilitar el ejemplo, la ini-cialización de estos paráme-tros se hace cada vez que sedibuja el modelo. Obviamen-te, esto no es eficiente y espreferible inicializar los datosque no cambian una sola vez.

[ ]NOTA

Page 25: dotNetManía - WordPress.com...Introducción a Windows Live Web Services • XNA. ¿Presente o futuro? • VS 2005 Team Edition para profesionales de bases de datos (I) • Herramientas
Page 26: dotNetManía - WordPress.com...Introducción a Windows Live Web Services • XNA. ¿Presente o futuro? • VS 2005 Team Edition para profesionales de bases de datos (I) • Herramientas

dotN

etM

anía

<<

26

dnm.plataforma.net<<

Por último, una matriz de proyec-ción con una apertura de lente de 45grados y una relación de aspecto de 1,3(ancho de la ventana dividido por laaltura) proyecta los puntos 3D a unplano 2D para poder mostrarlos enpantalla.

Un ejemplo un poco más complejode carga de contenidos y visualizaciónen tiempo real con cámaras configura-bles puede ser encontrado en [4], y suaspecto se muestra en la figura 5:

ConclusionesHemos podido observar, a lo largo delartículo, que hay diversos aspectos enlos que el sector del desarrollo de jue-gos debe mejorar. La utilización de.NET puede ayudar notablemente asolucionar dichos problemas. ¿Es la úni-

ca alternativa? No, pero sinduda es una de las mejores y,obviamente, Microsoftapuesta por ella.

Teniendo esto en cuen-ta, la segunda pregunta quenos asalta es si el futuro deldesarrollo de juegos va uni-do al futuro de .NET. Aun-que la respuesta a esa pre-gunta estará marcada por laaceptación de la comunidad,no olvidemos que la siguien-te versión nativa de la API

(DirectX 10)sigue estandobasada en elmodelo COM.

Entonces, ¿qué caminoes coger? Quizá el futuro seala convivencia de ambas ver-siones: DirectX nativo paraquien quiera exprimir almáximo el rendimiento delhardware y XNA para quienquiera ser más eficiente yproductivo.

En cuanto a la relaciónde XNA con MDX, cada día

parece más claro que la segun-da plataforma va a dejar de reci-bir soporte por parte de Micro-soft. Esto parecía un problema

grave en los primeros meses de anda-dura de XNA, pero desde la apariciónde XNA Game Studio 2.0, el 13 dediciembre de 2007, muchas de lascarencias de XNA han sido solventa-das, y los desarrolladores están hallan-do nuevas formas de utilizar XNA. Unejemplo es XNAImageReflector ([5]),

una aplicación que integra XNA den-tro de Windows Forms, para añadirreflejos de tipo “Web 2.0” a fotografíase imágenes, dotándolas de un aspectomás profesional a la hora de elaborarpáginas Web o presentaciones (verfigura 6).

De cualquier forma, uno de losaspectos que más me ilusionan de estaplataforma es que quizá haga posibleprogramar un juego completo desde ungaraje, como hace veinte años. Este esuno de los objetivos de Microsoft, yteniendo en cuenta además que dichosjuegos serán compatibles con XBox360,es posible que la comunidad de desa-rrollo “indie” crezca notablemente. Cla-ro que también es posible que un cam-bio tan radical no cale en los desarrolla-dores y esté condenado al fracaso.

¿Cuál de los dos será el destino deXNA? Si hay que elegir uno desde aho-ra, yo apuesto sin ninguna duda por eléxito de esta plataforma.

Figura 5: Tutorial XNA Billiards Visual Demo

Figura 6: XNA Image Reflector

ReferenciasE. Gamma et al., “Design Patterns”, Addison-Wesley, 1995

http://graphicdna.blogspot.com/2007/02/xna-customizing-content-processing.html

http://www.codeproject.com/gen/design/WhatIsAFramework.asp

http://www.thecodeproject.com/KB/game/XNA_Billiards_Visual_Demo.aspx

http://www.thecodeproject.com/KB/graphics/XNA_Image_Reflector.aspx.

[1]

[2]

[3]

RecursosHomePage de XNA: http://creators.xna.com

Blog del equipo XNA: http://blogs.msdn.com/xna/

Blog de Tom Miller: http://blogs.msdn.com/tmiller/

Blog de Iñaki Ayucar: http://graphicdna.blogspot.com

Migración MDX a XNA:http://msdn2.microsoft.com/en-gb/library/bb197956.aspx

[4]

[5]

Page 27: dotNetManía - WordPress.com...Introducción a Windows Live Web Services • XNA. ¿Presente o futuro? • VS 2005 Team Edition para profesionales de bases de datos (I) • Herramientas
Page 28: dotNetManía - WordPress.com...Introducción a Windows Live Web Services • XNA. ¿Presente o futuro? • VS 2005 Team Edition para profesionales de bases de datos (I) • Herramientas

plataforma.net

Al programar con la versión 2.0 de ADO.NETcontra un almacén relacional de datos, nos diri-gimos directamente, utilizando un proveedorconcreto, contra un almacén específico, que nosofrece un conjunto de tablas, vistas, procedi-mientos y funciones con los que podemos inte-ractuar utilizando el lenguaje específico delalmacén (Transact-SQL en el caso de SQL Ser-ver, PL-SQL en el caso de Oracle, etc.), y delcual podremos recuperar conjuntos de resulta-dos compuestos de filas y columnas que, en prin-cipio, no guardan mucha relación con los obje-tos que solemos utilizar cuando desarrollamosen un lenguaje de programación orientado aobjetos como C# 3.0 o VisualBasic 9.0.

La versión 3.5 de ADO.NETofrecerá un Marco de trabajo deentidades (Entity Framework),o Marco de entidades para sim-plificar, que permite superponervarias capas de abstracción sobreel almacén relacional con el finde hacer posible una programa-ción más conceptual (basada enlos conceptos del dominio conel que se trabaja) y de reducir auna mínima expresión el desa-juste de impedancia causado por la dife-

rencia entre los modelos de programación rela-cional y orientado a objetos. El Marco de enti-dades se implementa en el ensamblado Sys-tem.Data.Entity.dll, que contiene numerosasdefiniciones de tipos que pertenecen a espaciosde nombres derivados de System.Data.

Para la ejemplificación práctica de los con-ceptos que se presentarán en esta serie de artí-culos, utilizaremos la base de datos FUTBOL2006de nuestro libro “C# 3.0 y LINQ” [1], que nosllevará a modelos bastante sencillos pero que ala vez nos permitirán introducir las caracterís-ticas esenciales del Marco de entidades que dese-amos mostrar. Un diagrama que representa el

El Marco de trabajo de entidades de ADO.NET v3.5

Octavio Hernández esMentoring Team Leader

de Plain Concepts, editortécnico de dotNetManíay tutor de campusMVP.

Es MVP de C# desde2004, MCSD y MCT.

Autor del libro "C# 3.0 yLINQ".

Unai Zorrilla esDevelopment Team

Leader de Plain Conceptsy tutor de campusMVP.

MVP desde 2004,colabora activamente con

Microsoft en eventos dearquitectura y

desarrollo, así como engiras de productos. Autor

del libro "Modelandoprocesos de negocio con

Workflow Foundation".

La versión 3.5 de ADO.NET, que estará disponible al completo dentrode muy poco tiempo, incluirá el Marco de trabajo de entidades (EntityFramework), todo un aparato conceptual destinado a aumentar nues-tra potencia expresiva a la vez que a simplificar la programación de apli-caciones con acceso a base de datos. Este artículo es el primero de unaserie destinada a mostrar qué es el Marco de trabajo de entidades ycómo podemos aprovechar las posibilidades que nos ofrece.

Octavio HernándezUnai Zorrilla

Figura 1. Modelo lógico de FUTBOL2006

Page 29: dotNetManía - WordPress.com...Introducción a Windows Live Web Services • XNA. ¿Presente o futuro? • VS 2005 Team Edition para profesionales de bases de datos (I) • Herramientas

dnm.plataforma.net<<

modelo lógico de los datos conteni-dos en dicha base de datos se mues-tra en la figura 1. Para ejecutar elcódigo que acompaña a este artículose deberá instalar la Beta 3 deADO.NET y el Marco de entidades(ver sección “Noticias”) sobre VisualStudio 2008.

Los niveles de abstracciónEl primero de los niveles de abstracción(figura 2) que suministra el Marco deentidades es un modelo Entidad-Rela-ción, o un modelo conceptual delalmacén que se denomina Modelo dedatos de entidades (Entity DataModel). En este nivel de abstracción setrabaja contra un conjunto de entidadesy relaciones construidas sobre el mode-lo de la base de datos, que se consultanutilizando un nuevo lenguaje conocidocomo Entity SQL (E-SQL); los resul-tados de esas consultas son también con-juntos de resultados relacionales. Gra-

cias a este nivel, podemos abstraernosno solo del modelo lógico del almacénrelacional de datos, sino además del len-guaje concreto del almacén (Transact-SQL, PL-SQL), lo cual facilita en granmedida el desarrollo de aplicacionescapaces de trabajar contra diferentes sis-temas de bases de datos.

Un segundo nivel de abstrac-ción nos ofrece una capa demapeado objeto-relacional, demodo que podamos construirconsultas y aplicar actualiza-ciones sobre un modelo deobjetos. En este sentido, lo queobtenemos es similar a lo quenos ofrece LINQ to SQL [1,2]. Pero a diferencia de éste,en el Marco de entidades elmodelo de objetos se genera apartir de un modelo concep-tual y no del modelo lógico de

la base de datos. Podemos con-sultar este modelo de objetos uti-

lizando consultas integra-das en el lenguaje,

gracias a un nue-vo sabor deLINQ deno-m i n a d oLINQ to

Entities, o de nuevo utilizando senten-cias E-SQL, las cuales se pasarán tal cualal nivel inferior. En cualquiera de los doscasos, a este nivel los resultados se obtie-nen en forma de objetos o colecciones deobjetos .NET.

Resumiendo lo dicho hasta ahora,con ADO.NET 3.5 y el Marco de enti-

dades podremos consultar el almacénde datos:a) Directamente, como hemos veni-

do haciendo hasta ahora, utilizan-do la variante de SQL que ofreceel almacén,

b) Utilizando E-SQL contra un mode-lo conceptual desarrollado sobre elalmacén,

c) Utilizando consultas integradas o E-SQL contra un modelo de objetosdesarrollado sobre el modelo con-ceptual.

Entremos ahora en más detallescon relación a cada uno de los nive-les que muestra la figura 2, de abajohacia arriba.a) En el nivel inferior tenemos el mode-

lo lógico de nuestro almacén de datosrelacional. En ADO.NET 3.5 sedenomina a este nivel Espacio S (la“S” viene de store –almacén–). El

dotN

etM

anía

<<

29

Figura 2. Niveles de abstracción en el Marco de entidades

Page 30: dotNetManía - WordPress.com...Introducción a Windows Live Web Services • XNA. ¿Presente o futuro? • VS 2005 Team Edition para profesionales de bases de datos (I) • Herramientas

dnm.plataforma.net<<

dotN

etM

anía

<<

30

Marco de entidades necesita teneruna descripción de ese modelo lógi-co, y para ello se introduce unagramática de modelado conocidacomo SSDL (Store Schema DefinitionLanguage –lenguaje de definición deesquema del almacén–), que se utili-za para describir el modelo lógico dela base de datos. El modelo lógicocontiene tablas, vistas, procedimien-tos almacenados y funciones defini-das por el usuario, y se consulta des-de las aplicaciones .NET utilizandolas clases tradicionales de ADO.NET2.0, como pueden ser SqlConnection,SqlCommand o SqlDataReader, en el casode una base de datos SQL Server uOracleConnection, OracleCommand uOracleDataReader, en el caso de unabase de datos Oracle.

b) En el nivel intermedio, el espacioconceptual, o Espacio C, es nuestromodelo de datos de entidades. Enesencia, lo que se hace en este niveles construir un modelo conceptualdel almacén utilizando conceptoscomo tipo de entidad (entity type) ytipo de asociación (association type).Un ejemplo de tipo de entidad podríaser Club; un ejemplo de tipo de aso-ciación, la relación entre un club ysus futbolistas. Otros conceptos quese manejan a ese nivel son los con-juntos de entidades (entity sets), pararepresentar, por ejemplo, conjuntosde clubes o conjuntos de futbolistas,y los conjuntos de asociaciones (asso-ciation sets), para describir conjuntosde relaciones entre clubes y futbo-listas. Para definir este nivel, de nue-vo el Marco de entidades ofrece unagramática de modelado conocidacomo CSDL (Conceptual SchemaDefinition Language –lenguaje dedefinición de esquema conceptual–).Para ejecutar consultas contra estenivel, ADO.NET 3.5 incluirá unnuevo proveedor ADO.NET cono-cido como Proveedor de entidades(Entity Provider). Utilizando clasescomo EntityConnection, EntityCom-

mand o EntityDataReader, podremosejecutar sentencias E-SQL para

obtener conjuntos de resultados simi-lares a los que obtendríamos median-

Nivel Se modela con Contiene Se consulta con

Espacio O Código .NET Clases, propiedades, - ObjectQuery<T>, utilizando E-SQLmétodos, colecciones - Sentencias LINQ

Mapeado 1:1 mediante atributos en código

Espacio C CSDL Tipos de entidades, Proveedor de entidades de tipos de asociaciones, ADO.NET 3.5: EntityConnection,conjuntos de entidades, EntityCommand, EntityDataReader,conjuntos de asociaciones, utilizando E-SQLfunciones

Mapeado mediante fichero MSL

Espacio S SSDL Tablas, vistas, Proveedor ADO.NET y lenguajeprocedimientos almacenados, SQL correspondientes:funciones definidas - Para SQL Server: SqlConnection,por el usuario SqlCommand, SqlDataReader,

utilizando T-SQL.- Para Oracle: OracleConnection,OracleCommand, OracleDataRea-der, utilizando PL-SQL.

Tabla 1. Principales niveles de trabajo en el Marco de entidades

Argumento Significado

/provider, /prov El proveedor nativo de ADO.NET que se utilizará paraacceder a la base de datos.

/connectionstring, /c La cadena de conexión a la base de datos.

/mode El modo de funcionamiento de EDMGen. Sus posiblesvalores son:

• FullGeneration: Genera los esquemas SSDL y CSDL,el fichero de mapeado MSL, las clases de entidades ylas vistas de mapeado.

• FromSsdlGeneration: A partir de un esquema SSDL yaexistente, genera los demás artefactos.

• EntityClassGeneration: A partir de un esquema CSDLya existente, genera las clases de entidades.

• ViewGeneration: Genera vistas de mapeado a partir delos esquemas SSDL y CSDL y el fichero MSL.

• ValidateArtifacts: Valida los esquemas SSDL y CSDLy el fichero MSL.

/project, /p El “nombre del proyecto”, que se utiliza como base paralos nombres utilizados en los esquemas y ficheros demapeado y código.

/language El lenguaje de programación en que se generarán los fiche-ros de código. Los posibles valores son CSharp (predeter-minado) y VB.

Tabla 2. Principales argumentos de EDMGen.exe.

Page 31: dotNetManía - WordPress.com...Introducción a Windows Live Web Services • XNA. ¿Presente o futuro? • VS 2005 Team Edition para profesionales de bases de datos (I) • Herramientas

dnm.plataforma.net<<

dotN

etM

anía

<<

31

te ADO.NET 2.0. Para poder eje-cutar estas consultas, el Marco deentidades necesita disponer delmodelo lógico de la base de datos enSSDL, del modelo conceptual defi-nido en CSDL, y además de la espe-cificación de un mapeado entre elEspacio C y el Espacio S, que se rea-liza a través de un fichero expresadoen MSL (Mapping Schema Language–lenguaje de mapeado de esque-mas–), que mapea las construccionesde un espacio a construcciones delotro.

c) El nivel superior, conocido comoespacio de objetos (Espacio O), nospermite ejecutar consultas contra unmodelo de objetos consistente en cla-ses como Club, Futbolista, etc. queofrecen las propiedades, métodos yeventos adecuados. Las consultascontra ese modelo de objetos se pue-den construir utilizando una clase lla-mada ObjectQuery<T>, que a partir desentencias E-SQL produce objetos.NET o secuencias de objetos .NET;pero a este nivel lo más natural serádefinir las consultas contra el mode-lo utilizando consultas integradas enel lenguaje (LINQ), para lo que elmodelo de objetos define los corres-pondientes puntos de entrada. Estemodelo de objetos se mapea al mode-lo conceptual mediante atributos conlos que se decoran las clases y pro-piedades del modelo de objetos. Enla versión actual del Marco de enti-dades, este mapeado es un mapeado1:1, por lo que el Espacio O es muyparecido al Espacio C.

La tabla 1 resume las característicasfundamentales de cada uno de los nive-les de abstracción.

Un ejemplo prácticoHay dos maneras de generar los fiche-ros necesarios para dar soporte al Mar-co de entidades: una es utilizando la uti-lidad de línea de comandos EDMGen.exe;

<?xml version=”1.0” encoding=”utf-8”?><Schema Namespace=”Futbol2006.Store” Alias=”Self”

xmlns=”http://schemas.microsoft.com/ado/2006/04/edm/ssdl”><EntityContainer Name=”dbo”><EntitySet Name=”Club” EntityType=”Futbol2006.Store.Club” /><EntitySet Name=”Futbolista” EntityType=”Futbol2006.Store.Futbolista” /><EntitySet Name=”Pais” EntityType=”Futbol2006.Store.Pais” /><AssociationSet Name=”FK_Futbolista_Club”

Association=”Futbol2006.Store.FK_Futbolista_Club”><End Role=”Club” EntitySet=”Club” /><End Role=”Futbolista” EntitySet=”Futbolista” />

</AssociationSet><AssociationSet Name=”FK_Futbolista_Pais”

Association=”Futbol2006.Store.FK_Futbolista_Pais”><End Role=”Pais” EntitySet=”Pais” /><End Role=”Futbolista” EntitySet=”Futbolista” />

</AssociationSet></EntityContainer><EntityType Name=”Club”><Key><PropertyRef Name=”Codigo” />

</Key><Property Name=”Codigo” Type=”char” Nullable=”false” MaxLength=”3” /><Property Name=”Nombre” Type=”varchar” Nullable=”false” MaxLength=”50” /><Property Name=”Ciudad” Type=”varchar” Nullable=”false” MaxLength=”50” />

</EntityType><EntityType Name=”Futbolista”><Key><PropertyRef Name=”Id” />

</Key><Property Name=”Id” Type=”int” Nullable=”false”

StoreGeneratedPattern=”identity” /><Property Name=”Nombre” Type=”varchar” Nullable=”false” MaxLength=”75” /><Property Name=”Sexo” Type=”char” Nullable=”false” MaxLength=”1” /><Property Name=”FechaNacimiento” Type=”datetime” /><Property Name=”CodigoPaisNacimiento” Type=”char” Nullable=”false”

MaxLength=”2” /><Property Name=”CodigoClub” Type=”char” Nullable=”false” MaxLength=”3” /><Property Name=”Posicion” Type=”char” Nullable=”false” MaxLength=”1” />

</EntityType><EntityType Name=”Pais”><Key><PropertyRef Name=”Codigo” />

</Key><Property Name=”Codigo” Type=”char” Nullable=”false” MaxLength=”2” /><Property Name=”Nombre” Type=”varchar” Nullable=”false” MaxLength=”50” />

</EntityType><Association Name=”FK_Futbolista_Club”><End Role=”Club” Type=”Futbol2006.Store.Club” Multiplicity=”1” /><End Role=”Futbolista” Type=”Futbol2006.Store.Futbolista”

Multiplicity=”*” /><ReferentialConstraint><Principal Role=”Club”><PropertyRef Name=”Codigo” />

</Principal><Dependent Role=”Futbolista”><PropertyRef Name=”CodigoClub” />

</Dependent></ReferentialConstraint>

</Association><Association Name=”FK_Futbolista_Pais”><End Role=”Pais” Type=”Futbol2006.Store.Pais” Multiplicity=”1” /><End Role=”Futbolista” Type=”Futbol2006.Store.Futbolista”

Page 32: dotNetManía - WordPress.com...Introducción a Windows Live Web Services • XNA. ¿Presente o futuro? • VS 2005 Team Edition para profesionales de bases de datos (I) • Herramientas

la otra es utilizando el add-in que se inte-grará en un futuro próximo en VisualStudio 2008. Ambas herramientas seinstalan como parte de ADO.NET 3.5.En este artículo utilizaremos la prime-ra vía.

La línea de comandos necesaria paragenerar los ficheros necesarios paraFUTBOL2006 es la siguiente:

EDMGen /prov:System.Data.SqlClient /c:”Data Source=.;Initial Catalog=FUTBOL2006;IntegratedSecurity=True” /mode:FullGeneration /p:Futbol2006

El significado de los distintos argu-mentos de este comando se describe enla tabla 2.

La ejecución del comando produ-cirá un total de cinco ficheros, y el lec-tor ya tendrá claro el significado decuatro de ellos: Futbol2006.ssdl (lis-tado 1), Futbol2006.csdl (listado 2),Futbol2006.msl (listado 3) y Futbol2006.ObjectLayer.cs, del que hablaremosmás adelante. Al quinto fichero, Fut-bol2006.Views.cs y a su contenido, lasvistas de mapeado (mapping views) dedi-caremos una futura entrega.

dnm.plataforma.net<<

dotN

etM

anía

<<

32

Listado 1. Esquema de almacén (SSDL). Para simplificar, se han eliminados los metadatosrelativos a los procedimientos almacenados y funciones definidas por el usuario.

Multiplicity=”*” /><ReferentialConstraint><Principal Role=”Pais”><PropertyRef Name=”Codigo” />

</Principal><Dependent Role=”Futbolista”><PropertyRef Name=”CodigoPaisNacimiento” />

</Dependent></ReferentialConstraint>

</Association></Schema>

<?xml version=”1.0” encoding=”utf-8”?><Schema Namespace=”Futbol2006” Alias=”Self”

xmlns=”http://schemas.microsoft.com/ado/2006/04/edm”><EntityContainer Name=”Futbol2006Context”><EntitySet Name=”Club” EntityType=”Futbol2006.Club” /><EntitySet Name=”Futbolista” EntityType=”Futbol2006.Futbolista” /><EntitySet Name=”Pais” EntityType=”Futbol2006.Pais” /><AssociationSet Name=”FK_Futbolista_Club”

Association=”Futbol2006.FK_Futbolista_Club”><End Role=”Club” EntitySet=”Club” /><End Role=”Futbolista” EntitySet=”Futbolista” />

</AssociationSet><AssociationSet Name=”FK_Futbolista_Pais”

Association=”Futbol2006.FK_Futbolista_Pais”><End Role=”Pais” EntitySet=”Pais” /><End Role=”Futbolista” EntitySet=”Futbolista” />

</AssociationSet></EntityContainer><EntityType Name=”Club”><Key><PropertyRef Name=”Codigo” />

</Key><Property Name=”Codigo” Type=”String” Nullable=”false” MaxLength=”3”

Unicode=”false” FixedLength=”true” /><Property Name=”Nombre” Type=”String” Nullable=”false” MaxLength=”50”

Unicode=”false” /><Property Name=”Ciudad” Type=”String” Nullable=”false” MaxLength=”50”

Unicode=”false” /><NavigationProperty Name=”Futbolista”

Relationship=”Futbol2006.FK_Futbolista_Club”FromRole=”Club” ToRole=”Futbolista” />

</EntityType><EntityType Name=”Futbolista”><Key><PropertyRef Name=”Id” />

</Key><Property Name=”Id” Type=”Int32” Nullable=”false” /><Property Name=”Nombre” Type=”String” Nullable=”false” MaxLength=”75”

Unicode=”false” /><Property Name=”Sexo” Type=”String” Nullable=”false” MaxLength=”1”

Unicode=”false” FixedLength=”true” /><Property Name=”FechaNacimiento” Type=”DateTime” /><Property Name=”Posicion” Type=”String” Nullable=”false” MaxLength=”1”

Unicode=”false” FixedLength=”true” /><NavigationProperty Name=”Club”

Relationship=”Futbol2006.FK_Futbolista_Club”FromRole=”Futbolista” ToRole=”Club” />

Los ficheros necesariosse pueden generar dedos formas: mediante

EDMGen.exe o utilizando el add-inintegrado en Visual

Studio 2008

Page 33: dotNetManía - WordPress.com...Introducción a Windows Live Web Services • XNA. ¿Presente o futuro? • VS 2005 Team Edition para profesionales de bases de datos (I) • Herramientas

El fichero SSDL contiene unarepresentación neutral de la estructu-ra de la base de datos. Agrupados den-tro de un Contenedor de entidades(EntityContainer), podemos encontrarelementos EntitySet y AssociationSetque representan a los conjuntos deentidades y de asociaciones que con-forman los datos de la base de datos.Más adelante se definen los elemen-tos EntityType correspondientes a cadauna de las tablas, en los que se espe-cifican los metadatos relativos a loscampos y claves primarias; así comolos elementos Association que contie-nen las relaciones de integridad refe-rencial y claves foráneas entre lastablas.

El fichero CSDL generado automá-ticamente tiene un gran parecido conel fichero SSDL; está claro que EDM-Gen.exe no tiene ni la más remota ideade los mecanismos conceptuales quepodremos querer implementar porencima del almacén y no puede hacermucho más que eso. Precisamente enla próxima entrega mostraremos cómoexpresar algunos de esos conceptos (por

dnm.plataforma.net<<

dotN

etM

anía

<<

33

Listado 2. Esquema conceptual (CSDL).

<?xml version=”1.0” encoding=”utf-8”?><Mapping Space=”C-S”

xmlns=”urn:schemas-microsoft-com:windows:storage:mapping:CS”><EntityContainerMapping StorageEntityContainer=”dbo”

CdmEntityContainer=”Futbol2006Context”><EntitySetMapping Name=”Club” StoreEntitySet=”Club”

TypeName=”Futbol2006.Club”><ScalarProperty Name=”Codigo” ColumnName=”Codigo” /><ScalarProperty Name=”Nombre” ColumnName=”Nombre” /><ScalarProperty Name=”Ciudad” ColumnName=”Ciudad” />

</EntitySetMapping><EntitySetMapping Name=”Futbolista” StoreEntitySet=”Futbolista”

TypeName=”Futbol2006.Futbolista”><ScalarProperty Name=”Id” ColumnName=”Id” /><ScalarProperty Name=”Nombre” ColumnName=”Nombre” /><ScalarProperty Name=”Sexo” ColumnName=”Sexo” /><ScalarProperty Name=”FechaNacimiento” ColumnName=”FechaNacimiento” /><ScalarProperty Name=”Posicion” ColumnName=”Posicion” />

</EntitySetMapping><EntitySetMapping Name=”Pais” StoreEntitySet=”Pais”

TypeName=”Futbol2006.Pais”><ScalarProperty Name=”Codigo” ColumnName=”Codigo” /><ScalarProperty Name=”Nombre” ColumnName=”Nombre” />

</EntitySetMapping><AssociationSetMapping Name=”FK_Futbolista_Club”

TypeName=”Futbol2006.FK_Futbolista_Club” StoreEntitySet=”Futbolista”><EndProperty Name=”Club”><ScalarProperty Name=”Codigo” ColumnName=”CodigoClub” />

</EndProperty><EndProperty Name=”Futbolista”><ScalarProperty Name=”Id” ColumnName=”Id” />

<NavigationProperty Name=”Pais”Relationship=”Futbol2006.FK_Futbolista_Pais”FromRole=”Futbolista” ToRole=”Pais” />

</EntityType><EntityType Name=”Pais”><Key><PropertyRef Name=”Codigo” />

</Key><Property Name=”Codigo” Type=”String” Nullable=”false” MaxLength=”2”

Unicode=”false” FixedLength=”true” /><Property Name=”Nombre” Type=”String” Nullable=”false” MaxLength=”50”

Unicode=”false” /><NavigationProperty Name=”Futbolista”

Relationship=”Futbol2006.FK_Futbolista_Pais”FromRole=”Pais” ToRole=”Futbolista” />

</EntityType><Association Name=”FK_Futbolista_Club”><End Role=”Club” Type=”Futbol2006.Club” Multiplicity=”1” /><End Role=”Futbolista” Type=”Futbol2006.Futbolista” Multiplicity=”*” />

</Association><Association Name=”FK_Futbolista_Pais”><End Role=”Pais” Type=”Futbol2006.Pais” Multiplicity=”1” /><End Role=”Futbolista” Type=”Futbol2006.Futbolista” Multiplicity=”*” />

</Association></Schema>

Es nuestra tarea implementar los

mecanismos conceptuales y

de mapeado sobre los ficheros CSDL y MSL

Page 34: dotNetManía - WordPress.com...Introducción a Windows Live Web Services • XNA. ¿Presente o futuro? • VS 2005 Team Edition para profesionales de bases de datos (I) • Herramientas

dnm.plataforma.net<<

dotN

etM

anía

<<

34

ejemplo, la herencia entre entidades)modificando este fichero CSDL. Nóte-se, no obstante, la presencia de ele-mentos NavigationProperty dentro delos elementos EntityType; elementos quedan lugar en el nivel superior (clases.NET) a propiedades de navegaciónsimilares a las que nos ofrece LINQ toSQL [1, 2].

Por último, al examinar el ficheroMSL generado, también veremos queestablece una correspondencia 1:1 entrelos elementos del almacén y del mode-lo conceptual. Este fichero tambiénpodremos modificarlo a voluntad; porejemplo, una aplicación muy básica delos esquemas CSDL y MSL podría serel renombrado de las entidades, pro-

piedades, etc. de un almacén relacionalen el caso de que los nombres de lastablas, columnas, etc. de la base de datosoriginal se hayan definido en inglés uotro idioma extranjero, de manera dehacer más amable la programación con-tra esa base de datos a programadoreshispanohablantes.

El nivel de objetosEl último de los ficheros generadosautomáticamente por EDMGen.exeque ana-lizaremos aquí es Futbol2006.ObjectLa-yer.cs, que define el modelo de objetosque utilizaremos al trabajar al nivel deprogramación más alto que ofrece el Mar-co de entidades. Mostrar todo el códigofuente de ese fichero requeriría variaspáginas; el listado 4 muestra un fragmentode la clase que ofrece los puntos de entra-da para las consultas integradas, herede-ra de ObjectContext (obsérvese la simili-tud con LINQ to SQL, donde esa clasebase es DataContext), mientras que el lis-tado 5 presenta una de las clases genera-das, la clase Club.

Listado 3. El fichero de mapeado Conceptual-Almacén (MSL).

Listado 4. La clase heredera de ObjectContext

</EndProperty><Condition ColumnName=”CodigoClub” IsNull=”false” />

</AssociationSetMapping><AssociationSetMapping Name=”FK_Futbolista_Pais”

TypeName=”Futbol2006.FK_Futbolista_Pais” StoreEntitySet=”Futbolista”><EndProperty Name=”Pais”><ScalarProperty Name=”Codigo” ColumnName=”CodigoPaisNacimiento” />

</EndProperty><EndProperty Name=”Futbolista”><ScalarProperty Name=”Id” ColumnName=”Id” />

</EndProperty><Condition ColumnName=”CodigoPaisNacimiento” IsNull=”false” />

</AssociationSetMapping></EntityContainerMapping>

</Mapping>

// Utiliza tipos del espacio System.Data.Objectspublic partial class Futbol2006Context : ObjectContext{

public Futbol2006Context() : base(“name=Futbol2006Context”, “Futbol2006Context”)

{}

[System.ComponentModel.BrowsableAttribute(false)]public global::System.Data.Objects.ObjectQuery<Club> Club{

get{

if ((this._Club == null)){

this._Club = base.CreateQuery<Club>(“[Club]”);}return this._Club;

}}private ObjectQuery<Club> _Club = null;

// más...}

Los elementos NavigationProperty

dan lugar en las clases.NET a propiedades

de navegación similaresa las que ofreceLINQ to SQL

Page 35: dotNetManía - WordPress.com...Introducción a Windows Live Web Services • XNA. ¿Presente o futuro? • VS 2005 Team Edition para profesionales de bases de datos (I) • Herramientas

Del listado 5 se puede observarcómo las clases generadas y sus pro-piedades se mapean a los elementoscorrespondientes del modelo concep-tual mediante atributos como EdmEn-tityTypeAttribute, EdmScalarPropert-yAttribute o EdmRelationshipNaviga-tionPropertyAttribute. Las similitudescon LINQ to SQL de nuevo saltan ala vista; pero hay que tener en cuen-ta, como hemos dicho antes, que aquíno estamos trabajando directamentecontra un esquema lógico de base dedatos, sino sobre un esquema concep-tual montado por encima de aquél, loque nos permite múltiples posibilida-des adicionales.

Un poco de código

Aunque nuestro espacio de este messe está agotando, no querríamos ter-minar esta columna sin incluir almenos un fragmento de código C#que muestre cómo interactuar contrael modelo de objetos generado porEDMGen.exe. Para ello, por supuesto,utilizaremos nuestro recurso favorito:LINQ.

El código que se muestra en el lis-tado 6 muestra por pantalla los nombresde los futbolistas brasileños que juga-ron en el Real Madrid durante la tem-porada 2006. Observe las peculiarida-des de la cadena de conexión a sumi-nistrar al Proveedor de entidades, quehace referencia a los esquemas CSDL ySSDL y al fichero de mapeado.

Conclusiones

En este artículo hemos presentado losprincipios básicos de funcionamien-to del Marco de entidades, la nuevatecnología que pondrá en nuestrasmanos ADO.NET 3.5 para hacerposible que trabajemos contra alma-cenes de datos relacionales a un nivelmás conceptual, lo que sin dudas ayu-dará a elevar la claridad del código y

dnm.plataforma.net<<

dotN

etM

anía

<<

35

// Utiliza tipos del espacio System.Data.Objects[EdmEntityTypeAttribute(NamespaceName=”Futbol2006”, Name=”Club”)][System.Runtime.Serialization.DataContractAttribute()][System.Serializable()]public partial class Club : EntityObject{

public static Club CreateClub(string codigo, string nombre, string ciudad){

Club club = new Club();club.Codigo = codigo;club.Nombre = nombre;club.Ciudad = ciudad;return club;

}

[EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)][System.Runtime.Serialization.DataMemberAttribute()]public string Codigo{

get { return this._Codigo; }set{

this.OnCodigoChanging(value);this.ReportPropertyChanging(“Codigo”);this._Codigo = StructuralObject.SetValidValue(value, false, 3);this.ReportPropertyChanged(“Codigo”);this.OnCodigoChanged();

}}private string _Codigo;partial void OnCodigoChanging(string value);partial void OnCodigoChanged();

[EdmScalarPropertyAttribute(IsNullable=false)][System.Runtime.Serialization.DataMemberAttribute()]public string Nombre{

get { return this._Nombre; }set {

this.OnNombreChanging(value);this.ReportPropertyChanging(“Nombre”);this._Nombre = StructuralObject.SetValidValue(value, false, 50);this.ReportPropertyChanged(“Nombre”);this.OnNombreChanged();

}}private string _Nombre;partial void OnNombreChanging(string value);partial void OnNombreChanged();

[EdmScalarPropertyAttribute(IsNullable=false)][System.Runtime.Serialization.DataMemberAttribute()]public string Ciudad{

get { return this._Ciudad; }set{

this.OnCiudadChanging(value);this.ReportPropertyChanging(“Ciudad”);this._Ciudad = StructuralObject.SetValidValue(value, false, 50);this.ReportPropertyChanged(“Ciudad”);this.OnCiudadChanged();

}

Page 36: dotNetManía - WordPress.com...Introducción a Windows Live Web Services • XNA. ¿Presente o futuro? • VS 2005 Team Edition para profesionales de bases de datos (I) • Herramientas

dnm.plataforma.net<<

dotN

etM

anía

<<

36

la productividad de la programación. En próximasentregas continuaremos explorando otros aspec-tos para los que no ha alcanzado el espacio aquí,

profundizando en los diferentes conceptos y mos-trando el papel que juegan dentro del entramadodel Marco de entidades.

}private string _Ciudad;partial void OnCiudadChanging(string value);partial void OnCiudadChanged();

[EdmRelationshipNavigationPropertyAttribute(“Futbol2006”,“FK_Futbolista_Club”, “Futbolista”)]

[System.Xml.Serialization.XmlIgnoreAttribute()][System.Xml.Serialization.SoapIgnoreAttribute()][System.ComponentModel.BrowsableAttribute(false)]public EntityCollection<Futbolista> Futbolista{

get{

return ((IEntityWithRelationships)(this)).RelationshipManager.GetRelatedCollection<Futbolista>(

“Futbol2006.FK_Futbolista_Club”, “Futbolista”);}

}}

Listado 5. La clase Club

Futbol2006Context ctx = new Futbol2006Context(“metadata=.\\Futbol2006.csdl|.\\Futbol2006.ssdl|.\\Futbol2006.msl;”

+ “provider=System.Data.SqlClient;”+ “provider connection string=”+ “\”Data Source=.;Initial Catalog=FUTBOL2006;Integrated Security=True\””

);

var q = from c in ctx.Clubwhere c.Codigo == “RMA”let jugadores = c.Futbolistafrom f in jugadoreswhere f.Pais.Codigo == “BR”select f.Nombre;

// ejecutar la consultaforeach (var s in q) Console.WriteLine(s);

Listado 6. Ejemplo de consulta integrada

Referencias

Hernández, Octavio “C# 3.0 y LINQ”, Krasis Press, octubre de 2007.

Hernández, Octavio “Lo que nos traerá Orcas: LINQ to SQL”, en dotNetManía nº 36, abril de 2007.

Blog del equipo de ADO.NET Entity Framework, en http://blogs.msdn.com/adonet.

[1]

[2]

[3]

Page 37: dotNetManía - WordPress.com...Introducción a Windows Live Web Services • XNA. ¿Presente o futuro? • VS 2005 Team Edition para profesionales de bases de datos (I) • Herramientas
Page 38: dotNetManía - WordPress.com...Introducción a Windows Live Web Services • XNA. ¿Presente o futuro? • VS 2005 Team Edition para profesionales de bases de datos (I) • Herramientas

Muchos de los requerimientos habituales de los desa-rrollos de software suelen requerir una cantidad deesfuerzo considerable por parte de los DBA:

• “Necesito conocer las diferencias del modelode datos de desarrollo respecto al modelo deproducción y también un script para sincronizarnuestro entorno de desarrollo”.

• “Parece que hay algún problema en la sin-cronización de datos con una de nuestrassucursales. Necesitaría comparar los datos defacturas y clientes para confirmar que estátodo correcto”.

Seguramente, muchos de nosotros nos sentire-mos identificados ante estas situaciones. En esta seriede dos artículos vamos a ver qué puede hacer Data-dude por nosotros.

Integración de proyectos de base dedatos Siguiendo la filosofía de Visual Studio, nuestro mode-lo de base de datos pasará a ser un proyecto integra-do, bien en la solución de la aplicación de la que esparte o bien como parte de una solución de proyec-tos de bases de datos.

Con la instalación de Datadude, dispondremosde nuevos tipos de proyectos en Visual Studio (figu-

ra 1). Dos de ellos corresponden a proyectos de basede datos en blanco, uno para la versión de SQL Ser-ver 2000 y otro para SQL Server 2005. Otros dostipos de proyectos presentan dos asistentes para gene-rar un nuevo proyecto importando directamente unesquema ya existente, bien en SQL Server 2000 oen SQL Server 2005.

Una decisión que debemos tomar al crear el pro-yecto, y que no puede ser modificada una vez crea-do éste, es agrupar en un primer nivel nuestros obje-tos por su tipo (tablas, vistas, procedimientos) o bienpor el esquema al que pertenecen (por ejemplo ven-tas, compras, etc.). Esto influye sobre cómo se mos-trarán los objetos en el Explorador de soluciones ydeterminará la estructura física de los ficheros delproyecto (figura 2). No olvidemos que con SQL Ser-ver 2005 se separan los esquemas de los usuarios debases de datos.

Comparación de esquemas

La herramienta de comparación de esquemas enDatadude nos permite comparar tanto proyectos debases de datos como esquemas vivos en bases de datos.Además, podemos seleccionar cualquiera de elloscomo fuente y destino (figura 3). Esto nos da final-mente cuatro combinaciones de comparaciones (pro-yecto-proyecto, proyecto-BD, BD-proyecto, BD-

VS 2005 Team Edition para profesionales de bases de datos (I)

plataforma.net

Rubén Garrigós es unarquitecto de soluciones

Microsoft certificadocomo MCT, MSCD .NET

y MCITP SQL Server2005. Es experto en e-

Commerce B2C y B2B yen plataformas de datos

sobre SQL Server enSolid Quality Mentors.

Junto a EEladio Rincón yCarlos Sacristán escribeen “El rincón del DBA”:

http://blogs.solidq.com/ES/ElRinconDelDBA

Visual Studio 2005 Team Edition for Database Professionals (Datadude para losamigos) es la apuesta de Microsoft para aumentar la productividad de los pro-fesionales de bases de datos, mejorando la integración entre éstos y el resto deequipos que participan en un proyecto de desarrollo de software. Datadude nosproporciona valiosas funcionalidades que, independientemente de formar par-te de la gestión del ciclo de vida de nuestros modelos, añaden valor a este pro-ducto desde el mismo momento en que nos decidimos a probarlo.

Rubén Garrigós

Page 39: dotNetManía - WordPress.com...Introducción a Windows Live Web Services • XNA. ¿Presente o futuro? • VS 2005 Team Edition para profesionales de bases de datos (I) • Herramientas

dotN

etM

anía

<<

39

dnm.plataforma.net<<

BD). Es importante tener en cuenta quealgunas opciones de las que dispondre-mos tras comparar los esquemas no sonbidireccionales, por lo que cuando com-paremos tenemos que tener claro cuál esel esquema origen y cuál el destino si dese-amos sincronizarlos a posteriori.

Una vez comparados, la herramien-ta nos muestra una tabla con las diferen-cias encontradas y posibles acciones a rea-lizar (figura 4). Cada uno de los objetosse muestran organizados por tipo y se nosofrece una acción predeterminada que

dependerá del resultado de la compara-ción. Podemos ver las posibles opcionesen la tabla 1.

Destacar que no se dispone de unaopción de mezcla o unión de diferen-cias, de ahí la relevancia de seleccio-nar el sistema origen y destino de for-ma correcta al iniciar la comparación.Una vez seleccionadas las opcionesdeseadas para cada objeto, Datadudenos ofrece dos opciones. La primeraes crear un script de sincronización paraaplicar en el destino. La segunda esaplicar estos cambios directamente enel destino. La primera opción nos per-mitirá revisar los cambios que se vana realizar. Esta opción es la recomen-dada cuando los cambios se van a apli-car en sistemas críticos o con particu-laridades especiales. La segunda es másrápida si conocemos bien el sistema dedestino y si las diferencias a aplicar noson complejas.

Personalmente, prefiero verificar loscambios que van a aplicarse y analizar dequé forma van a abordarse. Los scriptsgenerados son conservadores, contem-plan la posibilidad de errores y dejan elsistema en un estado consistente, apli-cando todos los cambios o no aplicandoninguno. Vamos a ver un ejemplo utili-zando la siguiente tabla:

Figura 1. Nuevos tipos de proyectos de base de datos

Figura 2. Vista esquema vs. vista solución (por esquema)

Figura 3. Comparación de esquemas

CREATE TABLE [dbo].[foo]([id] [int] NOT NULL IDENTITY(1, 1),[foo] [char] (450) NULL,[foo2] [nvarchar] (20) NULL) ON [PRIMARY]

Page 40: dotNetManía - WordPress.com...Introducción a Windows Live Web Services • XNA. ¿Presente o futuro? • VS 2005 Team Edition para profesionales de bases de datos (I) • Herramientas

dotN

etM

anía

<<

40

dnm.plataforma.net<<

Un ejemplo del lógico conservacio-nismo lo podemos apreciar en el frag-mento de script del listado 1, que se gene-ra al modificar la longitud de la columnafoo a 45. Es un caso claro de cambio quepuede provocar pérdida de datos.

Lo que nos genera el script es unacomprobación básica que garantiza que,si hay datos en la tabla de destino, se abor-tará la operación para evitar un posibletruncado de éstos. Lo más probable esque este cambio fuese fruto de un análi-sis de los datos existentes y futuros y seconsiderara seguro. Si el cambio, por elcontrario, no reporta peligro de pérdidade datos, y por ejemplo modificamos lacolumna foo2 y aumentamos su longitudmáxima a 200, el script generado sería eldel listado 2.

Como podemos ver en este caso, parauna operación simple de cambio en la lon-gitud de un campo, se está realizando unacopia de toda la tabla. Esto puede repre-sentar un problema cuando hablamos detablas cuyo tamaño sea considerable. Adi-

cionalmente, debemos considerar elimpacto en la concurrencia del script decopia, pues contiene una transacción deinicio a fin con nivel de aislamiento seria-lizable, con el fin de preservar la integri-dad de la operación.

En resumen, Datadude será nuestrocompañero ideal para evitar la parte máslaboriosa del proceso, facilitándonos rápi-damente las diferencias entre objetos así

como el script base para la sincronizaciónsobre el que trabajaremos para afinarlo,teniendo en cuenta las peculiaridades denuestra base de datos y entorno.

Comparación de datos Otra de las herramientas que incluyeDatadude es el comparador de datos(figura 5). Al igual que en el compara-dor de esquemas, deberemos seleccio-nar un origen y un destino, con la dife-rencia de que esta vez deberán ser basesde datos, no pudiendo realizarse la com-paración directamente contra proyec-tos de base de datos. Ambas bases dedatos deben estar sincronizadas a nivelde esquema para que pueda llevarse acabo el proceso con éxito. Como yahemos visto anteriormente, los pro-yectos de bases de datos se apoyan enuna base de datos de respaldo, y seráésta la que podamos utilizar, en princi-pio, como base de datos contra la quecomparar datos. La base de datos de unproyecto se nombra con el nombre delproyecto, el sufijo _DB_ y un GUID paragarantizar la unicidad.

Para comenzar la comparación debe-mos seleccionar el origen y el destino eindicar qué registros vamos a tener encuenta en la comparación. Por defecto setendrán en cuenta todos los existentes tan-to en origen como en destino, pero pode-mos indicar que solo se tengan en cuen-ta los nuevos en origen, en destino, losque han cambiado, etc. El siguiente pasoes seleccionar o excluir algunas tablas/vis-

Resultado de la comparación Opciones

No existe en origen Borrar en destino o ignorar el objeto

No existe en destino Crear en destino o ignorar el objeto

Son iguales Ignorar el objeto

Son diferentes Actualizar en destino o ignorar el objeto

Tabla 1. Posibles opciones en función de la comparación de esquemas

Figura 4. Resultado de la comparación de los esquemas

CREATE TABLE [dbo].[tmp_ms_xx_foo]([id] [int] NOT NULL IDENTITY(1, 1),[foo] [char] (450) COLLATE Modern_Spanish_CI_AS NULL,[foo2] [nvarchar] (200) COLLATE Modern_Spanish_CI_AS NULL

) ON [PRIMARY]SET IDENTITY_INSERT [dbo].[tmp_ms_xx_foo] ONINSERT INTO [dbo].[tmp_ms_xx_foo]([id], [foo], [foo2])

SELECT [id], [foo], [foo2] FROM [dbo].[foo]SET IDENTITY_INSERT [dbo].[tmp_ms_xx_foo] OFFDROP TABLE [dbo].[foo]EXEC sp_rename N’[dbo].[tmp_ms_xx_foo]’, N’foo’

/* The type for Field: foo in Table: [dbo].[foo] is currently: [char] (450)

but is being changed to: [char] (45). */

IF EXISTS (select top 1 1 from [dbo].[foo])

RAISERROR (‘Rows detected, failing schema update due to possible data loss.’,

16, 127) WITH NOWAIT

Listado 1

Listado 2

Page 41: dotNetManía - WordPress.com...Introducción a Windows Live Web Services • XNA. ¿Presente o futuro? • VS 2005 Team Edition para profesionales de bases de datos (I) • Herramientas

dotN

etM

anía

<<

41

dnm.plataforma.net<<

tas de la comparación, así como indicarla clave que se utilizará para identificarlos registros. Esta clave de comparacióndebe ser la clave primaria o un índice/res-tricción único, de forma que cumpla supapel de identificar un registro de formainequívoca.

Llegados a este punto estaríamos lis-tos para lanzar el proceso de compara-ción, el cual nos mostrará, agrupados portabla, los registros diferentes y la accióna generar. Debemos tener en cuenta quecuando trabajemos con volúmenes dedatos grandes y especialmente con cone-xiones con los servidores lentas, el pro-ceso puede ser poco viable. Como resul-tado de la comparación, obtenemos unlistado de acciones pendientes sobre cadauno de los registros afectados que se resu-men en la tabla 2.

De nuevo, vemos que no existeopción de mezcla ni gestión de cambiosbidireccional, al igual que nos ocurría enla comparación de esquemas. Una vezdeterminadas las acciones a realizar, pode-mos o bien crear un script de sincroniza-ción para aplicar en el destino o aplicarestos cambios directamente en él. La pri-mera opción nos permitirá revisar loscambios que se van a realizar en el desti-no y es de nuevo la recomendada.

Si analizamos cómo se aplican loscambios en el script vemos que tenemos5 fases dentro de una transacción, lo queevitará que en caso de error la base dedatos de destino quede en un estado

inconsistente. El sistemautilizado seguramente nosresulte familiar por haber-lo aplicado manualmenteo generándolo con scriptspropios con tal fin.

1. Desactivación delas restricciones declaves ajenas.

2. Borrado de regis-tros presentes soloen el destino.

3. Actualización deregistros modifica-dos.

4. Inserción de regis-tros nuevos.

5. Reactivación de lasrestricciones de cla-ve ajena.

La ventaja obvia de tener todos losdatos en un script es que podemos lanzar-lo de forma sencilla contra la base de datos.Ahora bien, de cara al rendimiento debe-mos tener en cuenta varios factores. Poruna parte, la inserción de datos de esta for-

ma es lenta cuando lo que pretendemoses cargar todos los datos de tablas gran-des o una gran cantidad de éstos. Por otra,este sistema puede generar un aumentoconsiderable del tamaño del log de tran-sacciones si utilizamos el modo de recu-peración completo, así como bastantesbloqueos. No olvidemos que disponemosde otras alternativas, como el uso de unpaquete de Integration Services o nues-tro viejo amigo BCP combinado con scrip-ting propio, que podrían darnos mejoresresultados en algunos casos.

En definitiva, el uso de esta herra-mienta nos proporciona una forma rápi-da de conocer qué datos necesitan sersincronizados entre dos bases de datos.Datadude será nuestro aliado para evi-tar la parte manual de detectar qué hacambiado y qué no, así como para obte-ner un script inicial de sincronización.En función del sistema de destino deter-minaremos si podemos utilizar estescript directamente, si necesitamosmodificar partes de él o si debemos con-siderar otra alternativa.

Resultado de la comparación Acciones

No existe en origen Borrar en destino o ignorar el registro

No existe en destino Insertar en destino o ignorar el registro

Son diferentes Actualizar en destino o ignorar el registro

Tabla 2. Acciones resultantes de la comparación de datos

Figura 5. Comparador de datos

Figura 6. Resultado de la comparación de los datos

Page 42: dotNetManía - WordPress.com...Introducción a Windows Live Web Services • XNA. ¿Presente o futuro? • VS 2005 Team Edition para profesionales de bases de datos (I) • Herramientas

Una de las cosas que me gusta manejar a mi modoson las colecciones de los objetos. Quiero decir, en.NET Framework hay variadas formas de agrupa-ción de objetos, como List, Queue, Dictionary, etc.Pero muchas veces necesito características combi-nadas de varias. Por ejemplo, una colección quepueda recorrer (obviamente), u obtener un ele-mento en particular por su clave… o su posición.

Dictionary casi cumple con mis requerimien-tos (y es capaz de manejar HashTable, en caso decontener pocos elementos para ahorrar memoria,o expandirse a Collection). Pero enumerar unDictionary es obtener valores de tipo KeyValue-Pair, y es mejor obtener el tipo específico. Ademáses interesante obtener avisos cuando el conteni-do es modificado, y disponer de otras caracterís-ticas que aumenten la versatilidad de estos gru-pos de objetos.

Finalmente, sin importar el tipo de datos quese use para las claves de identificación, tener con-trol adecuado de qué se busca y cómo… y qué tipode datos se retorna.

Usando genéricosClaramente, la mejor forma de hacer esto es usan-do genéricos. Por ello, nuestra clase de coleccio-nes (a la que llamaré SpecialCollection) se decla-rará así:

Public Class SpecialCollection(Of K, T)

Dado que en muchos casos esta clase podría serorigen de datos de controles, tanto Web como Win-dows, la haremos heredar de List. Y como trata-mos de mantener la funcionalidad de genéricos, seráList del tipo que especifiquemos en su creación:

Inherits List(Of T)

Exponiendo en todas las formas posibles.Otra característica importante es poder obte-

ner elementos contenidos dentro de nuestra colec-ción especial tanto de forma específica como no.Entonces, implementaremos algunas interfaces:

Implements IEnumerableImplements IEnumerable(Of T)Implements ICollectionImplements ICollection(Of T)

Herramientas genéricas para los componentes Cuando de coleccionar se trata

plataforma.net

Daniel Seara es mentorde Solid Quality Mentors

y director del área dedesarrollo .NET. Es MVP

desde 2003 y ponentehabitual de INETA y

Microsoft.

En esta oportunidad, nos ocuparemos de crear una clase que nos per-mita algo más de libertad a la hora de manejar colecciones y listas denuestros propios objetos, o inclusive de cualquier otro conjunto devalores que necesitemos.

Daniel Seara

La versión de esta misma clase para.NET Framework 3 ó 3.5 podrá expan-dir su funcionalidad, implementandomás interfaces que la hagan compati-ble, por ejemplo, con WCF. Observeque, al implementar IEnumerable(Of T),nuestra clase ya puede servir como ori-gen de datos para consultas LINQ.

[ ]NOTA

Page 43: dotNetManía - WordPress.com...Introducción a Windows Live Web Services • XNA. ¿Presente o futuro? • VS 2005 Team Edition para profesionales de bases de datos (I) • Herramientas

dotN

etM

anía

<<

43

dnm.plataforma.net<<

Finalmente, dado que podríamosutilizarla para muchas de nuestras fun-cionalidades de negocio, mejor seriali-cemos:

<Serializable()> Public Class

SpecialCollection(Of K, T)

Acceder siempre al elemento correctoPara asegurarnos que siempre defina-mos colecciones de tipos adecuadospara ser manipulados con esta clase, esimportante que el valor utilizado comoclave sea pasible de ser comparado ensu igualdad con otro. También podría-mos, ya que estamos, hacer que nos per-mita comparar valores de claves paraencontrar anteriores y posteriores.

Esto se puede establecer si defini-mos especificidad en el tipo asignadocomo clave:

Definiendo la obtención de elementos individuales

Dado que estamos heredando de List,que nos permite recorrer la colecciónobteniendo directamente el tipo especí-fico que definamos al crear una instan-cia, no podemos obtener un elementoespecífico por su clave, dado que List esposicional. Por ello, necesitamos con-servar en un diccionario interno la rela-ción clave-posición de cada elemento.

Así, definimos un Dictionary paracontener dicha relación, que inicializa-mos en el constructor del objeto:

Entonces, cuando se desee obtenerun elemento específico, buscaremos eneste diccionario la clave, para, usando laposición, retornar dicho elemento.

También implementamos la fun-cionalidad de acceder a los elementospor su posición:

Agregar un elemento a esta colec-ción se traduce entonces en agregar laclave con su referencia a la posicióndentro de la lista, y luego agregar el ele-mento en sí mismo:

Y remover el elemento, en las accio-nes inversas, en orden inverso:

También debemos realizar accio-nes especiales para vaciar de conteni-do nuestra colección, en el métodoClear:

<Serializable()> _

Public Class SpecialCollection( _

Of K As {IEquatable(Of K), _

IComparable(Of K)}, _

T)

Dim keyPositions As _

System.Collections.Generic.Dictionary(_

Of K, Integer)

Public Sub New()

keyPositions = New _

System.Collections.Generic.Dictionary(_

Of K, Integer)

End Sub

Public Property ItemByPosition(_ByVal index As Integer) As T

GetIf index > Me.Count - 1 Then

Throw New KeyNotExistExceptionEnd If

Return Me(index)End Get

Set(ByVal value As T)If index > Me.Count - 1 Then

Throw New KeyNotExistExceptionEnd If

Me(index) = valueEnd Set

End Property

Default Public Overloads Property_Item(ByVal key As K) As T

GetIf keyPositions.ContainsKey(key) ThenReturn MyBase.Item(keyPositions(key))

Else‘O retornar el error ‘KeyNotExistExceptionReturn Nothing

End IfEnd Get

Set(ByVal value As T)If Not keyPositions.ContainsKey(key) ThenThrow New KeyNotExistException

End If

MyBase.Item(keyPositions(key)) = valueEnd Set

End Property

Public Overridable Shadows Sub Add(_

ByVal key As K, ByVal value As T)

If keyPositions.ContainsKey(key) Then

MyBase.Item(keyPositions(key))=value

Else

Dim pos As Integer = MyBase.Count

keyPositions.Add(key, pos)

MyBase.Add(value)

RaiseEvent ElementAdded(Me, value)

End If

End Sub

Public Overridable Shadows Sub _

Remove(ByVal key As K)

MyBase.RemoveAt(keyPositions(key))

keyPositions.Remove(key)

End Sub

Public Shadows Sub Clear()

MyBase.Clear()

keyPositions.Clear()

End Sub

Page 44: dotNetManía - WordPress.com...Introducción a Windows Live Web Services • XNA. ¿Presente o futuro? • VS 2005 Team Edition para profesionales de bases de datos (I) • Herramientas

dotN

etM

anía

<<

44

dnm.plataforma.net<<

Funcionalidad de diccionarioSi queremos exponer nuestra clase como un diccio-nario, bastará con exponer sus claves y sus valorescomo dos miembros separados.

Los valores se pueden obtener directamente, perolas claves, al estar en un diccionario internamente,deben reconvertirse para obtener el valor deseado.

Exponiendo eventos

En esta clase, podría ser útil que ella pueda informara quienes la utilizan cuando cambia la cantidad o elvalor de los elementos.

Definamos entonces dichos eventos, para lo cualprimero crearemos un argumento de evento específi-co para ellos.

Y para dicho argumento, un enumerador deacciones.

Agregamos entonces la definición del evento:

Los métodos Add, Remove y Clear se decla-ran Shadows, dado que existen en la clasebase, List(Of T), y no están marcadoscomo sobre-escribibles.[ ]

NOTA

Public Function Values() As T()

Return MyBase.ToArray

End Function

Public Function Keys() As K()

Dim mvalues As New System.Collections.Generic.List(Of K)

mvalues.AddRange( _

CType(keyPositions.Keys, _

System.Collections.Generic.IEnumerable(Of K)))

Return mvalues.ToArray

End Function

Public Event CollectionChanged( _ByVal sender As Object, _ByVal e As SpecialCollectionChangeEventArgs(Of T))

Public Class SpecialCollectionChangeEventArgs(Of T)Inherits EventArgsPrivate mAction As SpecialCollectionChangeEnumPublic ReadOnly Property Action() As _

SpecialCollectionChangeEnumGet

Return mActionEnd Get

End Property

Private mPosition As IntegerPublic ReadOnly Property Position() As IntegerGet

Return mPositionEnd Get

End Property

Private mObject As TPublic ReadOnly Property [Object]() As TGet

Return mObjectEnd Get

End Property

Sub New(ByVal Action As SpecialCollectionChangeEnum,_ByVal position As Integer, _ByVal [Object] As T)

mAction = ActionmPosition = positionmObject = [Object]

End SubEnd Class

‘Acciones posibles en una colecciónPublic Enum SpecialCollectionChangeEnum

[Add]RemoveChangeValue

End Enum

Para poder obtener un elementoespecífico por su clave, necesitamos

conservar en un diccionario interno la relación clave-posición

de cada elemento

Page 45: dotNetManía - WordPress.com...Introducción a Windows Live Web Services • XNA. ¿Presente o futuro? • VS 2005 Team Edition para profesionales de bases de datos (I) • Herramientas

dotN

etM

anía

<<

45

dnm.plataforma.net<<

Y modificamos los métodos que alteran el conte-nido, para que lancen el mismo (de igual manera enItemByPosition):

Y también en el método Add:

Y en Remove:

Concluyendo

Dado que esta clase podremos llegar a utilizarlaen casi cualquier otro componente que creemos, seráconveniente que quede dentro del espacio de nom-bres que utilicemos para herramientas genéricas; porejemplo, el que ya tenía definido para ello:Solid.Tools.

En la figura tenemos el esquema de las clasesimplicadas.

Default Public Overloads Property _

Item(ByVal key As K) As T

Get

If keyPositions.ContainsKey(key) Then

Return MyBase.Item(keyPositions(key))

Else

‘O retornar el error KeyNotExistException

Return Nothing

End If

End Get

Set(ByVal value As T)

If Not keyPositions.ContainsKey(key) Then

Throw New KeyNotExistException

End If

MyBase.Item(keyPositions(key)) = value

RaiseEvent CollectionChanged(Me, _

New SpecialCollectionChangeEventArgs(Of T)( _

SpecialCollectionChangeEnum.ChangeValue, _

keyPositions(key), value))

End Set

End Property

Public Overridable Shadows Sub Add( ByVal key As K,_

ByVal value As T)

If keyPositions.ContainsKey(key) Then

MyBase.Item(keyPositions(key)) = value

RaiseEvent CollectionChanged(Me, _

New SpecialCollectionChangeEventArgs(Of T)( _

SpecialCollectionChangeEnum.ChangeValue, _

keyPositions(key), value))

Else

Dim pos As Integer = MyBase.Count

keyPositions.Add(key, pos)

MyBase.Add(value)

RaiseEvent CollectionChanged(Me, _

New SpecialCollectionChangeEventArgs(Of T)(_

SpecialCollectionChangeEnum.Add, _

pos, value))

End If

End Sub

Public Overridable Shadows Sub Remove(ByVal key As K)

Dim pos As Integer = keyPositions(key)

MyBase.RemoveAt(pos)

keyPositions.Remove(key)

RaiseEvent CollectionChanged(Me, _

New SpecialCollectionChangeEventArgs(Of T)( _

SpecialCollectionChangeEnum.Remove,_

pos, Nothing))

End Sub

Page 46: dotNetManía - WordPress.com...Introducción a Windows Live Web Services • XNA. ¿Presente o futuro? • VS 2005 Team Edition para profesionales de bases de datos (I) • Herramientas

dnm.inicio

Modificar el códigoEsta es la parte más interesante de la depuración conVisual Studio 2005 (o superior), ya que prácticamen-te todo (bueno, no todo, pero sí casi todo) lo presen-tado hasta ahora era posible hacerlo con las versio-nes anteriores.

Cuando tenemos detenida la ejecución de nues-tro código, no solo podemos cambiar la instrucciónque se ejecutará a continuación (además de ver y cam-biar los valores de las variables), que aunque es algo,digamos, potente, ya que nos permite incluso posi-cionar el punto de inicio de la siguiente instrucciónen una definición de una variable, también nos per-mite modificar el código existente, añadiendo nuevaslíneas de código o eliminando algunas de las existen-tes; incluso podemos definir nuevas variables.

Esta es precisamente la razón por la que a estacaracterística se le llama “editar y continuar”, porquepodemos modificar el código y seguir con la ejecu-ción, teniéndose en cuenta esos cambios que hemosrealizado.

Por supuesto, no podemos hacer todos los cam-bios que queramos, hay ciertas limitaciones. Lo quedebemos tener en cuenta es que esos cambios siem-pre serán en la parte “local” que estamos ejecutando;es decir, no podemos definir nuevas variables a nivelde módulo ni añadir nuevos métodos, ni tampocopodemos definir nuevas clases. En realidad sí quepodemos añadir nuevos métodos o nuevas clases, pero

en esos casos debemos detener la depuración o eli-minarlos para poder continuar.

En cualquier caso, el entorno de desarrollo mar-cará el código que no podemos modificar en colorgris. Recordemos que el código que se ejecuta actual-mente está resaltado en color amarillo y el que vea-mos sombreado es el que se está usando mientras sellama al código actual; por regla general ese códigoserá de solo lectura, y por tanto no se nos permitiráque lo modifiquemos.

En la documentación de Visual Studio podemosver cuáles son las limitaciones en lo que a edición delcódigo se refiere. Aquí relaciono las que consideromás importantes:

Para C#:• Cambios en la instrucción actual o en otra ins-

trucción activa.

Depuración en .NETEl depurador que lo depure... podrá editar y continuar

inicio

Guillermo “Guille”Som

Es Microsoft MVP deVisual Basic desde 1997.Es redactor de ddotNet-Manía, mentor de SolidQuality Iberoamericana,

tutor de campusMVP,miembro de Ineta Spea-kers Bureau Latin Ame-

rica, y autor de los libros“Manual Imprescindiblede Visual Basic .NET” y

“Visual Basic 2005”.http://www.elguille.info

En esta ocasión, seguimos tratando el tema de depuración con Visual Studio,pero nos centraremos más en la característica de “editar y continuar”, deforma que veamos las posibilidades que tenemos a la hora de hacer esasmodificaciones tan necesarias cuando el código de nuestra aplicación no secomporta como esperamos que lo haga.

Guillermo «Guille» Som

En el caso de que agreguemos códigoque nos impida continuar la depuraciónsin tener que reiniciarla, siempre nosqueda el recurso de comentar esos cam-bios y usarlos en la próxima ejecución.

[ ]NOTA

Page 47: dotNetManía - WordPress.com...Introducción a Windows Live Web Services • XNA. ¿Presente o futuro? • VS 2005 Team Edition para profesionales de bases de datos (I) • Herramientas

dotN

etM

anía

<<

47

dnm.inicio<<

• Cambios en símbolos globales, incluidos:� Agregar nuevos tipos.� Agregar métodos a un tipo.� Cambiar la firma de un tipo.� Agregar campos, eventos o propiedades a un

tipo.• Editar un método anónimo o cualquier método

que contenga un método anónimo.• Agregar un nuevo método anónimo.• Agregar, quitar o realizar cambios en los atri-

butos.• Agregar, quitar o realizar cambios en las directi-

vas using.• Quitar o cambiar variables locales. Se permite

agregar variables locales.• Agregar una directiva foreach, using o lock en

torno a la instrucción activa.• Modificar un método que contiene una instruc-

ción yield return o yield break.• Cambiar un constructor con un campo iniciali-

zado por un método anónimo.• “Editar y continuar” no admite cambios en el

código no seguro que esté dentro de un métodoy que contenga el operador stackalloc. Esto sólose aplica a los métodos activos.

• “Editar y continuar” admite cambios en los blo-ques try, catch y finally, con excepción de losbloques situados en métodos activos, como losmétodos que actualmente se encuentran en la pilade llamadas.

• En una función activa, “editar y continuar” noadmite:� Agregar un bloque catch o finally en torno a

la instrucción activa.� Agregar controladores de excepciones anida-

dos con niveles de anidamiento mayores queseis.

• En una función activa que no sea la función másreciente en la pila de llamadas, “editar y conti-nuar” no admite: � Agregar un bloque catch, finally o try en tor-

no a la instrucción activa.� Agregar controladores de excepciones anida-

dos con niveles de anidamiento mayores queseis.

� Cambiar el código dentro de un bloque tryque contiene la instrucción activa.

Para Visual Basic:• Quitar una variable local estática. • Modificar la condición de un bucle While cuando

el puntero de instrucciones está en la condición. • Modificar el límite superior o inferior de una ins-

trucción For cuando el puntero de instruccionesestá en la expresión.

• Agregar o quitar un bucle Next cuando el punte-ro de instrucciones se utiliza en la expresión delenumerador.

• Agregar un bucle For Each cuando el puntero deinstrucciones está en el cuerpo del bucle.

• Cambiar el iterador de un bucle For Each cuan-do el puntero de instrucciones está en la expre-sión del enumerador o en el cuerpo del bucle.

• Cambiar la expresión del enumerador de un bucleFor Each cuando el puntero de instrucciones estáen la expresión del enumerador.

• No se admiten los cambios en la definición de unmétodo genérico o en el cuerpo de un métodogenérico. Se puede agregar, eliminar o cambiarla creación de instancias de un tipo genérico o lla-madas a los métodos genéricos existentes.

• Cambiar la instrucción de invocación de un méto-do que está en la pila de llamadas.

• Agregar un bloque Try...Catch cuando el punte-ro de instrucciones termina en el bloque Catch oen el bloque Finally.

• Quitar un bloque Try...Catch cuando el punte-ro de instrucciones está en un bloque Catch o enel bloque Finally.

• Agregar seis o más instrucciones Try anidadasalrededor del puntero de instrucciones actual.

• Agregar un bloque Using alrededor del punterode instrucciones actual.

• Agregar un bloque SyncLock alrededor del pun-tero de instrucciones actual.

• Agregar, quitar o modificar una instrucción#region definida por el usuario.

Independientemente de las restricciones impues-tas para “editar y continuar”, también debemos teneren cuenta que no solo podremos hacer pequeños cam-bios o cambios mínimos; es decir, después de leer loque nos dice la documentación sobre las restriccionesen los cambios soportados por “editar y continuar”,puede parecer que no podremos hacer casi ningún tipode cambio, y tampoco es eso. Por supuesto, esos cam-bios no podrán ser en todo el código, ya que en reali-dad solo podremos hacer los cambios en el método queactualmente se esté ejecutando; pero los cambios noestán limitados a un solo cambio o cambios que en rea-lidad nos podrían hacer parecer que tampoco es paratanto esto de “editar y continuar”.

Veamos un pequeño ejemplo, que aunque simple,espero que sea lo suficientemente ilustrativo de algu-nas de las cosas que nos permite hacer “editar y con-tinuar”, y que, casi con total seguridad, será todo loque necesitaremos, ya que si en realidad cambiamostodo el código... bueno, eso más que “editar y conti-nuar” es “borrón y cuenta nueva”, y en esos casos...pues... los milagros mejor dejarlos para otro día.

Page 48: dotNetManía - WordPress.com...Introducción a Windows Live Web Services • XNA. ¿Presente o futuro? • VS 2005 Team Edition para profesionales de bases de datos (I) • Herramientas

dotN

etM

anía

<<

48

dnm.inicio<<

En el listado 1 tenemos un código que pide dosvalores por la consola, los asigna a dos variables ente-ras y después calcula el resultado de dividir esos dosnúmeros. Algo tan sencillo nos servirá para ver algu-nas de las cosas que podemos hacer con “editar y con-tinuar”, y también nos servirá para reflexionar un pocosobre todo este tema de la depuración.

Al ejecutar el código del listado 1, si el usuariohace lo que debe hacer, la ejecución será normal ytodo funcionará como estaba previsto, pero debemostener en cuenta que el usuario no siempre hará lo quequeramos que haga, por tanto no deberíamos confiaren que escribirá los valores adecuados (se supone queel usuario sabe que esos dos números se usarán pararealizar una división, aunque en el código no lo haya-mos indicado expresamente). Este último comenta-rio es el tipo de comentarios que nosotros mismosnos hacemos cuando “nosotros” sabemos qué es loque hay que hacer (y supuestamente el usuario finaltambién), pero que en la aplicación a lo mejor no estádel todo claro. Esta suele ser una primera forma deempezar a tener problemas: suponer que el usuariosabe lo que debe hacer.

En principio, el código del listado 1 es propiciopara al menos tres tipos de errores:

• Que el valor a convertir no sea un número, encuyo caso se producirá una excepción del tipoFormatException,

• Que el segundo valor sea cero; en ese supuestola excepción que se producirá será DivideByZero-Exception,

• Que indiquemos un valor mayor (o menor) delaceptado por el tipo de datos, en cuyo caso reci-biremos una excepción del tipo OverflowExcep-tion, y no debemos confiarnos en que no tenga-mos marcada la opción de comprobar el des-bordamiento (overflow) de números enteros, yaque esa comprobación de desbordamiento solo

afectará a las operaciones realizadas entre valo-res enteros, y no a la hora de asignar el valorcomo en este ejemplo mediante la conversióndesde una cadena.

Por supuesto, lo habitual para estos casos es queusemos un bloque try/catch para interceptar los erro-res, eso es lo fácil. Así nos aseguramos de que no pasanada raro o que al menos se avise al usuario que debeindicar otros datos para que no se produzca ningúnerror. Si eso es lo que queremos hacer, cortar por losano usando un try/catch, tenemos que saber quepodemos hacerlo de dos formas: una es usando unacaptura genérica de errores y otra usando capturasmás específicas. En este ejemplo, podríamos incluirel código en un try con varios bloques catch de la for-ma mostrada en el listado 2.

int i, j;string s;

Console.Write(“Escribe un número ? “);s = Console.ReadLine();i = int.Parse(s);

Console.Write(“Escribe otro número ? “);s = Console.ReadLine();j = int.Parse(s);

int k = i / j;Console.WriteLine(“{0} / {1} = {2}”, i, j, k);

Listado 1. Un código propicio para los errores

int i, j, k;string s;

try{

Console.Write(“Escribe un número ? “);s = Console.ReadLine();i = int.Parse(s);

Console.Write(“Escribe otro número ? “);s = Console.ReadLine();j = int.Parse(s);

k = i / j;

Console.WriteLine(“{0} / {1} = {2}”,i,j,k);

}catch(FormatException ex){

// Detectar las conversiones erróneas}catch(DivideByZeroException ex){

// Detectar la división por cero}catch(OverflowException ex){

// Detectar el error de desbordamiento}catch(Exception ex){

// Detectar cualquier otro error}

Listado 2. Varios bloques catch para los diferentes tipos de excepciones

Page 49: dotNetManía - WordPress.com...Introducción a Windows Live Web Services • XNA. ¿Presente o futuro? • VS 2005 Team Edition para profesionales de bases de datos (I) • Herramientas

dotN

etM

anía

<<

49

dnm.inicio<<

Como vemos, si usamos varios bloques catch, elúltimo que indiquemos debe ser el más genérico. Detodas formas, en caso de no hacerlo en el ordencorrecto, el propio compilador nos avisará del hechode que una captura de error más específica debe irdespués de otra más genérica.

En cualquier caso, usar los bloques try/catch esun recurso que deberíamos dejar para el final, es decir,para los casos en que se pueden producir imprevistosque no hayamos tenido en cuenta, pero que no debe-mos “relajarnos” y pensar que así nos curamos ensalud, ya que si podemos evitar que se produzca unaexcepción, será mejor.

En este caso particular hay alternativas; por ejem-plo, comprobar que la cadena indicada es un valornumérico aceptable o que el valor de la segunda varia-ble no es cero. Para el primer caso, si estuviésemosusando Visual Basic podíamos usar la función IsNu-meric, pero como estamos usando C# y esa funciónno existe, o nos la fabricamos nosotros o buscamosalternativas. En .NET Framework 2.0, los tiposnuméricos, además del método Parse, nos ofrecen elmétodo TryParse; la diferencia de este último con res-pecto al usado en el listado 1 estriba en que si el valorindicado como argumento no se puede convertir, eneste caso a un entero, o el valor indicado produciríaun error de desbordamiento, se asignará un valor cero.

Por tanto, con el uso de TryParse ya tendríamos solu-cionados dos de los tres “posibles” errores que sepodrán producir. Como podemos imaginar, la divi-sión por cero es fácil de controlar. Veamos en el lis-tado 3 las modificaciones comentadas.

En nuestro ejemplo del listado 3, no necesitamoslas tres capturas de error usadas en el código del lis-tado 2; por tanto, podríamos dejar el bloque genéri-co para esos posibles imprevistos. Imprevistos que sino los prevemos, es posible que nos den algún queotro susto, como veremos en un momento.

Más vale prevenir...

Antes de ver cómo pueden afectarnos esos impre-vistos que comentaba, veamos cómo trabajar con losposibles errores que dará el código del listado 1, esdecir, el código inicial sin capturas de errores ni solu-ciones medio mágicas, de forma que podamos ver cómoaplicar “editar y continuar” mientras depuramos.

Figura 1. Error al convertir una cadena en un entero

En .NET Framework 2.0, los tipos numéricos, además

del método Parse, nos ofrecen el método TryParse

int i, j, k;string s;

try{

Console.Write(“Escribe un número ? “);s = Console.ReadLine();int.TryParse(s, out i);

Console.Write(“Escribe otro número ? “);s = Console.ReadLine();int.TryParse(s, out j);

if(j != 0){

k = i / j;Console.WriteLine(“{0} / {1} = {2}”,

i, j, k);}else

Console.WriteLine(“División porcero”);}catch(Exception ex){

// Detectar cualquier error no previsto}

Listado 3. Controlando mejor los posibles errores

Page 50: dotNetManía - WordPress.com...Introducción a Windows Live Web Services • XNA. ¿Presente o futuro? • VS 2005 Team Edition para profesionales de bases de datos (I) • Herramientas

dotN

etM

anía

<<

50

dnm.inicio<<

Lo primero que probaremos es a escribir un valorque no sea numérico. Si ese valor erróneo lo escribi-mos en el primer “input”, el IDE de Visual Studio nosmostrará algo parecido a la captura de la figura 1.

Como vemos, el indicador de la siguiente ins-trucción a ejecutar está en la línea que produce el error,que no es otra que la que realiza la conversión desdeuna cadena por medio del método Parse.

Si quisiéramos volver a repetir la petición delnúmero, lo único que debemos hacer es mover la fle-cha amarilla a la línea que pide el valor desde la con-sola. En ese caso, tendremos otra oportunidad de escri-bir un valor diferente.

También podríamos editar el valor de la variable spara que tenga un valor adecuado. Pero como ya vimosen el listado 3, lo mejor es cambiar el método Parse porTryParse. Por tanto, podemos cambiar el código de esalínea, y en caso de que escribamos mal el nuevo código(por ejemplo, que no indiquemos out en el segundo argu-mento), se nos avisará de que el código es erróneo y quedebemos corregirlo para poder continuar la ejecución,tal como vemos en la figura 2.

Cuando se nos pida el segundo número, ya sabe-mos, si escribimos un texto que no es numérico, seproducirá un error y la ejecución se detendrá, tal comoocurrió antes; por tanto, usaremos también TryParseen la segunda conversión.

El problema en este segundo caso es que el valorindicado sea cero, que será el valor que también seasignará a la variable j si se escribe una cadena o algúnvalor que no sea adecuado para un entero de 32 bits.Y como sabemos, si j vale cero, tendremos un errorde división por cero.

Ahora supongamos que si el segundo valor resul-tara ser cero (porque lo escriba el usuario o porquesea el valor asignado por TryParse), nos interesaríahacer que se volviera a preguntar ese valor, despuésde mostrar un mensaje, de forma que ese código que-dara como el del listado 4.

Muy bien, correcto, pero... ¿de qué me sirve esecambio? ¿qué gano haciéndolo mientras depuro?

Pues... ¡todo! Ya que ese cambio lo podemos hacermientras el cursor que marca la instrucción actual (laflecha amarilla) está en la línea de la conversión de lavariable s a un valor entero para asignarlo a la varia-ble j. Es decir, podemos crear ese bucle mientras esta-mos parados en la excepción anterior, y lo bueno esque si hacemos todos los cambios y pulsamos la tecla[F5] para que continúe la ejecución, veremos que norecibimos ningún error extra y que el bucle se ejecu-ta. En este caso, si el valor asignado a la variable j escero, la condición del bucle se cumplirá (aunque estéen una línea anterior a la que se estaba ejecutando), ypor consiguiente, se volverá a repetir hasta que escri-bamos un valor correcto y que sea distinto de cero.

Hay que fijarse en la asignación que hay antes delinicio del bucle. Esa asignación, incluso si en el esta-do actual del programa (detenido en la conversión des en un valor para j) parece que no afecta a la ejecu-ción, ya que supuestamente se asignará un valor ceroa la variable, es importante que esté, ya que de noponerlo, el compilador nos indicará que no podemoscontinuar la edición porque no podemos usar unavariable no inicializada. Bueno, en realidad el mensa-je de error será parecido al de la figura 2, pero la varia-ble j indicada en la condición de la instrucción whileestará subrayada con la línea dentada que seguramenteya conoceremos, indicándonos que no podemos usar-la antes de que tenga un valor.

Probamos, y si no funciona, deshacemos

Otro cambio que también podemos hacer, (aunqueen este ejemplo no afectará, pero simplemente para quecomprobemos que podemos hacerlo), es cambiar elsitio de la declaración de la variable k. En el listado 1,esa declaración está en la misma línea en la que se hacela división (que según algunos es el mejor sitio paradeclararla, ya que las variables se deberían declarar jus-to cuando se vayan a usar). Pero supongamos que que-remos que esté antes, por ejemplo junto a las otras decla-

Figura 2. Advertencia de que los cambios en el código no son correctos

j = 0;while(j == 0){

Console.Write(“Escribe otro número ? “);s = Console.ReadLine();int.TryParse(s, out j);

if(j == 0){

Console.WriteLine(“Por favor escribe un valor distinto de cero”);

}}

Listado 4. Repetir hasta que el valor sea distinto de cero

Page 51: dotNetManía - WordPress.com...Introducción a Windows Live Web Services • XNA. ¿Presente o futuro? • VS 2005 Team Edition para profesionales de bases de datos (I) • Herramientas

dotN

etM

anía

<<

51

dnm.inicio<<

raciones que tenemos, de forma que quede la declara-ción como en el listado 2 ó el 3. Pues bien, ese cambiotambién lo podemos hacer, ¡incluso si el cursor estádetenido en la línea en la que se asigna el valor! Es decir,la línea actual a ejecutar sería int k = i / j; si hace-mos el cambio en ese punto, o incluso después, todoseguirá funcionando como se “supone” que debería.

Esto nos demuestra que en realidad son muchas lasmodificaciones del código que podemos hacer y aún asípoder continuar con la ejecución del programa, perocomo ya vimos antes, hay ciertas restricciones; por tan-to, la mejor forma de saber si podemos o no hacer cier-tos cambios es ¡probándolo! Que no se pueden hacer,como el editor de Visual Studio nos avisa, siempre ten-dremos el recurso de pulsar varias veces la combinaciónde teclas [Ctrl]+[Z] y dejar el código como estaba ocomentar los cambios que afecten la ejecución y despuésponerlos en práctica. Es decir, si no se puede, lo dejamoscomo estaba; que se puede, ¡mejor, porque ya tendremoslos cambios hechos y probados!

Propagación de errores

Para finalizar, quiero comentar un comportamientoque no es nuevo, pero que es adecuado al tema de esteartículo, y que debemos conocer para que no nos ocu-rra sin que estemos advertidos. Se trata de la propa-gación de errores.

Cuando se produce una excepción, el CLR com-prueba si en la pila de llamadas hay algún bloquetry/catch, y en caso de que exista, lo utiliza. Bien, estoes lo que suponemos que ocurre. El problema se pue-de suscitar cuando ese bloque try/catch no está don-de debiera. Por ejemplo, supongamos que el códigoque hemos estado usando hasta ahora (por ejemplo,el del listado 1) está dentro de un método y que nohemos usado TryParse para realizar las conversiones yque tampoco hacemos comprobación de que no sedivida por cero.

Sigamos suponiendo: si ahora ese código lo llama-mos desde otra parte de nuestra aplicación, y resultaque hemos usado un try/catch para otras comproba-ciones de error, si se produce cualquier error en esemétodo (al que llamaré prueba1), ese error no se pro-ducirá en el método prueba1, sino que se propagará porla pila de llamadas, y si .NET detecta que en esas lla-madas almacenadas en la pila hay algún bloque de detec-ción de errores, lo usará. Este caso lo vemos en el códi-go del listado 5. En ese código, el método prueba1 loque contiene es el mismo código del listado 1.

En este caso en particular, no habrá ningún proble-ma, salvo por el hecho de que el bloque catch que se uti-liza no es, digamos, el esperado. En realidad debería serel esperado, ya que no existe otro, pero la idea es que secaptura el error “fuera” de donde se debiera.

El problema con el que nos podemos encontrares que en los bloques catch no hubiera ninguna cap-tura adecuada a los errores producidos; en este caso,no habrá ningún tipo de magia. Por ejemplo, supon-gamos que esa llamada al método prueba1 se hahecho desde otra parte del código que detecta unerror, por ejemplo, de acceso al disco (o cualquierotro que no esté relacionado con los producidos enel método); en ese caso, la ejecución se detendrájusto donde se produce el error, es decir, dentro delmétodo prueba1. Pero, al menos por la experienciaque tengo, puedo asegurar que en la mayoría de loscasos, los bloques try/catch que normalmente seusan siempre tienen al menos uno que interceptauna excepción genérica (usando la clase Exceptioncomo tipo a detectar); por tanto, debemos tener cui-dado con nuestro código para que no se nos vayade las manos y los errores no se detecten donde enrealidad deberían detectarse.

ConclusionesConfío en que con todo lo comentado en este artí-culo y en el del mes pasado, el lector tenga una visiónadecuada de cómo realizar el proceso de depuracióncon Visual Studio y que le pierda un poco el miedoa la depuración, en particular porque desde que dis-ponemos de “editar y continuar” esa labor de depu-ración es mucho más cómoda de realizar. Por supues-to, hay más cosas de las que hablar sobre este tema,pero que por las habituales razones de espacio nohemos podido tratar; por ello recomiendo al lectorla lectura del siguiente artículo publicado en el sitiode MSDN (también disponible en la ayuda de VisualStudio): http://msdn2.microsoft.com/es-es/library/7fe0dd2y(VS.80).aspx.

También confío que nos sigamos leyendo en dot-NetManía, en la nueva sección que empezaremos elpróximo mes de febrero coincidiendo con el comien-zo del quinto año de la revista.

// ... códigotry{

//...prueba1();//...

}catch(Exception ex){

Console.WriteLine(ex.Message);}

Listado 5. Llamada a un método desde un bloque try/catch

Page 52: dotNetManía - WordPress.com...Introducción a Windows Live Web Services • XNA. ¿Presente o futuro? • VS 2005 Team Edition para profesionales de bases de datos (I) • Herramientas

El control UpdatePanel es el nervio central de lasactualizaciones parciales de ASP.NET AJAX. Le per-mite definir una región de marcado ASPX que seactualiza independientemente del resto de la pági-na. Suponga que usted utiliza el control UpdatePa-nel para envolver un control DataGrid. En tal caso,cuando el usuario pulsa para visualizar una nuevapágina, solo la rejilla es actualizada, y el resto de lapágina se mantiene intacta y en funcionamiento. Estaes la manera típica de definir una región de actuali-zación parcial mediante UpdatePanel.

Como puede ver, el contenido de un controlUpdatePanel se define dentro de una plantilla, lapropiedad ContentTemplate. En ASP.NET, una pro-piedad de plantilla es el mecanismo perfecto parahacer posible que un control de servidor aloje con-tenido ASP.NET arbitrario. Más importante es elhecho de que puede ser rellenada tanto declara-tiva como programáticamente. La propiedad Con-

tentTemplate del control UpdatePanel no es ningu-na excepción. ¿Qué se necesita entonces para car-gar o editar la plantilla mediante código? Consi-deremos varios escenarios:• El contenido de la región actualizable está ini-

cialmente vacío y usted desea rellenarlo entiempo de ejecución.

• Es posible que la página no necesite una regiónactualizable fija. Sin embargo, si surge tal nece-sidad, la región deberá ser creada y pobladadinámicamente.

• La región actualizable se define mayormentede forma declarativa, pero usted necesita aña-dir o eliminar controles y triggers en tiempode ejecución.Veamos el primer escenario. En la página

ASP.NET usted tiene el siguiente marcado:

Como cualquier otra propiedad de plantilla, ala propiedad ContentTemplate del control Update-

UpdatePanel y la caché en LINQ to SQL

Dino Esposito

Dino Espositoes mentor de SolidQuality Learning. Esponente habitual en

los eventos de laindustria a nivel

mundial. Visite sublog en: http://weblogs.

asp.net/despos.(todotNet.QA@

dotnetmania.com)

Estoy empezando con ASP.NET AJAX y tengo una pregunta sobre el control UpdatePanel parala que no he encontrado respuesta. Todos los ejemplos que he visto envuelven un fragmento demarcado ASPX en un panel que es parte de la página. En vez de eso, lo que yo quiero es poderdefinir dinámicamente el contenido del control UpdatePanel mediante código. ¿Es esto posible?

todonet@qa

Este mes responderé a dos preguntas sobre ASP.NET AJAX y LINQ to SQLque apuntan a temas de amplio interés. Siga leyendo para conocer cómopoblar programáticamente un control UpdatePanel y cómo implementaruna capa de caché sobre los datos recuperados mediante LINQ to SQL.

tod

otN

et.q

a@

dot

netm

ania.c

om

<asp:UpdatePanel id=”UpdatePanel1” runat=”server” …><ContentTemplate>

<asp:DataGrid id=”DataGrid1” runat=”server” …></ContentTemplate>

</asp:UpdatePanel>

<asp:UpdatePanel id=”UpdatePanel1” runat=”server” …><ContentTemplate>

<%— Región actualizable inicialmente vacía —%></ContentTemplate>

</asp:UpdatePanel>

Page 53: dotNetManía - WordPress.com...Introducción a Windows Live Web Services • XNA. ¿Presente o futuro? • VS 2005 Team Edition para profesionales de bases de datos (I) • Herramientas

Panel se le puede asignar programáticamente cualquier obje-to .NET que implemente la interfaz ITemplate. La interfazITemplate es relativamente muy simple:

La interfaz consta de un único método, InstantiateIn(), querecibe un parámetro de tipo Control. El control pasado a Ins-tantiateIn() representa un control que es el padre de todos loscontroles hijos de la plantilla. En una clase que implemente ITem-plate, estos controles hijos serán creados dinámicamente. Lasiguiente clase representa a una plantilla que simplemente mues-tra “Hello world” en estilo H1:

La siguiente sentencia muestra cómo asignar una instan-cia del tipo anterior a la propiedad ContentTemplate de unpanel actualizable:

UpdatePanel1.ContentTemplate = new MyTemplate();

De esta manera, usted controla completamente el conteni-do de la plantilla del panel y toma la decisión final sobre cómose crea cada uno de sus controles hijos.

Indudablemente, implementar una solución basada en ITem-plate nos da una máxima flexibilidad, pero es bastante compleja.El código parece bastante sencillo para el caso de un único con-trol, pero ¿y si es necesario incorporar un formulario complejo enel control UpdatePanel? La solución basada en ITemplate funcio-nará, pero será muy poco práctica. Debe haber una vía mejor.

La clase Pageofrece un método llamado LoadTemplate(). Estemétodo recibe la URL de un control de usuario ASCX y expo-ne automáticamente su contenido a través de la interfaz ITem-plate. Como desarrollador de la página, todo lo que usted deberásaber se muestra en el siguiente código:

Observe que la propiedad ContentTemplatede un control Upda-tePanelno puede ser asignada después de que la plantilla haya sidoinstanciada o el contenedor de la plantilla haya sido creado. Estosignifica que solo es posible cargar de manera segura la plantilla

de contenido en el evento PreInit. Si se mueve el código anterioral evento Init o Load de la página, se producirá una excepción.

¿No sería agradable saber un poco más acerca del métodoLoadTemplate() y su magia? Este método crea y devuelve unainstancia de una clase interna de .NET Framework que imple-menta la interfaz ITemplate. Ésta se llama SimpleTemplate y estádefinida de la siguiente forma:

La implementación del método InstantiateIn() simple-mente crea una instancia del control de usuario y la añade al sitiohuésped.

El segundo escenario a tener en cuenta es la situación en laque la página no tiene ningún control UpdatePanel en el marca-do ASPX. Esto significa que la región actualizable podrá o noser creada en dependencia de condiciones de tiempo de ejecu-ción. Como cualquier otro control de servidor ASP.NET, uncontrol UpdatePanel se puede crear “al vuelo”, como en el siguien-te ejemplo:

Se puede añadir un control UpdatePanel a la página en cual-quier momento del ciclo de vida de la misma.

Finalmente, ¿cómo agregar o eliminar controles de un Upda-tePanel existente? Para ello se debe utilizar la propiedad Con-tentTemplateContainerde la clase UpdatePanel. El siguiente códi-go se basa en el anterior y muestra cómo crear una interfaz deusuario sencilla que incluye un botón y una etiqueta:

dotN

etM

anía

<<

53

Tod

otN

et.q

a@

dot

netm

ania

.com

Tod

otN

et.q

a@

dot

netm

ania

.com

dnm.todonet@qa<<

public interface ITemplate{void InstantiateIn(Control container);}

public class MyTemplate : ITemplate{

public void InstantiateIn(Control container){

string msg = “<h1>Hello world</h1>”;LiteralControl h1 = new LiteralControl(msg);container.Controls.Add(h1);

}}

void Page_PreInit(object sender, EventArgs e){

string ascx = “content.ascx”;UpdatePanel1.ContentTemplate = this.LoadTemplate(ascx);

}

internal class SimpleTemplate : ITemplate{

// ...}

protected void Page_Load(object sender, EventArgs e){

UpdatePanel update = new UpdatePanel();update.ID = “UpdatePanel1”;

// Poblar la plantilla de contenido del panel// ...// Agregar el panel a la lista de controlesthis.Form.Controls.Add(update);

}

internal class SimpleTemplate : ITemplate{

// ...}

public partial class DynamicUpdatePanelPage : System.Web.UI.Page

{private Label Label1;

protected void Page_Load(object sender, EventArgs e){

UpdatePanel update = new UpdatePanel();update.ID = “UpdatePanel1”;

// Definir el botónButton button1 = new Button();button1.ID = “Button1”;button1.Text = “Click me?”;

Page 54: dotNetManía - WordPress.com...Introducción a Windows Live Web Services • XNA. ¿Presente o futuro? • VS 2005 Team Edition para profesionales de bases de datos (I) • Herramientas

No estoy diciendo nada nuevo al afirmar que LINQ toSQL es realmente una potente plataforma para el accesoa datos. Pero no es perfecto, y algunas de las decisionesarquitectónicas en que se basa son hasta cierto punto reba-tibles. El hecho clave sobre LINQ to SQL es que no esadecuado para la capa intermedia. Idealmente, debería uti-lizarse en la capa de acceso a datos como una variante másinteligente y orientada a objetos que T-SQL para el acce-so físico a los datos. ¿Qué significa esto en relación con supregunta?

“Cachear” datos no es responsabilidad de LINQ toSQL. Es responsabilidad de su capa intermedia. En otraspalabras, los objetos de su modelo de dominio hacen lla-madas a la capa de acceso a datos potenciada por LINQ yobtienen los resultados. En ese momento la “conexión”con LINQ to SQL se cierra. Los datos pertenecen a sucapa intermedia y pueden ser cacheados y gestionados segúnsea apropiado. No obstante, su pregunta aún sigue sin res-puesta. Aún le debo un dato fundamental: cómo desco-nectar los resultados de una consulta de LINQ to SQL desu entorno nativo de modo que la capa intermedia (o, porqué no, la propia capa de acceso a datos) pueda cachear-los. Observe el siguiente fragmento de código:

public IEnumerable<Customer> GetListOfCustomers(){

NorthwindDataContext dc = new NorthwindDataContext();var data = from c in dc.Customers

select c;return data.ToList();

}

El contexto de datos representa una “conexión” lógicaa la fuente de datos, y al igual que una conexión tradicionala una base de datos debe, idealmente, mantenerse abiertosolamente durante el mínimo imprescindible de tiempo.Esto no tiene repercusiones sobre la escalabilidad si ustedno lo hace así, pero en términos de arquitectura debe serconsiderado un objeto con un tiempo de vida corto.

Cuando usted ejecuta una consulta de LINQ to SQL,los datos no se recuperan inmediatamente. El acceso a lafuente de datos solo se realiza cuando los datos son solici-tados para ser utilizados. Ésta es la razón por la que ustedobserva que LINQ to SQL “baja” con demasiada frecuenciaa la base de datos. Es como si usted fuera al supermercadocada vez que se diera cuenta de que se le termina algo. ¿Pan?Al supermercado. ¿Aceite de oliva? De nuevo al super-mercado. Y así sucesivamente. El método ToList() apli-cado al objeto-tabla que nos suministra LINQ to SQL car-ga en memoria todo el conjunto de resultados y lo desco-necta del entorno de ejecución de LINQ to SQL. A par-tir de ese momento, usted podrá “cachear” y gestionar losdatos del modo que desee.

dotN

etM

anía

<<

54

dnm.todonet@qa<<T

odot

Net.q

a@

dot

netm

ania

.com

Tod

otN

et.q

a@

dot

netm

ania

.com

La primera vez que vi LINQ, me enamoré de él. Ahora soy un total adicto a LINQ, y en particular aLINQ to SQL. Pero una vez que el matrimonio se ha “establecido”, surgen los primeros problemas.LINQ to SQL “baja” a la base de datos con demasiada frecuencia para mi gusto. ¿Cómo puedo man-tener en una caché el conjunto de resultados obtenido al ejecutar una consulta?

Traducido al castellano por Octavio Hernández

Si tiene experiencia de desarrollo con ASP.NET, ustedse preguntará por qué es necesario utilizar una nueva pro-piedad ContentTemplateContainerpara añadir controles hijos

en vez de la más familiar colección Controls. Todos los con-troles ASP.NET ofrecen una propiedad Controls, que hasido diseñada específicamente para alojar todos los hijos deun control. ¿Cuál es el problema?

En un control UpdatePanel, y en general en cualquiercontrol de plantilla, realmente se añaden controles hijos ala plantilla, y no al propio control. Más exactamente, loscontroles hijos se añaden al contenedor de plantilla. El con-tenedor de plantilla es el objeto que aloja la plantilla. Si vuel-ve a la definición de la interfaz ITemplate, el contenedor esel parámetro del método InstantiateIn(). Cada control deplantilla es responsable de suministrar el contenedor, lo quees considerado un detalle de implementación interna. Siañade directamente un control a la colección Controls delUpdatePanel, usted estaría creando hermanos del contene-dor. Si desea poblar programáticamente el control Update-Panel, deberá agregar los controles hijos al contenedor deplantilla utilizando la propiedad ContentTemplateContainer.Observe que, para evitar estos problemas, el control Upda-tePanel implementa su propiedad Controls de forma tal,que se produce una excepción si se le intenta agregar uncontrol hijo.

button1.Click += new EventHandler(Button1_Click);

// Definir los literalesLiteralControl lit = new LiteralControl(“<br>”);

// Definir la etiquetaLabel1 = new Label();Label1.ID = “Label1”;Label1.Text = String.Empty;

// Conectar controles al UpdatePanelupdate.ContentTemplateContainer.Controls.Add(button1);update.ContentTemplateContainer.Controls.Add(lit);update.ContentTemplateContainer.Controls.Add(Label1);

// Agregar el UpdatePanel a la listathis.Form.Controls.Add(update);

}

protected void Button1_Click(object sender, EventArgs e){

Label1.Text = DateTime.Now.ToShortTimeString();}

}

Page 55: dotNetManía - WordPress.com...Introducción a Windows Live Web Services • XNA. ¿Presente o futuro? • VS 2005 Team Edition para profesionales de bases de datos (I) • Herramientas

En el últimoWebDay realizadoen Valencia, DavidCarmona aprove -chó el evento paraalguna cosa más queexponer las últimasnovedades de Mi -crosoft en el ámbitodel desarrollo Web,y volvió a jugar elpapel de dinami -zador de comunidadque tan bien desem-peña. En esta oca siónel ojo de Davidrecayó en un incautoXimo Tomás, quecon un saco lleno de

ganas y energía asumió el reto de crear un grupo de usuarios de .NETen una ciudad tan importante como Valencia. A modo de estocada,tanto José Luis Latorre como yo mismo, que andábamos ese día invi-tados a colaborar en el evento, pudimos charlar brevemente con Ximoy aportar nuestro granito de arena a la hora de “embaucarle”.

Quizás visto desde fuera, la creación de un grupo de usuarios parecemás sencilla de lo que en realidad es; desde la creación de un portal(donde Javier Conesa también ha colaborado con sus exce-lentes artículos) hasta encontrar los ponentes para loseventos, un largo proceso me ha permitido conocer mejora Ximo en sus visitas a Barcelona y durante los eventosen los que hemos coincidido, con lo que me atrevo ase-gurar que el nuevo proyecto bautizado como ValenciaDev.Net está en muy buenas manos, y que el trabajo deestos meses va a dar excelentes resultados.

¿Qué mejor manera de acabar un año que con unbuen evento inaugural? Y es que el pasado día 18 dediciembre de 2007 el grupo empezó su andadura con unevento por todo lo alto. El lugar, inmejorable: la Bolsade Valencia, y con unos ponentes de primera línea. Laagenda destinada a atraer a todo tipo de público con ganasde aprender cosas nuevas y contactar con gente de inquie -tudes similares cumplió su cometido, empezando debuena mañana con un sesión de tendencias Web. Ni quédecir tiene que cuando uno se levanta prontito por lasmañanas más vale que no le incordien con mucho Power -Point tostón y mucho bla-bla-blá, con lo que tener a DavidSalgado garantiza que los asistentes no van a tener niproblemas de sueño, ni les van a faltar ganas de probar

todo lo mostrado alacabar la sesión. Y así fue,con una salida de guiónpor todo lo alto, como sia David le gustara impro-visar... La charla mantuvoun tono al más puroestilo de lo que debe serun grupo de usuarios,con mucha participaciónpor parte de los asis-tentes.

Y como no solo de Web vive el desarrollador, Manuel Llavadordio una charla sobre la herramienta definitiva, que hará que los pro-gramadores ya no hagan más falta… Windows Workflow Founda-tion o, como mínimo, la primera aproximación a un futuro tan “alen-tador” como ése… Ni qué decir tiene que fue otro éxito, y que ésteMSP es una de las grandes bazas de futuro con las que cuenta elgrupo.

Lejos de dormirse en los laureles, la gente de ValenciaDev.Netandan con ganas de convertirse en poco tiempo en una de las comu-nidades de referencia en nuestro país, y ya están preparando el pró -ximo evento e incluso organizando un desplazamiento desde Valen-cia al Developer Day de Madrid.

TEXTO: TONI RECIO

dotN

etM

anía

<<

55

comunidad.net

Próximo evento de NavarraDotNet

NavarraDotNet, el grupo de usuarios .NET de Navarra, acaba de cumplirsu primer año de existencia, y para empezar bien este segundo año hemosorganizado un evento que se celebrará el próximo día 25 de enero de 2008en la Universidad Pública de Navarra. En este evento se desarrollarán doscharlas destacadas de los ponentes invitados: Rodrigo Corral (Plain Con-cepts) y Octavio Hernández (Plain Concepts), además de charlas de ponenteslocales: David Gil (Biko2), Rubén Bernárdez (Biko2), David Marzo (Sol-natec) y Javier Babuglia (Biko2), entre otros. Os invitamos a asistir a esteprome tedor evento, en el que las ponencias girarán en torno a temas de actua -lidad como Microsoft Team Foundation Server, LINQ, Silverlight, YahooUser Interface Library (YUI) y Test Driven Development.

Toda la información sobre el evento y sobre nosotros se puede encontraren www.navarradotnet.com.

TEXTO: JAVIER BABUGLIA

eventos.eventos.eventos

ValenciaDev.NetGrupo de usuarios de .NET de Valencia

ValenciaDev.net• Ubicación: Valencia• Fecha de fundación: 18-12-2007• Fundador: Ximo Tomás• Número de miembros: 15• Página Web: www.valenciadev.net• Email de contacto:

[email protected]

Page 56: dotNetManía - WordPress.com...Introducción a Windows Live Web Services • XNA. ¿Presente o futuro? • VS 2005 Team Edition para profesionales de bases de datos (I) • Herramientas

❑ Deseo suscribirme a dotNetManía por un año (11 números) por un precio de 65,00€ IVA incluido.❑ Deseo que me envíen los números atrasados marcados según el precio de portada. Otros:

(Solo para residentes en España)

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

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

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

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

Firma y/o sello

a de de 2007

DATOS DE ENVÍO

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

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

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

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

Enviar los datos por:

Fax: 914991364 Teléfono: 916667477Email: [email protected]

Netalia, S.L. · C/ Tomás Edison, 4-1406 · Parque Empresarial Rivas Futura · 28521- Rivas Vaciamadrid (Madrid)

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

❑ Nº30 (6,50€) ❑ Nº31 (6,50€) ❑ Nº32 (6,50€) ❑ Nº33 (6,50€) ❑ Nº34 (6,50€) ❑ Nº35 (6,50€) ❑ Nº36 (6,50€)

❑ Nº37 (6,50€) ❑ Nº38 (6,50€) ❑ Nº39 (6,50€) ❑ Nº40 (6,50€) ❑ Nº41 (6,50€) ❑ Nº42 (6,50€) ❑ Nº43 (6,50€)

Page 57: dotNetManía - WordPress.com...Introducción a Windows Live Web Services • XNA. ¿Presente o futuro? • VS 2005 Team Edition para profesionales de bases de datos (I) • Herramientas

C# 3.0 in a Nutshell: A Desktop Quick ReferenceJoseph Albahari, Ben AlbahariEditorial: O’ReillyPáginas: 858Publicado: septiembre de 2007ISBN: 978-0596527570Idioma: inglés

Una vez salida al mercado la versión definitiva de .NET 3.5 y C# 3.0, era de espe-rar la llegada de una oleada tanto de nuevos libros dedicados a presentar las novedadesque ofrecen estos recién llegados (como es el caso de mi libro, “C# 3.0 y LINQ”, reseña-do por mi compañero Marino Posadas el mes pasado), como de actualizaciones de librosya existentes completados con nuevos capítulos destinados a “encajar” lo más orgánica-mente posible dichas novedades. El libro que ahora presentamos pertenece al segundogrupo, y es mi opinión que cumple de manera excelente con dicho cometido, pudiendoservir, por ejemplo, para la implementación de un curso de completo de programaciónen .NET con C# 3.0. Además de acomodar las características incorporadas a C# 3.0 den-tro de capítulos ya existentes, el libro dedica tres nuevos capítulos a las consultas inte-gradas en el lenguaje, incluyendo presentaciones de LINQ to Objects, LINQ to SQL yLINQ to XML. Estos tres capítulos están muy bien escritos, y se nota que los autores yahan asimilado a cabalidad las posibilidades que LINQ abre ante los desarrolladores.

Es de destacar que como complemento del libro los autores ofrecen un conjunto de recur-sos útiles para familiarizarse con las consultas integradas, como la utilidad LINQPad (quepermite ejecutar sentencias LINQ arbitrarias), tests de evaluación de conocimientos y todoel código de los ejemplos del libro. La URL es http://www.albahari.com/nutshell.

C++/CLI in ActionNishant SivakumarEditorial: ManningPáginas: 416Publicado: abril de 2007ISBN: 978-1932394818Idioma: inglés

Por recomendación de mi buen amigo Rafael Ontivero, decidí darle una oportunidad aeste título, que según él se apartaba del resto de los libros sobre el tema que ambos poseemos(ya reseñé aquí hace algunos meses el libro “Pro Visual C++/CLI and the .NET 2.0 Plat-form”, de Stephen R. G. Fraser). Y hay que decir que realmente he quedado gratamenteimpresionado: el libro describe de manera clara, profunda y a la vez sumamente práctica todaslas particularidades de C++/CLI y su implementación a bajo nivel. Además, a lo largo de todoel libro se hace especial énfasis en todo lo relacionado con la interoperación entre códigomanejado y no manejado. Eso sí: no espere encontrar aquí, como en el libro de Fraser, quin-ce capítulos dedicados a presentar las clases de la BCL. Solo hay un capítulo al final relacio-nado con las API de .NET, y se dedica a mostrar cómo trabajar con WCF desde C++/CLI.Un libro altamente recomendado si ya conoce C++ y quiere familiarizarse con las caracterís-ticas adicionales que ofrece C++/CLI, enterándose al mismo tiempo de todos los detallessobre el funcionamiento interno de las mismas.

biblioteca.net

nove

dad

es PRO ASP.NET 3.5 in C# 2008

Matthew MacDonald, Marius Szpuszta. Editorial: APress. Páginas: 1498. Publicado:

noviembre de 2007. ISBN: 978-1590598931. Idioma: inglés.

Pro C# 2008 and the .NET 3.5 PlatformAndrew Troelsen. Editorial: APress. Páginas: 1370. Publicado: noviembre de 2007. ISBN:

978-1590598849. Idioma: inglés.

TEXTO: OCTAVIO HERNÁNDEZ

Page 58: dotNetManía - WordPress.com...Introducción a Windows Live Web Services • XNA. ¿Presente o futuro? • VS 2005 Team Edition para profesionales de bases de datos (I) • Herramientas

dotN

etM

anía

<<

58

desvánBaterías de 20 horas para portátiles

Mediante un sistema basado enla utilización de nanocables (yasabe, cables de un diámetro delorden de un nanómetro), elprofesor Yi Cui, de la Univer-sidad de Stanford, ha perfec-cionado un sistema capaz demultiplicar por 10 la cantidad

de electricidad que puede extraerse de las clásicas pilas de litio quemuchos utilizamos en nuestros portátiles. Con estas pilas, el litiose almacena en bosques de nanocables de silicio del tamaño deuna milésima del grosor de una hoja de papel, que al rellenarsecon litio no se fracturan como sucedía en anteriores experimen-tos, capacitando la obtención de enormes tasas de conductividad.

Y también de esa zona geográfica (UCLA, University of Cali-fornia Los Angeles) nos llegan noticias sobre algunas mejoras muysignificativas en el diseño de circuitos, pero lo más notable es queesta vez no se trata de mejoras asociadas al hardware y/o los mate-riales de construcción, sino de mejoras en el propio software quese utiliza para el diseño de los circuitos, obteniendo prototiposque necesitan hasta un 30% menos de cableado que los que sehacen en la actualidad. Los profesores Jason Conq y Tony Chan(matemático de la National Science Foundation) explican que lasolución de colocar millones de elementos en una superficie bidi-mensional es similar a la resolución de los rompecabezas más com-plicados y el problema –afirman– es que el software actualmenteutilizado para el diseño de los chips está lejos de ser óptimo en losresultados. Con la aplicación de nuevos algoritmos diseñados porellos, “se pueden crear circuitos que necesitan hasta 30% menosde energía y continuar con la reducción de tamaño necesaria paraseguir cumpliendo la Ley de Moore”.

Marino Posadas

Historia de la computación y los documentos informáti-cos. Documento en castellano, donde se trata el tema de lahistoria de la computación desde el punto de vista de los docu-mentos informáticos y sus implicaciones legales, como su valorprobatorio, y otros aspectos jurídicos. Disponible en el sitioMonografías.com en la página http://www.monografias.com/tra-bajos14/documentosinformaticos/documentosinformaticos.shtml.

HitMill “History of Computers”. Si lo que pretende-mos es acceder a un estudio más detallado de la evoluciónde los ordenadores en la historia, desde un punto de vistaexclusivamente técnico, podemos recomendar (en inglés)el sitio de HitMill “History of Computers” (http://www.hit-mill.com/computers/computerhx1.html), donde se hace unextenso recorrido por la historia y evolución de la informá-tica desde sus inicios. Una auténtica y muy extensa enci-clopedia de la computación.

Certificados digitales: ¿funcionan? Ese es el sorpren-dente título que nos ofrece Jeff Atwood (Coding horror)en su Web. Con muchas capturas de pantalla explicativas.Da que pensar… (Disponible en http://www.codingho-rror.com/blog/archives/001024.html).

El sitio de Ryan Olshan. Reúne una buena cantidad de referenciasa artículos de calidad y libros de conocidos “gurús” del desarro-llo en .NET, como Juval Lowy, Tod Holding y otros(http://www.strongtypes.com/Home/tabid/36/Default.aspx).

Programmer’s Heaven. La incluimos como sitio recomendado,ya que es ingente la cantidad de información de interés que seencuentra en sus páginas, aunque aprovechamos la ocasiónpara subrayar una página concreta del sitio: la dedicada a lasherramientas específicas para .NET, con una extensa relaciónde todas las que hay disponibles, sus ubicaciones, característi-cas, etc. Se puede visitar en http://www.programmersheaven.com/zone28/mh55.htm.

Diseñador 3D gratuito de Microsoft.Parece que alguien de por allí nece-sitaba uno para ciertas operaciones,se lió la manta a la cabeza y…elresultado puede descargarse deChannel9, en la página dedicada(http://channel9.msdn.com/Show-Post.aspx?PostID=368015). Puedecargar texturas, generar datos normalizados y tiene inte-resantes características de morphing.

documentos en la red

utilidades del mes

sitios del mes

noticias.noticias.noticias

El viejo amperio, redefinido: un electrón por unidad de tiempo

Gracias a un minúsculo dispositivo electrónico construido porfísicos finlandeses y norteamericanos, podría muy pronto dispo-nerse de un medio de redefinir con más precisión la unidad deintensidad de corriente eléctrica que todos estudiamos en la escue-la. El equipo, dirigido por Jukka Pekola, de la Helsinki Univer-sity of Technology, ha conseguido diseñar un transistor de un úni-co electrón, que puede utilizarse para solucionar los problemasde medición ultraprecisa necesarios en ciertas investigaciones.Como es sabido, el amperio, junto al voltio y el ohmio, son lastres unidades fundamentales utilizadas en electricidad. Mientraslas dos últimas han refinado sus definiciones en los últimos años,la del amperio carecía de la precisión alcanzada con las otras dosunidades debido a su propia naturaleza. Como suele ocurrir enestos casos, otros científicos ya apuntan a otros posibles usos deestos transistores microscópicos, además.

noticias.noticias.noticias

Page 59: dotNetManía - WordPress.com...Introducción a Windows Live Web Services • XNA. ¿Presente o futuro? • VS 2005 Team Edition para profesionales de bases de datos (I) • Herramientas
Page 60: dotNetManía - WordPress.com...Introducción a Windows Live Web Services • XNA. ¿Presente o futuro? • VS 2005 Team Edition para profesionales de bases de datos (I) • Herramientas