dotnetmanía - sergiogonzalezc.files.wordpress.com · nueva herramienta de monitorización en sql...

60
SQL Server Performance Studio. Nueva herra- mienta de monitorización en SQL Server 2008 dedicada a los profesionales de la plataforma .NET www.dotnetmania.com entrevista Jason Zander y Tony Goodhew General Manager y Product Planner de Visual Studio Microsoft Corp. nº 56 febrero 2009 6,50 Visual Basic • C# • ASP.NET • ADO.NET • AJAX • Silverlight • .NET Framework dotNetManía Consulta de modelos conceptuales con Entity SQL (I) • Silverlight 2.0 Toolkit. Controles, visualización de datos y mucho más (y II) • Implementando wrappers con C++/CLI • WCF. Configuraciones e instaladores SQL Server Trucos de WCF TodotNet@QA SUGES. SharePoint User Group España Comunidad.net Pruebas unitarias. Un enfoque práctico ALManía ¿Son una buena cosa? Los métodos de extensión

Upload: nguyentuyen

Post on 20-Sep-2018

219 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: dotNetManía - sergiogonzalezc.files.wordpress.com · Nueva herramienta de monitorización en SQL Server 2008 38-40 SQL Server 2008 incorpora una nueva herramienta que será la base

SQL Server Performance Studio. Nueva herra-mienta de monitorización en SQL Server 2008

dedicada a los profesionales de la plataforma .NET

www.

dotne

tman

ia.co

m

entrevistaJason Zander y Tony Goodhew General Manager y Product Plannerde Visual Studio Microsoft Corp.

nº 56 febrero 2009 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX • Silverlight • .NET Framework

dotNetManía

Consulta de modelos conceptuales con Entity SQL (I) • Silverlight 2.0 Toolkit. Controles, visualización de datos y mucho más(y II) • Implementando wrappers con C++/CLI • WCF. Configuraciones e instaladores

SQL Server

Trucos de WCFTodotNet@QA

SUGES. SharePoint User Group EspañaComunidad.net

Pruebas unitarias. Un enfoque prácticoALManía

¿Son una buena cosa?

Los métodos de extensión

Page 2: dotNetManía - sergiogonzalezc.files.wordpress.com · Nueva herramienta de monitorización en SQL Server 2008 38-40 SQL Server 2008 incorpora una nueva herramienta que será la base
Page 3: dotNetManía - sergiogonzalezc.files.wordpress.com · Nueva herramienta de monitorización en SQL Server 2008 38-40 SQL Server 2008 incorpora una nueva herramienta que será la base

Bienvenido al número 56, de febre-ro de 2009, de dotNetManía.

Comenzamos con este ejemplarnuestro sexto volumen, nuestro sex-to año de publicación. Va a ser, sinningún lugar a dudas, el más difícilde todos. A fuerza de ser sincero, miprimera aspiración es que la crisiseconómica no nos barra de la faz delmercado. Ya ve, optimista que esuno. Contamos al menos con ungrupo de fieles lectores, patrocina-dores y amigos que estimo suficien-tes para que esto no ocurra. Aún así,lo cierto es que el negocio de losmedios tradicionalmente es de losmás perjudicados por las crisis eco-nómicas, porque el gasto publicita-rio es el primero en eliminarse enmuchas empresas. Incomprensible-mente para mí, pero lo cierto es quese avecinan “malos tiempos para lalírica”.

Este mes publicamos la entrevis-ta realizada por Magda Teruel yLuis Fraile a Jason Zander y TonyGoodhew, General Manager y Pro-duct Planner, respectivamente, deVisual Studio en Microsoft Corp. Enesta segunda entrega de tres entre-vistas realizadas durante el Tech-Edde Barcelona, Jason y Tony noshablan de las novedades de .NETFramework 4.0 y Visual Studio2010.

El art ículo de portada “Losmétodos de extensión ¿Son una bue-na cosa?”, de los autores Mario delValle y Miguel Katrib, de la Uni-versidad de La Habana, nos presen-

ta los métodos de extensión de C#3.0, sus ventajas, e incluso proponeañadidos a C# que ayuden a la exten-sibilidad de la programación.

Después de su más que exitosaserie de artículos “El Marco de tra-bajo de entidades de ADO.NETv3.5”, Unai Zorri l la y OctavioHernández comienzan ahora unanueva, titulada “Consulta de mode-los conceptuales con Entity SQL”.Esta serie tiene como objetivo expli-car los conceptos fundamentales deEntity SQL y el papel que éste jue-ga dentro de ADO.NET Entity Fra-mework.

Y de una serie que empieza a otraque termina: “Silverlight 2.0 Tool-kit. Controles, visualización de datosy mucho más” de Marino Posadas,que en esta miniserie de dos artícu-los ha hecho una revisión general delas novedades introducidas por elSilverlight Toolkit.

No quiero cerrar esta presenta-ción sin mencionar al joven Hora-cio Núñez, uno de nuestros autorescon más proyección. Horacio publi-ca su segundo artículo, “Implemen-tando wrappers con C++/CLI”, enel que presenta C++ Interop a tra-vés de un ejemplo en el que se desa-rrolla un componente que encapsu-la llamadas a la librería para repro-ducción de sonido del sistema ope-rativo, para posteriormente incluir-lo en una aplicación escrita en C#.

Esto es solo una muestra; porsupuesto, dentro hay aún muchomás. Espero que sea de su agrado.

Malos tiempos para la lírica

editorialDedicada a los profesionales de la plataforma .NET

Vol. III •Número 56 • Febrero 2009Precio: 6,50 €

EditorPaco Marín ([email protected])

Redactor jefeMarino Posadas([email protected])

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

Empresas colaboradoras

Alhambra-Eidos

Krasis

Plain Concepts

Raona

Solid Quality Mentors

Además colaboran en este númeroEladio Rincón, Horacio Núñez, Ibón Landa,Juan María Laó, Magda Teruel, Mario del Valle,Octavio Hernández y Unai Zorrilla.

Diseño y maquetaciónSilvia Gil (Letra Norte)

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

Edición, suscripciones y publicidad.netalia

c/ Robledal, 13528522 - Rivas Vaciamadrid (Madrid)

www.dotnetmania.com

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

ImprimeGráficas MARTE

ISSN1698-5451

Depósito LegalM-3.075-2004

dotNetManíadotNetManía

Paco Marín

Page 4: dotNetManía - sergiogonzalezc.files.wordpress.com · Nueva herramienta de monitorización en SQL Server 2008 38-40 SQL Server 2008 incorpora una nueva herramienta que será la base

sumario 56Entrevista a Jason Zander y Tony Goodhew 08-12

En el marco del Tech-Ed 2008, tuvimos la oportunidad de entrevistar a Jason Zander, GeneralManager de Visual Studio en la Developer Division, y a Tony Goodhew, Product Planner. Conellos pudimos hablar acerca de las novedades recientemente presentadas durante PDC y Tech-Ed,como son Visual Studio 2010, .NET 4.0, etc.

Consulta de modelos conceptuales con Entity SQL (1) 14-20Este artículo es el primero de una serie destinada a presentar los conceptos fundamentales de EntitySQL, el lenguaje de consulta de modelos conceptuales incorporado a ADO.NET EntityFramework, describir el papel que dicho lenguaje juega dentro de este novedoso marco de trabajo, ymostrar cómo podemos aprovechar las posibilidades que nos ofrece.

Silverlight 2.0 Toolkit. Controles, visualización de datos y mucho más (y II) 22-25En el pasado número de dotNetManía, iniciamos una revisión general de los controles introducidospor el Silverlight Toolkit December 2008, disponible para su descarga en CodePlex. Vamos aconcluir aquí esta revisión presentando otros elementos programables que introduce este conjunto deherramientas: los gráficos empresariales y los temas.

Los métodos de extensión ¿Son una buena cosa? 26-33Este artículo presenta los métodos de extensión de C# 3.0 (también disponibles en Visual Basic 9.0)y describe las múltiples ventajas que este reciente recurso lingüístico aporta. Más adelante, presentapropuestas de posibles adiciones al lenguaje C# que contribuirían a promover aún más una de lasprincipales ventajas que aportan los métodos de extensión: la extensibilidad de la programación.

Implementando wrappers con C++/CLI 34-37En este artículo se presenta C++ Interop (también conocido como IJW - It Just Works), uno de losprincipales recursos para interactuar con código nativo que ofrece el lenguaje C++/CLI. Comoejemplo, se desarrolla un componente que encapsula llamadas a la librería para reproducción desonido del sistema operativo, para posteriormente incluirlo en una aplicación escrita en C#.

SQL Server Performance Studio. Nueva herramienta de monitorización en SQL Server 2008 38-40

SQL Server 2008 incorpora una nueva herramienta que será la base de monitorización paramúltiples servidores: SQL Server Performance Studio. La herramienta se basa en una serie decolectores de datos (data collectors) programables, que capturan información de monitorización.Posteriormente, y con la frecuencia que desee el administrador, esa información se consolida en unrepositorio (datawarehouse) para su posterior análisis.

WCF. Configuraciones e instaladores 42-45El despliegue de los servicios y clientes WCF en diferentes entornos (desarrollo, preproducción,producción) es una tarea propensa a errores en la que normalmente se hace necesario "tocar"manualmente los archivos de configuración. En este artículo se presenta una propuesta parasimplificar el despliegue de nuestros servidores y clientes WCF mediante proyectos de instalación quesolicitan la dirección de los servicios y actualizan automáticamente estos archivos.

Pruebas unitarias. Un enfoque práctico 46-50Mucho se ha hablado sobre las características que deben cumplir las pruebas unitarias y sobre losbeneficios que nos aporta su uso. Por este motivo, en este artículo intentaremos dar un paso más yprofundizar en el mundo de las pruebas unitarias, intentando aportar un enfoque práctico, centradoen explicar algunos de los recursos que tenemos actualmente a nuestra disposición.

dnm.todotnet.qa 52-54Trucos de WCF

dnm.biblioteca.net 56Pro Silverlight 2 in C# 2.0Data Driven Services with Silverlight 2

dnm.comunidad.net 57SUGES. SharePoint User Group España

dnm.desvan 58

Page 5: dotNetManía - sergiogonzalezc.files.wordpress.com · Nueva herramienta de monitorización en SQL Server 2008 38-40 SQL Server 2008 incorpora una nueva herramienta que será la base
Page 6: dotNetManía - sergiogonzalezc.files.wordpress.com · Nueva herramienta de monitorización en SQL Server 2008 38-40 SQL Server 2008 incorpora una nueva herramienta que será la base

El pasado día 7 deenero, durante el dis-curso de apertura delConsumer Electro-nics Show (CES)2009 en Las Vegas,Steve Ballmer, CEOde Microsoft, anuncióla disponibilidad de laBeta 1 del sistema

operativo Windows 7, así como de la más reciente versión deWindows Live, una suite de servicios de comunicación per-sonal y aplicaciones para Windows. “Estoy muy entusiasma-do de presentar la versión beta de Windows 7, que está diseña-da para proporcionar simplicidad y confiabilidad. Windows7 y Windows Live son parte de una increíble cadena de pro-ductos de tecnología para el consumidor que están facilitan-do más que nunca el que la gente se comunique, comparta ylogre hacer mucho más”, dijo Ballmer. La versión beta deWindows 7 ya puede ser descargada tanto por los suscripto-res de MSDN, TechBeta y TechNet como por el público engeneral, desde la página http://www.microsoft.com/windows7.

Microsoft también anunció la disponibilidad global deWindows Live, una suite gratuita de aplicaciones de comuni-cación y participación para Windows. Windows Live hacemás fácil que nunca que las personas se comuniquen, com-partan y mantengan sus vidas sincronizadas en línea, en unsolo lugar y con un único login. Los nuevos y mejorados ser-vicios de Windows Live, entre los que se incluyen WindowsLive Messenger, Windows Live Mail y Windows Live Pho-to Gallery, están diseñados para trabajar con más de 50 de losservicios de Internet más populares. En relación con Win-dows Live, Ballmer también anunció nuevas alianzas con Dell,que instalará de serie a nivel global Windows Live Essentialsy Live Search en los ordenadores destinados a consumidoresy pequeñas empresas; Facebook, cuyos usuarios podrán ele-gir compartir el contenido que publiquen en Facebook (inclu-yendo fotos) directamente a través de Windows Live; Veri-zon Wireless, cuyos suscriptores en Estados Unidos podránusar Live Search para realizar búsquedas en Internet, encon-trar tonos de llamadas, juegos, fondos de pantalla y otros pro-ductos y servicios en línea para teléfonos móviles.

En combinación con Internet Explorer 8, cuyo lanza-miento ya está próximo, Windows Live agiliza y simplificala realización de las tareas que hacen más frecuentemente laspersonas en línea (buscar, compartir y navegar). WindowsLive puede ser descargado desde http://www.windows

live.com/explore o automáticamente mediante MicrosoftUpdate para clientes existentes.

Características principales de Windows 7

En el marco del evento, Microsoft demostró nuevas carac-terísticas y mejoras importantes que ofrecerá Windows 7para satisfacer las necesidades de los consumidores, como lassiguientes:• Funciona de la manera que los usuarios quieren. Microsoft ha

prestado especial atención al rendimiento, confiabilidad,seguridad, compatibilidad y duración de la batería. El nue-vo sistema proporciona una gran experiencia, que permi-tirá a sus usuarios pasar más tiempo haciendo las cosas quequieren hacer, sin que el sistema operativo se interponga.

• Hace los trabajos de todos los días más rápidos y fáciles. El diseñointuitivo y racionalizado de Windows 7 simplifica la eje-cución de las tareas que realizan a diario las personas ensus PC. Las mejoras en el escritorio hacen más fácil el usoy proporcionan acceso inmediato a las aplicaciones y archi-vos que se utilizan más frecuentemente, mediante nuevasfunciones como listas de saltos (jumplists), presentacionespreliminares (previews) y una barra de tareas mejorada. Unanueva característica, Home Group, facilita que los consu-midores conecten múltiples ordenadores para compartirimpresoras, tener acceso a archivos, música, fotos y víde-os. Device Stage es una nueva interfaz de comunicaciónque permite conectar y administrar fácilmente varios dis-positivos para realizar tareas comunes. Y la nueva tecno-logía multi-touch de Windows 7 permitirá a los usuariosque dispongan de monitores táctiles interactuar con la pan-talla de sus PC de una manera más intuitiva, utilizandomúltiples dedos simultáneamente.

• Ofrece una mejor experiencia de entretenimiento. Los con-sumidores tienen hoy en día más acceso a medios decomunicación digital, y cada vez utilizan más sus PCcomo centro de su experiencia electrónica. La funciónPlay To de Windows 7 permite reproducir fácilmentemúsica, vídeo y fotos en los ordenadores y dispositivosde una red doméstica. La incorporación en WindowsMedia Player y Windows Media Center de más forma-tos de medios permitirá a las personas usar sus PC parareproducir más contenidos y sincronizarlos con un gru-po más amplio de dispositivos. Windows Media Center,con un sintonizador de canales de televisión y una inter-faz de usuario mejorada, hará la grabación de programasde televisión fácil y gratuita.

dotN

etM

anía

<<

6

noticiasnoticias

noticias

noticias

noticias

Steve Ballmer anuncia disponibilidad deWindows 7 Beta y Windows LiveMicrosoft la describe como “la versión más rápida y fácil de usar de Windows”

Page 7: dotNetManía - sergiogonzalezc.files.wordpress.com · Nueva herramienta de monitorización en SQL Server 2008 38-40 SQL Server 2008 incorpora una nueva herramienta que será la base

dotN

etM

anía

<<

7

dnm.directo.noticias<<

El pasado mes de enero se publicó laversión Beta de DB Schema Editor, uneditor de diagramas de bases de datosRIA, basado en tecnología Silverlight.Sus características principales son:

• No hay necesidad de instalar ningúnsoftware en máquina cliente.

• La aplicación está disponible para lasplataformas Windows y Mac.

• La herramienta incorpora carac-terísticas de aplicaciones de escri-torio, como son drag & drop, zoo-ming, etc.

• Permite compartir diagramas entrediferentes usuarios.

• Genera scripts SQL para los motores debases de datos SQL Server, Oracle yMy SQL (en breve se incorporarásoporte para PostGreSQL y SQLite).

La aplicación se encuentra disponi-ble de forma gratuita en la dirección:http://www.dbschemaeditor.com.

DB Schema Editor

Publicada Windows 7 Developer GuideDesde hace unos días, está disponibleen Code Gallery la versión 1.2 de Win-dows 7 Developer Guide, que des-cribe las posibilidades que tendrán a sudisposición los desarrolladores que cre-en las aplicaciones y servicios de próxi-ma generación para esta plataforma. Eldocumento está redactado en inglés ypuede ser descargado desdehttp://code.msdn.microsoft.com/Win7DeveloperGuide.

Beta de Windows 7 SDK disponible

Conjuntamente con la Beta de Win-dows 7, que ha acaparado casi todo elprotagonismo, Microsoft ha puesto adisposición de los desarrolladores unaversión Beta del SDK de Windows7 y .NET Framework 3.5 SP1, dis-ponible en http://www.microsoft.com/downloads/details.aspx?familyid=a91dc12a-fc94-4027-b67e-46bab7c5226c.

La Beta del SDK de Windowspara Windows 7 y .NET Frame-work 3.5 SP1 suministra la docu-mentación, ejemplos de código,ficheros de cabecera, librerías yherramientas (incluyendo los com-piladores de C++) que los desarro-lladores necesitan para crear apli-caciones que se ejecuten sobre Win-dows 7 Beta y .NET Framework 3.5SP1. Este SDK es compatible conVisual Studio 2008 SP1, incluyen-do las ediciones Express.

Microsoft acaba de publicar una serie dewhitepapers que permitirán a los desarro-lladores comprender mejor los Microsoft.NET Services, uno de los componentesclave de la plataforma Windows Azure.Estos documentos, disponibles enhttp://www.microsoft.com/downloads/details.aspx?FamilyID=5057e2b3-c8e5-4b26-a601-ff9621589ce3, son los siguientes:

• An Introduction to Microsoft®.NET Services for Developers. Estedocumento básico introduce los Micro-soft .NET Services, los bloques deconstrucción de los que se componeny cómo interactúan entre sí.

• A Developer’s Guide to the Micro-soft® .NET Access Control Service.Este documento muestra a los desarro-lladores cómo utilizar el modelo de iden-tidad de estos servicios y específicamente

Microsoft .NET Access Control Servi-ce, uno de los servicios de la familia, quepermite implementar sign-on unificado,identidad federada y acceso basado enroles a aplicaciones y servicios Web.

• A Developer’s Guide to the Micro-soft® .NET Service Bus. Este docu-mento enseña a los desarrolladores cómoutilizar el Bus de Servicios .NET, otrode los servicios de la familia, que ofreceuna infraestructura de mensajes seguray basada en estándares para conectar apli-caciones a través de Internet.

• A Developer’s Guide to the Micro-soft® .NET Workflow Service. Estedocumento suministra detalles acercade Microsoft .NET Workflow Service,su relación con Windows WorkflowFoundation, y lo que los desarrollado-res deben saber antes de comenzar acrear workflows para "la nube".

Nueva documentación sobre Microsoft .NET Services

Hace unos días, el equipo de WindowsAzure anunció la disponibilidad de ver-siones actualizadas del SDK de Win-dows Azure y de las Visual Studio Toolsfor Azure (en ambos casos, January 2009CTP). Estas nuevas CTP ofrecen:• Mejoras en la integración con Visual

Studio.• Mejoras del rendimiento en escena-

rios de ejecución y depuración.• Mejoras en los ejemplos sobre alma-

cenamiento cliente y proveedoresASP.NET.

• Se ha añadido soporte para la depu-ración Silverlight en un rol Web.

• Se han solucionado diversos bugs y pro-blemas de rendimiento reportados.

Para descargar estas herramientas,visite:• Descarga de Windows Azure SDK

January 2009 CTP: https://www.micro-soft.com/downloads/details.aspx?Famil-y I D = 8 0 e 3 e a b f - 0 5 0 7 - 4 5 6 0 - a e b 6 -d31e9a70a0a6.

• Descarga de Windows Azure Toolsfor Visual Studio January 2009 CTP:http://www.microsoft.com/downloads/details.aspx?FamilyID=8e90b639-1ef0-4e21-bb73-fc22662911bc.

Actualizados SDK y Visual Studio Tools para Azure

Page 8: dotNetManía - sergiogonzalezc.files.wordpress.com · Nueva herramienta de monitorización en SQL Server 2008 38-40 SQL Server 2008 incorpora una nueva herramienta que será la base

entrevista

Magda Terueles Team Leader de

Raona. Magda esMCPD Windows

Developer.http://www.magda.es.

Luis Fraile es MVP deTeam System y cola-bora activamente enMAD.NUG (Grupode usuarios de .NETde Madrid). Actual-mente es director

técnico en Multido-mo Networks. Pue-

de con sul tar sublog en

www.lfraile.net.

General Manager de Visual Studio y Product Planner en Microsoft Corp. respectivamente

entrevista a

Jason Zander y Tony Goodhew

En el marco del Tech-Ed 2008, tuvi-mos la oportunidad de entrevistara Jason Zander, General Manager deVisual Studio en la Developer Divi-sion, y a Tony Goodhew, ProductPlanner. Con ellos pudimos hablaracerca de las novedades reciente-mente presentadas durante PDC yTech-Ed, como son Visual Studio2010, .NET 4.0, etc.

Magda Teruel y Luis Fraile

La primera pregunta, obviamente, es una peque-ña introducción acerca de vuestro rol en Micro-soft, y de vuestra experiencia previa.

Jason Zander: Yo soy General Manager deVisual Studio, lo que incluye Visual Studio Profes-sional y Visual Studio Team System (VSTS). Entréen Microsoft en 1992, y anteriormente trabajabaen IBM. En Microsoft comencé dedicándome aldesarrollo de ODBC, y posteriormente fui una delas personas que empezó a trabajar en el CLR de.NET; fundamentalmente, siempre he estado rela-cionado con la ingeniería del software. Me hice res-ponsable del equipo de Visual Studio hace alrede-dor de un año.

Page 9: dotNetManía - sergiogonzalezc.files.wordpress.com · Nueva herramienta de monitorización en SQL Server 2008 38-40 SQL Server 2008 incorpora una nueva herramienta que será la base

Tony Goodhew: Yo trabajo comoProduct Planner en el equipo de VisualStudio, en las oficinas de Redmond(Seattle), y soy responsable de quécaracterísticas se incluyen en VisualStudio. También soy responsable de lainvestigación acerca de la satisfacciónde los clientes, quiénes son los clien-tes y cómo usan el producto. Previa-mente he trabajado en compañíascomo AT&T e IBM.Este año, durante PDC y Tech-Ed,hemos visto anunciadas muchasnovedades, como Visual Studio2010, .NET Framework 4.0, etc. Esde suponer que estáis muy emocio-nados con todos estos anuncios,pero, ¿podríais decirnos en cuál detodas estas novedades pondríais másénfasis?

Jason: Una de las aplicaciones en laque más hemos trabajado a lo largo deestos últimos dos años es Visual StudioTeam System 2010. Con las nuevas fun-cionalidades que hemos añadido al pro-ducto, realmente estamos provocandouna gran reducción en el tiempo quepasa desde que se descubren los defec-tos en las aplicaciones hasta que seresuelven, acercando mucho más eldesarrollo y las pruebas. Buena parte deestas características las mostramosdurante nuestra keynote del Tech-Ed,como la grabación en vídeo de las prue-bas, la grabación del histórico de depu-ración y otras. Estos ejemplos dan laidea de cómo todo está diseñado parapoder decir: de acuerdo, hemos encon-trado un fallo, y ahora vamos a arre-glarlo, eliminando el problema de noser capaces de reproducirlo. Siempreque hablamos con los clientes acerca deesto recibimos un feedback muy positi-vo. Otra área en la que hemos realiza-do una gran inversión es en el núcleodel propio entorno de desarrollo, elIDE. Los desarrolladores pasan lamayor parte de su tiempo con esteentorno, codificando, depurando ocompilando, y queremos que esa expe-riencia sea la mejor posible, facilitandoa los desarrolladores su trabajo. Porsupuesto, también se ha hecho mucho

trabajo en otras áreas, ya que estamoshablando de un producto muy grande,y hay muchas novedades y mejoras enáreas como lenguajes, librerías, dispo-sitivos móviles, Silverlight, etc.Una de las novedades anunciadas es.NET Framework 4.0. En muchasocasiones, cuando hablamos conclientes en eventos, etc. la gente sequeja de la “velocidad” con queMicrosoft saca nuevas versiones delFramework y de las herramientas,creando la necesidad de adoptar estasnuevas versiones y necesitando haceruna nueva inversión para la adapta-ción. ¿Qué podéis decir a la gente quese encuentra en esa situación?

Jason: Respecto a esto, recibimosdos tipos de feedback distintos. El pri-mero proviene de gente que realmen-te nos pide que continuemos con lasinnovaciones, ya que este tipo de indus-tria cambia muy rápidamente. Por elotro lado, desde el mundo de las empre-sas se nos pide que demos algún tipo deroadmap, para que ellos puedan tener lainformación para migrar y actualizarsus entornos. Por todo esto, cada dosaños aproximadamente liberamos nue-vas versiones. Realmente la última ver-sión del CLR es la 2.0, ya que comosabéis los frameworks 3.0 y 3.5 no sonrealmente más que librerías construi-das sobre .NET 2.0. Lo interesante dela versión 4.0 es que es una nueva ver-sión del CLR; si bien una de las carac-

terísticas de .NET es la de permitir laejecución side by side de distintas ver-siones de .NET Framework, lo que per-mite desplegar el .NET 4.0 y quesimultáneamente las aplicaciones ya ins-taladas se sigan ejecutando sobre .NET2.0. Una de las novedades importantesde esta nueva versión del CLR, además,es que será la primera vez que se pue-da ejecutar dos versiones distintas de.NET Framework dentro de un mismoproceso. Por ejemplo, podríamos tenerinstalados un add-in de Office que uti-lice la versión 2.0 del CLR y otro queutilice la 4.0; ambos se ejecutarían bajoel mismo proceso.Respecto a esto, otro comentario delas empresas suele estar relaciona-do con las herramientas de desarro-llo, y la necesidad de invertir cons-tantemente en nuevas herramientaspara estar actualizados con la últimaversión cada dos años.

Jason: Para Visual Studio 2010,hemos realizado una fuerte inversiónen el sistema de multi-targeting, con loque se pueden seguir realizando pro-yectos dirigidos a versiones anterioresde los frameworks, así como en la com-patibilidad con las versiones anteriores.Además, en el caso de Team Founda-tion Server (TFS), todos los datos yaexistentes de las versiones 2005 y 2008se mantendrán al actualizar a la nuevaversión. Un posible ejemplo de lo quedigo sobre la compatibilidad es la decla-

dotN

etM

anía

<<

9

dnm.directo.entrevista<<

Una de las novedades importantes es que serála primera vez que se pueda ejecutar dos versiones distintas de .NET Framework

dentro de un mismo proceso

Page 10: dotNetManía - sergiogonzalezc.files.wordpress.com · Nueva herramienta de monitorización en SQL Server 2008 38-40 SQL Server 2008 incorpora una nueva herramienta que será la base

dotN

etM

anía

<<

10

dnm.directo.entrevista<<

ración de las propiedades: al indicar en el tipo de pro-yecto la versión de .NET que se usará para compilar,el sistema sabe cómo hacer la declaración de las pro-piedades, y si ha de usar la nueva sintaxis reducida dedeclaración o la sintaxis antigua completa.Otra de las novedades que se han anunciado enel PDC, y de las que se viene hablando desde elMIX 07, es el DLR e implementaciones de len-guajes como IronPython, que tradicionalmenteestán muy arraigados en las comunidades OpenSource. ¿Cómo estáis viendo la introducción deestas nuevas implementaciones en estas comuni-dades Open Source?

Jason: Actualmente llevo relacionado con IronPyt-hon desde hace tres años, y en mi equipo en Micro-soft probablemente tengamos un mayor número deproyectos Open Source que cualquier otro departa-mento. Estamos realizando grandes avances aquí. Elprimero fue el programa de licenciamiento OpenSource de IronPython, que después extendimos alpropio DLR, y también disponemos del licencia-miento Ms-PL, que es un tipo de licencia compati-ble con Open Source. Con Ruby hemos ido un pasomás allá, desarrollando IronRuby, que aporta nuevasposibilidades a quienes utilizan ese lenguaje. Con todoesto, hemos conseguido dar acceso a esas comunida-des de desarrolladores a todo el sistema de .NET yal entorno de Visual Studio. Otra novedad en estesentido es la inclusión de JQuery en el entorno deVisual Studio 2010, permitiendo así el uso de estapotente librería de JavaScript. Volviendo a Visual Studio Team System, ¿cómoveis desde Microsoft la adopción de estas herra-

mientas? ¿Están los equipos adoptando realmen-te los procesos y metodologías, o simplemente seestán usando las herramientas como simples ges-tores de código fuente, repositorios de tareas,etc., desaprovechando todo el potencial de equi-po que aporta Team System a las metodologías?

Jason: Realmente aquí estamos tratando dos pun-tos. Uno es que, desde Microsoft, estamos intentan-do crear el entorno, con las herramientas, que real-mente aporten valor a la colaboración en los equipos;tanto en aquellos equipos y empresas que utilizanmetodologías más formales, como en los que se basanen metodologías ágiles como Scrum, etc. De todosmodos, reconocemos que nunca lograremos que todose use al 100% de su capacidad; lo que pretendemoses que las empresas y los equipos utilicen y adaptenVSTS del modo que cobre sentido para ellos. Inter-namente, muchos de los equipos de Microsoft usanTFS; por ejemplo, los equipos de Office, Windowsy de la Developer Division. En estos equipos muchasveces se empieza utilizando únicamente el seguimientode work items o el control de código fuente en el tra-bajo diario, para después ir incorporando nuevascaracterísticas. Otro ejemplo de esto es la nueva fun-cionalidad de gated check-in, que es un gran avance, yque nació de cómo internamente gestionábamos nues-tros sistemas de check-in para prevenir la rotura de lascompilaciones y las pruebas en equipos como el delCLR, que son realmente grandes y necesitan muchasconfiguraciones de compilación y pruebas, haciendoestos procesos más complejos.Acerca de Team System, una de las nuevas caracte-rísticas es Camano, la herramienta de pruebas, quesupone gran avance en las herramientas para prue-bas funcionales y de interfaz de usuario, permitiendointegrar mucho más el desarrollo y las pruebas.¿Podéis hablarnos algo más de Camano, y de suposicionamiento con respecto a las herramientas depruebas ya existentes en el mercado?

Jason: La gestión de los casos de pruebas, el sercapaces de hacer el seguimiento del software que esta-mos construyendo mediante la integración de los casosde pruebas, la grabación de los scripts de reproduc-ción de las pruebas, los datos de depuración históri-ca, etc. son posibilidades que realmente simplificanla vida de los equipos, y en este sentido, Camano vaa hacer más sencillo el trabajo de los equipos y la inte-gración del desarrollo y las pruebas.Acerca de la gestión de los casos de pruebas, otrogran movimiento que se está produciendo es lavirtualización. Durante el keynote de Tech-Ed

Jason Zander

Page 11: dotNetManía - sergiogonzalezc.files.wordpress.com · Nueva herramienta de monitorización en SQL Server 2008 38-40 SQL Server 2008 incorpora una nueva herramienta que será la base
Page 12: dotNetManía - sergiogonzalezc.files.wordpress.com · Nueva herramienta de monitorización en SQL Server 2008 38-40 SQL Server 2008 incorpora una nueva herramienta que será la base

dotN

etM

anía

<<

12

dnm.directo.entrevista<<

vimos una demostración de Lab Management, queestá orientado a facilitar y acelerar el ciclo entredesarrollo, pruebas y despliegue mediante el usode la virtualización para los casos de prueba.

Jason: Tony es un experto en cuanto a Lab Mana-gement y nos puede aportar en este sentido su visiónrespecto a esta funcionalidad.

Tony: Actualmente, la creación y el despliegue delos entornos de pruebas se realiza mediante gran can-tidad de scripts, y además tocando configuracionesmanualmente, etc. Con esta nueva herramienta, todoesto se facilita mediante el despliegue de máquinas vir-tuales para la ejecución de las pruebas automatizadascon muy poco esfuerzo.

También hemos visto anunciado Azure, y cómoen un futuro se podrán desplegar directamenteaplicaciones mediante el uso de máquinas vir-tuales. Quizás es hablar muy a futuro, pero, ¿vere-mos algún tipo de integración entre el desplie-gue en Azure y el despliegue y pruebas median-te Lab Management?

(risas) Tony: Todo es posible, por supuesto. Es algode lo que aún es pronto para hablar, y que no hemos dis-cutido a fondo. Por ahora, lo que vamos a hacer es ponera disposición de los desarrolladores esta herramientapara facilitar los despliegues de los entornos de pruebas. Ahora mismo estamos oyendo hablar muchodel software en la nube y esto presenta nuevosretos, tanto para los desarrolladores, como paralas propias herramientas. ¿Qué tenemos denuevo en Visual Studio 2010 para afrontar estosnuevos retos?

Jason: En Visual Studio 2010 tendremos nuevasplantillas de proyecto que nos faciliten el desarrollode proyectos de estos tipos. Por supuesto, nuestrameta es conseguir que, independientemente del tipode proyecto (ya sea de SharePoint, o de software parala nube), se consiga tener una buena experiencia dedesarrollo con las herramientas de Visual Studio.¿Qué podéis decirnos acerca del futuro de VisualStudio más allá de 2010? Por supuesto, estamosseguros de que hay cosas que aún no nos podéiscontar (risas), pero ¿cuáles son los siguientesretos que se plantean para el producto?

Tony: Bueno, quizá no sea posible, pero nuestrameta en el futuro es que cada PC tenga una copia deVisual Studio, incluso los de no-desarrolladores (risas).Ya se lo he dicho incluso a mi madre, que debería com-prarlo (risas). Desde que empezamos en 1991 con losentornos de desarrollo estilo RAD (Rapid ApplicationDevelopment) con Visual Basic, hemos visto cómo hancambiado las tendencias en el desarrollo. Yo creo queen el futuro lo que vamos a ver es un mayor énfasis enel desarrollo de aplicaciones con procesamiento para-lelo, que permitan extraer toda la potencia de las nue-vas máquinas con varios núcleos, así como todos losretos que comentábamos acerca del software en la nube.Nuestra idea será siempre facilitar a los desarrollado-res su trabajo en los nuevos campos que aparezcan.

Jason: Por supuesto, para futuras versiones, que-remos mantener la compatibilidad con todas las apli-caciones y todo el código que ya esté construido, asícomo mantener y evolucionar los recrusos de desa-rrollo para tecnologías ya existentes como Office. Ypor supuesto, asumir los nuevos retos como el softwa-re en la nube, y añadir nuevas capacidades al entornode desarrollo.Para terminar, ¿cuál sería el camino que reco-mendaríais a los clientes con respecto a la adop-ción de Visual Studio 2010 en el futuro?.

Jason: En este sentido, la mejor opción es poner-se ya en marcha con Visual Studio Team System 2008SP1, y comenzar a utilizar todas las características de2008, de modo que en el futuro todos estos datos per-manezcan al migrar a 2010, y podamos incorporar deun modo más sencillo las novedades que recibiremoscon Visual Studio 2010.

Tony: También hay que decir que habrá un cami-no de actualización de licencias desde Visual Studio2008 a 2010 que facilite y haga más económica paralos clientes esa migración. Además, programas comoMSDN continuarán facilitando la obtención de laslicencias para los equipos de desarrollo.

Tony Goodhew

Page 13: dotNetManía - sergiogonzalezc.files.wordpress.com · Nueva herramienta de monitorización en SQL Server 2008 38-40 SQL Server 2008 incorpora una nueva herramienta que será la base
Page 14: dotNetManía - sergiogonzalezc.files.wordpress.com · Nueva herramienta de monitorización en SQL Server 2008 38-40 SQL Server 2008 incorpora una nueva herramienta que será la base

El Marco de entidades de ADO.NET(ADO.NET Entity Framework) es un frame-work de desarrollo para la plataforma .NET quepermite superponer varias capas de abstracciónsobre los almacenes relacionales, con el fin de hacerposible una programación más conceptual (basa-da en los conceptos del dominio con el que se tra-baja) y de reducir a una mínima expresión el desa-juste de impedancias causado por la diferenciaentre los modelos de programación relacional yorientado a objetos. Sobre el Marco de entidadeshemos venido hablando en pasadas ediciones dedotNetManía [1]; una presentación mucho máscompleta puede encontrarse en nuestro libro dedi-cado al tema [2].

La arquitectura básica del Marco de entidadesse presenta en la figura 1. En pocas palabras, porencima del modelo de proveedores tradicional sesuperpone un nuevo proveedor de ADO.NET, elProveedor de entidades, más conocido comoEntityClient. Entity SQL es precisamente el len-guaje de entrada para el Proveedor de entidades;se trata de un lenguaje de consulta de modelos deentidades, independiente de cualquier base dedatos específica y que el proveedor se encarga pre-cisamente de transformar en sentencias aceptablespara el almacén relacional concreto sobre el queel modelo se ha construido. Si bien este nivel de

programación hace factible, por una parte, la posi-bilidad de consultar los modelos conceptuales, ypor la otra, la independencia del motor de basesde datos subyacente, de por sí no garantiza la solu-ción al problema del desajuste de impedancias: larecuperación de los resultados que nos devuelveun EntityDataReader es tan tediosa y poco fuerte-mente tipada como la de un DataReader tradicio-nal de de ADO.NET. Para resolver esta dificul-tad, por encima del Proveedor de entidades se ofre-cen una capa de Servicios de objetos (ObjectServices) y un proveedor de LINQ para modelosconceptuales (LINQ to Entities), que nos per-miten obtener los resultados de las consultas enforma de objetos y colecciones de objetos fuerte-mente tipados. Por supuesto, ambas API tienenen todo momento a su alcance toda la informa-ción sobre el modelo a través de una capa trans-versal a la arquitectura dedicada a la generaciónde metadatos a partir del modelo.

Para facilitar la comparación, los listados 1 y 2presentan ejemplos concretos de cómo recuperarun mismo conjunto de resultados utilizando las dife-rentes posibilidades a nuestro alcance. El modeloconceptual que se utiliza está basado en la base dedatos FUTBOL2006 que hemos venido usando tradi-cionalmente en nuestros ejemplos [2, 3]. Observela similitud entre el código que utiliza EntityClient

Consulta de modelos conceptualescon Entity SQL (1)

plataforma.net

Este artículo es el primero de una serie destinada a presentar los con-ceptos fundamentales de Entity SQL, el lenguaje de consulta de mode-los conceptuales incorporado a ADO.NET Entity Framework, descri-bir el papel que dicho lenguaje juega dentro de este novedoso marcode trabajo, y mostrar cómo podemos aprovechar las posibilidades quenos ofrece.

Unai Zorrilla, Octavio Hernández

Unai Zorrilla esDevelopment Team

Leader de Plain Concepts.MVP desde 2004,

colabora activamente conMicrosoft en eventos de

arquitectura y desarrollo, así como en

giras de productos. Autorde los libros “Modelandoprocesos de negocio conWorkflow Foundation” y

“ADO.NET EntityFramework: Aplicaciones y

servicios centrados endatos”.

Octavio Hernández esMVP de C# desde 2004,MCSD y MCT. Autor de

los libros “C# 3.0 yLINQ" y "ADO.NET

Entity Framework:Aplicaciones y servicios

centrados en datos" (conUnai Zorrilla y EEduardo

Quintás).

Page 15: dotNetManía - sergiogonzalezc.files.wordpress.com · Nueva herramienta de monitorización en SQL Server 2008 38-40 SQL Server 2008 incorpora una nueva herramienta que será la base

dotN

etM

anía

<<

15

dnm.plataforma.net<<

(listado 1) y el que se utiliza para recu-perar los resultados de una consultaSQL mediante un proveedor tradi-cional de ADO.NET (SqlClient,OracleClient, etc.). Observe tambiénque en la variante basada en ObjectServices (listado 2) se hace necesa-rio un poco de trabajo no tipado; estoocurrirá siempre que la sentencia deEntity SQL recupere algo que nosean entidades completas del mode-lo. La variante basada en LINQ, porotra parte, sí que permite saltar estabarrera, aunque impone ciertas limi-taciones a la construcción dinámicade las consultas.

La presencia del lenguaje EntitySQL ofrece al desarrollador unapotente capacidad de consulta diná-mica, que hace posible construir total-mente las consultas durante la ejecu-ción en lugar de formularlas estática-mente en tiempo de diseño1-2. Y laexistencia de Entity Client comocapa independiente ofrece mayoresposibilidades en este sentido. Si bienpueden implementarse consultasdinámicas con Object Services, lasimilitud del proceso de especifica-ción de las consultas con los que se

han venido usando tradicional-mente en ADO.NET podría hacera los programadores decantarse porutilizar este nivel de acceso a losdatos de los modelos. En lo que res-ta de este artículo mostraremoscómo ejecutar una consulta dinámi-ca de Entity SQL a través de estasdos capas y, sobre todo, cómo serecuperan los resultados en cadacaso.

Ejecución de consultasmediante EntityClientComo se puede apreciar en el lis-tado 1, la ejecución de un coman-do de Entity SQL a través deEntityClient mimetiza la mane-ra de actuar cuando trabajamoscon un proveedor “normal” deADO.NET. Las diferenciascomienzan a la hora de recuperarlos resultados. Si bien con los pro-veedores tradicionales lo que nosdevuelve el DbDataReader es siem-pre una secuencia de tuplas for-madas por elementos de tiposescalares3, al ejecutar una senten-

Figura 1. La arquitectura básica del Marco de entidades.

using System;using System.Configuration;using System.Data;using System.Data.EntityClient;

namespace DNM_ESQL1{class Program{static void Main(string[] args){// imprime nombre y posición de todos los // futbolistas de un país, ordenados alfabéticamentestring codPais = “FR”;

// usando Entity Clientusing (var con = new EntityConnection(ConfigurationManager.ConnectionStrings[“FUTBOL2006Entities”].ConnectionString))

{con.Open();using (var cmd = new EntityCommand(@”SELECT F.Nombre, F.Posicion FROM Futbol2006Entities.Futbolista A S FWHERE F.Pais.Codigo = @paisORDER BY F.Nombre”, con))

{cmd.Parameters.A ddWithValue(“pais”, codPais);using (EntityDataReader rdr = cmd.ExecuteReader(CommandBehavior.SequentialA ccess)

{Console.WriteLine(“*** Entity Client ***”);while (rdr.Read()){Console.WriteLine(“{0} ({1})”,

(string)rdr[0], (string)rdr[1]);

// usando la clase EntityDataReaderHelper // (listado 4), sería:// rdr.Visit(EntityDataReaderHelper.PrintRecord);

}}

}}Console.ReadLine();

}}

}

Listado 1. Consulta utilizando EntityClient

1 Observe que el tipo de dinamismo al que nos referimos aquí va más allá de la simple parametrización, de la que es un ejemplo el propio códigodel listado 2.

2 Por supuesto, en cualquier caso deberemos ser cuidadosos al construir las consultas para evitar ataques como la inyección de SQL, de la enprincipio que podríamos ser víctimas también al utilizar el Marco de Entidades.

3 Considerando las consultas que devuelven un único valor escalar (y que se pueden ejecutar también llamando al método ExecuteScalar) como uncaso extremo de ello.

Page 16: dotNetManía - sergiogonzalezc.files.wordpress.com · Nueva herramienta de monitorización en SQL Server 2008 38-40 SQL Server 2008 incorpora una nueva herramienta que será la base

dotN

etM

anía

<<

16

dnm.plataforma.net<<

cia de Entity SQL podremos obtenerun espectro mucho más amplio decosas; en particular, secuencias con ele-mentos que son nuevos lectores quedeben ser a su vez recorridos. Porejemplo, la consulta que se muestra enel listado 3, que hace uso de las pro-

piedades de navegación de EDM,devolverá una secuencia de tuplas (unapor cada Club) cuyo segundo camposerá a su vez una secuencia con losdatos de los futbolistas de ese club.

Como mostramos detalladamenteen [2], el recorrido del conjunto de

datos producido por un EntityDataRe-ader puede realizarse mediante un pro-cedimiento recursivo que visita losnodos del árbol resultante primero enprofundidad. En el listado 3 se pre-senta una implementación básica delalgoritmo para imprimir en la conso-la de manera indentada el resultado delrecorrido un EntityDataReader, y en lafigura 2 se muestra la salida que pro-duce la ejecución de nuestra consultade ejemplo. Como podrá notar el lec-tor, hemos creado un método de exten-sión [3] para la clase EntityDataReadercon el objetivo de permitir la defini-ción separada de las acciones concre-tas a realizar sobre los resultados de laconsulta.

using System;using System.Data;using System.Data.Common;using System.Data.Objects;using System.Linq;

namespace DNM_ESQL1{class Program{static void Main(string[] args){string codPais = “FR”;

using (var ctx = new FUTBOL2006Entities()){// usando Object Servicesvar q2 = ctx.CreateQuery<DbDataRecord>(@”SELECT F.Nombre, F.Posicion FROM Futbol2006Entities.Futbolista A S FWHERE F.Pais.Codigo = @paisORDER BY F.Nombre”,

new ObjectParameter[] { new ObjectParameter(“pais”, codPais)

});Console.WriteLine(“*** Object Services ***”);foreach (var f in q2)Console.WriteLine(“{0} ({1})”,(string)f[0], (string)f[1]);

// usando LINQ to Entitiesvar q3 = from f in ctx.Futbolista

where f.Pais.Codigo == codPaisorderby f.Nombreselect new { f.Nombre, f.Posicion };

Console.WriteLine(“*** LINQ to Entities ***”);foreach (var f in q3)Console.WriteLine(“{0} ({1})”, f.Nombre, f.Posicion);

}Console.ReadLine();

}}

}

SELECT C.Nombre, C.FutbolistaFROM Futbol2006Entities.Club A S CWHERE C.Ciudad = ‘MA DRID’

ORDER BY C.Nombre

Listado 2. Consultas con Object Services y LINQ to Entities

Listado 3. Consulta de Entity SQL deejemplo

El recorrido de los resultados de un

EntityDataReader se realiza mediante un

procedimiento recursivo"primero en profundidad”

Page 17: dotNetManía - sergiogonzalezc.files.wordpress.com · Nueva herramienta de monitorización en SQL Server 2008 38-40 SQL Server 2008 incorpora una nueva herramienta que será la base

dotN

etM

anía

<<

17

dnm.plataforma.net<<

using System;using System.Data;using System.Data.Common;using System.Data.EntityClient;using System.Data.Metadata.Edm;

namespace PlainConcepts.Utils{public static class EntityDataReaderHelper{public static void Visit(this EntityDataReader reader,A ction<IExtendedDataRecord, int> visitRecord)

{int count = 0;while (reader.Read()){visitRecord(reader, ++count);

}}

public static void PrintRecord(IExtendedDataRecord record, int n){_indent = 0;print(“(“ + n + “)”);printRecord(record);

}

private static void printRecord(IExtendedDataRecord record){indent();// Primero vemos el tipo del propio registroBuiltInTypeKind recType = record.DataRecordInfo.RecordType.EdmType.BuiltInTypeKind;

int fieldCount;if (recType == BuiltInTypeKind.RefType ||

recType == BuiltInTypeKind.PrimitiveType ||recType == BuiltInTypeKind.CollectionType)

{// En estos casos, el registro contiene un solo campofieldCount = 1;

}else{fieldCount = record.DataRecordInfo.FieldMetadata.Count;

}// Recorremos los camposfor (int i = 0; i < fieldCount; i++){string name = record.DataRecordInfo.FieldMetadata[i].FieldType.Name;

// Comprobación de nuloif (record.IsDBNull(i))printNull(name);

else

Page 18: dotNetManía - sergiogonzalezc.files.wordpress.com · Nueva herramienta de monitorización en SQL Server 2008 38-40 SQL Server 2008 incorpora una nueva herramienta que será la base

dotN

etM

anía

<<

18

dnm.plataforma.net<<

{BuiltInTypeKind fldType = recType;// Si el registro es de un tipo estructurado,// examinamos el campo en esa posiciónif (fldType == BuiltInTypeKind.EntityType ||

fldType == BuiltInTypeKind.ComplexType ||fldType == BuiltInTypeKind.RowType)

{fldType = record.DataRecordInfo.FieldMetadata[i].FieldType.TypeUsage.EdmType.BuiltInTypeKind;

}switch (fldType){case BuiltInTypeKind.CollectionType:// Las colecciones se ofrecen como lectores internosprintDbDataReader(name,record.GetData(i) as DbDataReader);

break;case BuiltInTypeKind.EntityType:case BuiltInTypeKind.ComplexType:case BuiltInTypeKind.RowType:// Llamada recursivaprint(name + “:”);indent();printRecord(record.GetDataRecord(i) as IExtendedDataRecord);unindent();break;

case BuiltInTypeKind.RefType:// Las referencias se ofrecen como instancias de EntityKeyprintEntityKey(record.GetValue(i) as EntityKey);break;

case BuiltInTypeKind.PrimitiveType:// Los tipos primitivos se ofrecen como simples objetosprintPrimitiveType(name, record.GetValue(i));break;

default:// No deberíamos caer aquí...throw new Exception(

“Unexpected field type: “ + fldType.ToString());}

}}unindent();

}

private static void printNull(string name){print(name + “: NULL”);

}

private static void printPrimitiveType(string name,object value)

{print(name + “: “ + value.ToString());

}

Page 19: dotNetManía - sergiogonzalezc.files.wordpress.com · Nueva herramienta de monitorización en SQL Server 2008 38-40 SQL Server 2008 incorpora una nueva herramienta que será la base

dotN

etM

anía

<<

19

dnm.plataforma.net<<

Ejecución de consultas mediante ObjectServicesEn cualquier caso, la ejecución de una consulta deEntity SQL mediante Object Services es preferi-ble siempre que se desee aprovechar una de las prin-cipales posibilidades que esta capa de software nosofrece: la materialización de los resultados en ins-tancias de clases del modelo. En el listado 5 semuestra la ejecución de la sentencia de Entity SQLdel listado 3 mediante Object Services. A conti-nuación haremos algunos comentarios relativos ala construcción de la consulta y la recuperación delos resultados.

Generación mediante métodos de construcción

Si bien podríamos construir la consulta diná-mica de Entity SQL a suministrar al método gené-rico DataContext.CreateQuery<T> a la usanza tradi-cional, esto es, concatenando cadenas de caracte-res, el tipo del resultado que devuelve este méto-do, ObjectQuery<T>, ofrece un conjunto de métodosque facilitan en algo ese proceso. Estos métodos(en el listado 5 hemos utilizado Where, OrderBy ySelect) se conocen como métodos de construc-ción de consultas (SQL builder methods) y no sedeben confundir con los operadores de consultaestándar homónimos de LINQ. Observe que en el

private static void printEntityKey(EntityKey key){print(“REF to “ + key.EntitySetName);indent();foreach (EntityKeyMember member in key.EntityKeyValues){print(member.Key + “=” + member.Value.ToString());

}unindent();

}

private static void printDbDataReader(string name, DbDataReader reader)

{print(name + “:”);int n = 0;while (reader.Read()){print(“(“ + n++ + “)”);printRecord(reader as IExtendedDataRecord);

}}

private static int _indent = 0;private static void indent() { _indent += 2; }private static void unindent() { if (_indent >= 2) _indent -= 2; }

private static void print(string text){string pfx = new string(‘ ‘, _indent);Console.WriteLine(pfx + text);

}}

}

Listado 4. Recorrido de un EntityDataReader para la impresión de los datos

Page 20: dotNetManía - sergiogonzalezc.files.wordpress.com · Nueva herramienta de monitorización en SQL Server 2008 38-40 SQL Server 2008 incorpora una nueva herramienta que será la base

dotN

etM

anía

<<

20

dnm.plataforma.net<<

listado 5 no hemos importado el espa-cio de nombres System.Linq, y portanto los operadores LINQ no apa-recerán en la ayuda Intellisense aso-

ciada a la consulta, como sí lo haríanen caso de que dicho espacio estuvie-ra en ámbito (¿por qué, estimado lec-tor?).

Recuperación de resultados

La respuesta a la pregunta anteriorconsiste en que ObjectQuery<T> imple-menta IQueryable<T>, y por lo tanto pue-de servir como fuente para los operado-res de consulta. De aquí se desprende cuáles en este caso la manera de recorrer elconjunto de resultados de las consultas:enumerándolo mediante un bucle fore-ach, como se muestra en el listado 5.Observe, además, cómo podemos con-vertir directamente la segunda compo-nente del resultado a IEnumerable<T> (enla práctica, lo que se crea internamentees una lista genérica) para, a su vez, reco-rrerla con un bucle foreach. En caso deque el “dinamismo” de la consulta lleguehasta el punto de que no conozcamosestáticamente los tipos de los campos delresultado, será necesario un poco de refle-xión para averiguarlos.

ConclusiónEn este artículo hemos introducidoEntity SQL, el lenguaje de consulta demodelos conceptuales que incorporael Marco de entidades de ADO.NET,y mostrado el papel que juega y las posi-bilidades que ofrece, en particular a lahora de implementar consultas diná-micas sobre nuestros modelos de enti-dades. En próximas entregas nos cen-traremos en presentar sus similitudes ydiferencias con Transact-SQL (u otrosdialectos propietarios de SQL), quedeben ser tenidas muy en cuenta a lahora de utilizarlo.

Figura 2. Salida parcial de la ejecución de la consulta de ejemplo

using System;using System.Collections.Generic;using System.Data;using System.Data.Common;using System.Data.Objects;

namespace DNM_ESQL1{class Program{static void Main(string[] args){using (var ctx = new FUTBOL2006Entities()){// 'it' ('eso') representa al origen de datos en los argumentos// de los métodos de construcción de consultasvar q2 = ctx.Club.Where(“it.Ciudad = @ciudad”,new ObjectParameter[] { new ObjectParameter(“ciudad”, “MA DRID”)

}).OrderBy(“it.Nombre”).Select(“it.Nombre, it.Futbolista”);

Console.WriteLine(“*** Object Services ***”);foreach (var f in q2){Console.WriteLine((string)f[0]);foreach (Futbolista fb in (IEnumerable<Futbolista>)f[1])Console.WriteLine(“ “ + fb.Nombre);

}}Console.ReadLine();

}}

}

Listado 5. Ejecución de la consulta de ejemplo mediante Object Services

Bibliografía

Zorrilla, U., Hernández, O.,“El Marco de Entidades deADO.NET 3.5” (I-VII), endotNetManía nº 44-50, ene-ro-julio de 2008.

Zorrilla, U., Hernández, O.,Quintás E., “ADO.NETEntity Framework: Aplicacio-nes y servicios centrados endatos”, Krasis Press, 2008.

Hernández, O., “C# 3.0 yLINQ”, Krasis Press, 2007.

[1]

[2]

[3]

Page 21: dotNetManía - sergiogonzalezc.files.wordpress.com · Nueva herramienta de monitorización en SQL Server 2008 38-40 SQL Server 2008 incorpora una nueva herramienta que será la base
Page 22: dotNetManía - sergiogonzalezc.files.wordpress.com · Nueva herramienta de monitorización en SQL Server 2008 38-40 SQL Server 2008 incorpora una nueva herramienta que será la base

El charting y los gráficos empresarialesEn la PDC 2008 se anunciaron novedades que com-plementarían a las ya presentes en el SDK de Sil-verlight 2.0, incluyendo la capacidad para inter-pretar conjuntos de datos como gráficos empresa-riales (o estadísticos). Esta funcionalidad se ha imple-mentado mediante un control que se representa enXAML a través de un elemento llamado <Chart>que, dependiendo de sus parámetros de configura-ción, asignables a través de atributos y/o otros ele-mentos contenidos, permite mostrar distintos tiposde gráficos de esta clase.

En concreto, están disponibles los gráficos debarras (BarSeries), de columnas (ColumnSeries),de tarta (PieSeries), lineales (LineSeries) y de dis-persión (ScatterSeries). Su funcionamiento es bas-tante intuitivo, y diversas pruebas realizadas reve-lan que el rendimiento en volúmenes de datos detipo medio es bastante aceptable.

En todos los casos la operativa es similar: se creauna interfaz de usuario que contenga un elemento<Chart> (donde se suele asignar el tamaño inicialdeseado del gráfico), y este elemento contiene unsub-elemento <Chart.Series>, cuyo contenido seráel que marque la diferencia respecto al modelo degráfico y el conjunto de datos a mostrar.

Cualquiera de las versiones operativas de estecontrol requiere, además de los típicos parámetrosiniciales de configuración, dos conjuntos de valo-

res específicos: los que se denominan valores depen-dientes y los independientes. Los primeros son losdatos numéricos en sí, que el control se encargaráde convertir en una representación gráfica adecua-da; los segundos, el valor conceptual (normalmen-te una cadena o una fecha, pero también puede serun número) que describe a qué corresponde cadauno de los datos numéricos. Desde el punto de vis-ta operativo, el control espera que ambos conjun-tos de valores le sean suministrados asignándolos asus atributos DependentValueBinding e Independent-ValueBinding.

Nuestra clase de negocioA efectos de mostrar con menos código el funcio-namiento de este tipo de gráficos y no mezclar estosconceptos con los propios del acceso a datos, en losejemplos hemos creado una clase de negocio queexpone de forma directa un conjunto de datosmediante un diccionario de datos (tipo clave-valoro KeyValuePair), que asigna un conjunto de valoresde visitas de una supuesto sitio Web a lo largo delos distintos días de la semana. La única diferenciaentre los conjuntos de datos en los distintos ejem-plos estriba en que, para los dos últimos controles,los datos dependientes no pueden ser de tipo cade-na, sino de tipo fecha o numérico. En nuestro caso,hemos utilizado fechas.

El código fuente significativo de esta clase es elsiguiente:

Silverlight 2.0 Toolkit Controles, visualización de datos y mucho más (I)

En el pasado número de dotNetManía, iniciamos una revisión generalde los controles introducidos por el Silverlight Toolkit December 2008,disponible para su descarga en CodePlex. Vamos a concluir aquí estarevisión presentando otros elementos programables que introduce esteconjunto de herramientas: los gráficos empresariales y los temas.

plataforma.netMarino Posadas

Marino Posadas es redac-tor jefe de ddotNetMania y

Software Arquitect deAlhambra-Eidos. Es MCP,

MCSD, MCAD, MCT yMVP en Visual C#.

Puede consultar su páginaWeb en

www.elavefenix.net

Page 23: dotNetManía - sergiogonzalezc.files.wordpress.com · Nueva herramienta de monitorización en SQL Server 2008 38-40 SQL Server 2008 incorpora una nueva herramienta que será la base

dotN

etM

anía

<<

23

dnm.plataforma.net<<

El resto es trivial: basta con diseñarel control en el código XAML y hacerla asignación del enlace a datos adecua-do. A continuación, presentamos el códi-go XAML correspondiente a cada unode los cinco tipos de gráficos; la apa-riencia de cada uno de ellos en el nave-gador se presenta en las figuras 1 a 5.

BarSeries (Gráficos en filas)

ColumnSeries (Gráficos en columnas)

PieSeries (Gráficos de tarta)

Figura 1. Gráficos en filas.

Figura 2. Gráficos en columnas.

public void CargarDatos(){

// El origen de datos es idéntico en todos los casos. // Solo se muestra el código que proporciona los datos // a los tipos gráficos “Tarta” y “Lineal”.// El proceso para el resto de casos es similar.

// Gráficos de tarta ((PieSeries)Grafico.Series[0]).ItemsSource =

new KeyValuePair<string, int>[] {new KeyValuePair<string,int> (“ Lunes “, 50), new KeyValuePair<string,int> (“ Martes “, 350), new KeyValuePair<string,int> (“ Miércoles “, 100), new KeyValuePair<string,int> (“ Jueves “, 420), new KeyValuePair<string,int> (“ Viernes “, 150), new KeyValuePair<string,int> (“ Sábado “, 650), new KeyValuePair<string,int> (“ Domingo “, 530)

};

// Gráficos lineales DateTime SemanaPasada = DateTime.Now.A ddDays(-7);((LineSeries)Grafico2.Series[0]).ItemsSource =

new KeyValuePair<DateTime, int>[] {new KeyValuePair<DateTime,int> (SemanaPasada, 13),new KeyValuePair<DateTime,int> (SemanaPasada.A ddDays(1), 10), new KeyValuePair<DateTime,int> (SemanaPasada.A ddDays(2), 25), new KeyValuePair<DateTime,int> (SemanaPasada.A ddDays(3), 30), new KeyValuePair<DateTime,int> (SemanaPasada.A ddDays(4), 10), new KeyValuePair<DateTime,int> (SemanaPasada.A ddDays(5), 30), new KeyValuePair<DateTime,int> (SemanaPasada.A ddDays(6), 25)

};}

<charting:Chart x:Name=”Grafico” LegendTitle=”A nalítica Web”Title=”Estadística de visitas” Width=”300” Height=”400” Margin=”10”>

<charting:Chart.Series><charting:BarSeries Title=”Visitas por semana”

IndependentValueBinding=”{Binding Path=Key}”DependentValueBinding=”{Binding Path=Value}”FontFamily=”Segoe UI” />

</charting:Chart.Series></charting:Chart>

<charting:Chart x:Name=”Grafico2”LegendTitle=”A nalítica Web”Title=”Estadística de accesos”Width=”400” Height=”300”Margin=”350, 10, 0, 0”><charting:Chart.Series><charting:ColumnSeriesTitle=”Total de A ccesos diarios”IndependentValueBinding=

”{Binding Path=Key}”DependentValueBinding=

”{Binding Path=Value}”FontFamily=”Segoe UI” />

</charting:Chart.Series></charting:Chart>

<charting:Chart x:Name=”Grafico”LegendTitle=”A nalítica Web”Title=”Gráficos de Tarta”Width=”350” Height=”400”Margin=”10”>

<charting:Chart.Series><charting:PieSeries

Title=”Visitas por semana”IndependentValueBinding=

”{Binding Path=Key}”DependentValueBinding=

”{Binding Path=Value}”FontFamily=”Segoe UI” />

</charting:Chart.Series></charting:Chart>

Page 24: dotNetManía - sergiogonzalezc.files.wordpress.com · Nueva herramienta de monitorización en SQL Server 2008 38-40 SQL Server 2008 incorpora una nueva herramienta que será la base

dotN

etM

anía

<<

24

dnm.plataforma.net<<

LineSeries (Gráficos lineales)

ScatterSeries (Gráficos de dispersión)

Vemos, pues, que resulta muy senci-llo poner en marcha un gráfico de estetipo una vez establecido el conjuntode valores que va a representar.Obviamente, en situaciones de pro-

ducción la mayor parte de las vecesutilizaremos servicios Web para acce-der a la información mostrada por losgráficos. Pero, una vez hecha la cone-xión y obtenidos los datos, no haydiferencia alguna.

TemasOtra de las novedades de este recien-te conjunto de herramientas es la dis-ponibilidad de temas, al estilo de deotras librerías de interfaz de usuario.Un tema es un conjunto de definicio-nes visuales relacionadas entre símediante paletas homogéneas de colo-res y diseños de formas y tipos de letra,que hacen que el resultado final de laaplicación del tema sea homogéneo, ymás coherente y agradable a la vista.

En esta CTP de diciembre se inclu-yen nueve temas prediseñados, y elusuario puede igualmente diseñar suspropios temas visuales, con el propó-sito de dar una imagen corporativa.

El trabajo con temas es igualmentemuy sencillo. Cada uno de estos temasha sido incluido en una DLL separadaque hace referencia al estilo y se

Otra de las novedades es la disponibilidad de

temas, al estilo de otraslibrerías de interfaz

de usuario

Figura 3. Gráficos de tarta. Figura 4. Gráficos lineales.

Figura 5. Gráficos de dispersión.

<charting:Chart x:Name=”Grafico2”LegendTitle=”A nalítica Web”Title=”Gráficos Lineales”Width=”350” Height=”400”Margin=”10”>

<charting:Chart.Series><charting:LineSeries

Title=”Visitas por Fecha”IndependentValueBinding=

”{Binding Path=Key}”DependentValueBinding=

”{Binding Path=Value}”FontFamily=”Segoe UI” />

</charting:Chart.Series>

</charting:Chart>

<charting:Chart x:Name=”Grafico3” LegendTitle=”A nalítica Web”Title=”Gráficos de Dispersión” Width=”350” Height=”400” Margin=”10”>

<charting:Chart.Series><charting:ScatterSeries Title=”Visitas por Fecha”

IndependentValueBinding=”{Binding Path=Key}”DependentValueBinding=”{Binding Path=Value}”FontFamily=”Segoe UI” />

</charting:Chart.Series></charting:Chart>

Page 25: dotNetManía - sergiogonzalezc.files.wordpress.com · Nueva herramienta de monitorización en SQL Server 2008 38-40 SQL Server 2008 incorpora una nueva herramienta que será la base

dotN

etM

anía

<<

25

dnm.plataforma.net<<

encuentra en el subdirectorio Themes dentro del tool-kit. Para usar un tema directamente, basta con hacerreferencia a él en el proyecto y, lógicamente, en cadacontrol de usuario Silverlight que vaya a utilizarlo,mediante la sintaxis de espacios de nombres. Por ejem-plo, para hacer referencia al tema RainierOrange,incluiremos el atributo XAML:

xmlns:expression=”clr-namespace:Microsoft.Windows.Controls.Theming;

assembly=Microsoft.Windows.Controls.Theming.RainierOrange”

Y posteriormente, en el código de diseño, envol-veremos los controles que queremos que participen deeste diseño dentro de una etiqueta apropiada:

<expression:RainierOrangeTheme><!— elementos XA ML—>

<expression:RainierOrangeTheme>

La salida que se obtiene podría ser similar a la dela figura 6, donde varios controles adoptan la defini-ción visual del tema.

Diseño personalizado de temas

Esta característica (al igual que los temas predefi-nidos) está basada en un elemento denominado

ImplicitStyleManager, que admite como atributo deconfiguración la URI de un diccionario de recur-sos, que en estos casos estará situado en un ficheroXAML separado. Pongamos el caso de que dispo-nemos de un fichero llamado MisTemas.xaml a nivelde proyecto. Dentro de él habremos establecido lasdefiniciones de estilos apropiadas, recordando uti-lizar el atributo TargetType donde sea necesario paraindicar el tipo de control al que va destinado cadaestilo.

Posteriormente, en el código XAML del controlde usuario que va a utilizar los temas haremos refe-rencia a la librería de temas genérica (la anterior eraespecífica de un tema dado) con una sentencia simi-lar a ésta:

xmlns:temas=”clr-namespace:Microsoft.Windows.Controls.Theming;

assembly=Microsoft.Windows.Controls.Theming”

En el código del UserControl, operaremos de for-ma similar a la anterior: referencia a la DLL y etique-ta que “envuelve” todo el contenido al que queramosaplicar estilos:

<UserControltemas:ImplicitStyleManager.ResourceDictionaryUri=

”proj;Temas/MisTemas.xaml”><Button Content=”Saludos con tema personal” />

</UserControl>

Y listo. Todos los controles para los que se defi-na un estilo en MisTemas.xaml lo aplicarán inmedia-tamente.

ConclusiónSi bien es cierto que tanto el control Chart como elcontrol ImplicitStyleManager todavía no han pasa-do a la fase estable, no lo es menos que no hemostenido problemas de estabilidad trabajando conellos; quizá por encontrarnos en estas fases inicia-les. En cualquier caso, los comentarios que se leenen los sitios comunitarios corroboran esta prime-ra impresión.

Figura 6. Controles que utilizan el tema RainierOrange.

Referencias

Sitio Web de Silverlight Toolkit: http://www.codeplex.com/Silverlight.[1]

Page 26: dotNetManía - sergiogonzalezc.files.wordpress.com · Nueva herramienta de monitorización en SQL Server 2008 38-40 SQL Server 2008 incorpora una nueva herramienta que será la base

Mario del ValleMiguel Katrib

En los recientes PDC (Los Ángeles, octubrede 2008) y Tech-Ed (Barcelona, noviembre de2008), las ponencias sobre el futuro de la pro-gramación y del lenguaje C# reafirmaron laimportancia de la inclusión en C# de recursoslingüísticos para hacer posible una programaciónmás declarativa.

La capacidad de escribir consultas declarati-vas integradas en el lenguaje C# (LINQ) fue elaporte más importante introducido por C#3.0.Para dar soporte a los métodos del patrón LINQ1,era necesario agregar a las interfaces IEnumera-ble<T> e IEnumerable los métodos que dan sopor-te a dicho patrón. ¿Cómo lograr esto sin modi-ficar las definiciones de esas interfaces, y evitan-do así la consiguiente avalancha de modificacio-nes que ello hubiese implicado? Es decir, ¿cómolograr, por ejemplo, indicarle al compilador quea todo objeto x de un tipo que implemente lainterfaz IEnumerable<T> se le puede aplicar tam-bién un método Where utilizando la notación con-vencional de objetos x.Where(…)?

La genial solución encontrada para ello porel equipo de desarrollo de C# fueron los méto-dos de extensión o métodos extensores (exten-

sion methods). Los métodos de extensión permi-ten lograr el efecto de agregar métodos a un tipoya existente (que incluso puede estar previamen-te compilado, y alojado en una DLL de la que nodisponemos del código fuente). El propósito finalde esto es preservar la notación habitual2 obje-to.Método(…) que se utiliza en la orientación aobjetos para invocar a un método de instancia deun tipo.

Un método de extensión se define incluyen-do dentro de una clase estática un método quetenga un primer parámetro del tipo que se quie-re extender y que utilice para dicho parámetro elmodificador especial this:

public static class ExtendiendoT{// …public static void NuevoMetodo(this T x,

…otros parámetros…)}

De este modo, si x es de tipo T (y la claseExtendiendoT está en ámbito, por supuesto), sepodrá invocar a NuevoMetodo escribiendo direc-

Los métodos de extensión ¿Son una buena cosa?

plataforma.net

Miguel Katrib es doctor yprofesor jefe de progra-

mación del departamen-to de Ciencia de la Com-

putación de la Universi-dad de La Habana.

Miguel es líder del grupoWEBOO, dedicado a la

orientación a objetos y laprogramación en la Web.

Es entusiasta de .NET yredactor de

dotNetManía.Mario del Valle es instruc-

tor de programación enC# de la cátedra de Pro-gramación e Ingeniería de

Software del departa-mento de Ciencia de la

Computación de la Uni-versidad de La Habana. Es

desarrollador del grupoWEBOO.

Este artículo presenta los métodos de extensión de C# 3.0 (también dis-ponibles en Visual Basic 9.0) y describe las múltiples ventajas que estereciente recurso lingüístico aporta. Más adelante, presenta propuestas deposibles adiciones al lenguaje C# que contribuirían a promover aún másuna de las principales ventajas que aportan los métodos de extensión: laextensibilidad de la programación.

1 Para mayor detalle acerca de cómo son utilizados los métodos de extensión por el patrón LINQ, el lector puedereferirse a [1], [2] y [3].2 Conocida en inglés como dot notation (notación de punto).

Page 27: dotNetManía - sergiogonzalezc.files.wordpress.com · Nueva herramienta de monitorización en SQL Server 2008 38-40 SQL Server 2008 incorpora una nueva herramienta que será la base

dnm.plataforma.net<<

dotN

etM

anía

<<

27

tamente x.NuevoMetodo(…), en lugar detener que escribir ExtendiendoT.Nue-voMetodo(x, …).

Sería una apreciación superficialdecir que los métodos de extensión fue-ron incluidos solo como un parche parasolucionar lo que se quería lograr conLINQ: los métodos de extensión tienenutilidad en múltiples escenarios. Porejemplo, el listado 1 muestra cómo sepodría definir un método GetInterme-diate para obtener el color intermedioentre dos colores. Gracias a ese métodose podrá escribir, con la notación de pun-to, algo como:

Color color = Colors.Yellow.GetIntermediate(Color.Brown, 0.5);

O usando el método de extensión Get-Darkened podremos lograr el efecto de“oscurecer” cualquier color haciendo:

Color darkenedOrange = Color.Orange.GetDarkened(0.8);

Como otro ejemplo, ¿quién no hadeseado disponer de algunos métodospara trabajar sobre arrays con la nota-ción de punto? Mediante el método deextensión ToString que se ha incluido enel listado 1, se puede obtener una repre-sentación como cadena de la lista detodos los elementos del array3.

int[] array = new [] { 1,2,3,4,5,6,7,8,9 };string str = array.ToString(",");

Los métodos de extensión hacenmás natural la aplicación de determi-nados métodos, al permitir la notaciónde punto de los objetos (que es favo-recida por la ayuda Intellisense, ya queal ser leída de izquierda a derechaidentifica primero al receptor y, segúnel tipo de éste, puede indicar cuálesson los métodos aplicables). Sinembargo, hay algo que no “encaja”bien en todo esto: el concepto de

encapsulamiento que pregona laorientación a objetos se diluye, por-que las definiciones de los nuevosmétodos pueden colocarse dentro declases estáticas cualesquiera, mientrasque los datos sobre los que ellos actúanandan por otro lado, dentro del tipoque se extiende. ¿Qué utilidad tienecomo tal la clase estática donde secoloca un método de extensión, salvola de servir de pretexto y "marcosintáctico" porque los métodos deextensión hay que colocarlos en algúnlugar? Adicionalmente, los métodosque están extendiendo a un tipo noquedan sintácticamente visibles, sal-vo por el rastreo que hace el compi-lador, el cual no es necesariamentefácil de hacer por el ojo humano.

¿Clases de extensión?

Para lograr lo anterior, C# 3.0 podríahaberse apoyado en un recurso muysugerente que ya tenía a su disposición,las clases parciales. Como se sabe, elcompilador recolecta todas las defini-ciones de clases con un mismo nombrey el modificador partial, y las “ensam-bla” como la definición de un mismotipo. Una idea sintáctica similar podríaemplearse también para encapsular losmétodos de extensión que se apliquen aun mismo tipo. Por ejemplo, usando unanueva palabra clave extension, se podríanescribir extensiones al tipo Color comose muestra en el listado 2.

Observe que al quedar claro cuál esel tipo que se extiende (Color en este caso),

public static class ColorExtensions{

public static Color GetIntermediate(this Color color, Color other,double pos)

{int R = (int)(color.R + (other.R - color.R) * pos);int G = (int)(color.G + (other.G - color.G) * pos);int B = (int)(color.B + (other.B - color.B) * pos);int A = (int)(color.A + (other.A - color.A ) * pos);return Color.FromA rgb(A , R, G, B);

}

public static Color GetDarkened(this Color color, double pos){

return color.GetIntermediate(Color.Black, pos);}

}

public static class MyExtensions{

public static string ToString<T>(this T[] array, string separator){

string result = “”;for (int i = 0; i < array.Length; i++){

if (i >= array.Length - 1)separator = “”;

result += array[i] + separator;}return result;

}}

Listado 1. Dos clases estáticas con métodos de extensión.

3 Algo que seguramente usted debe estar cansado de tener que escribir cada vez que quiere listar el contenido de un array para hacer algún test.

Page 28: dotNetManía - sergiogonzalezc.files.wordpress.com · Nueva herramienta de monitorización en SQL Server 2008 38-40 SQL Server 2008 incorpora una nueva herramienta que será la base

dnm.plataforma.net<<

dotN

etM

anía

<<

28

no ha habido necesidad de usar un pri-mer parámetro con la indicación especialthis para caracterizar al método como deextensión. Si dentro de la definición delmétodo se deseara hacer referencia alobjeto receptor, pudiera seguirse utili-zando el identificador this, como es habi-tual en C#. Un encapsulamiento comoéste permitiría al programador organizarmejor su código y facilitaría el trabajo deIntellisense, que no tendría que buscar lasextensiones por todo el código.

Otra posible mejora podría ser la“redefinición” de métodos de extensiónque se usen desde otros ensamblados, demodo que por defecto si el compiladorencontrara dos métodos Move aplicablesal tipo Control, ambos tendrían que estaren ensamblados separados, dado que paraun ensamblado sólo puede haber un úni-co tipo de extensión de Control. Luego,si un ensamblado A hiciera referencia aun ensamblado B, entonces un métodode extensión definido en A prevaleceríasobre el de B, eliminándose la ambigüe-dad por selección del método “másmoderno”. En cualquier caso, el compi-lador podría alertar sobre la ocultación

del viejo método, que podría ser sustitui-do como es habitual, con la cláusula new.Si A y B no dependiesen el uno del otro,se tendría la misma ambigüedad que exis-te actualmente, y que para solucionarlahay que hacer la llamada al viejo estilo:A .Método(x, …) o B.Método(x, …).

Está claro que los diseñadores delenguajes son reticentes a la introduc-ción de nuevas palabras reservadas, peropensamos que la ganancia en organiza-ción que ofrecería una solución comola expuesta aquí habría ayudado a lasbuenas prácticas.

¿Herencia o métodos deextensión?Un lector “purista” de la ProgramaciónOrientada a Objetos tal vez piense quecon un buen diseño que haga uso de laherencia se puede lograr lo mismo quecon los métodos de extensión. Es decir,¿no es mejor definir una clase B queherede de A y añadir en B un método M,a definir M como método de extensiónde A ?

Ciertamente, la existencia de losmétodos de extensión puede provocarque, en una mala práctica, los progra-madores usen métodos de extensióndónde deberían usar bien la herencia ylas jerarquías de tipos. Sin embargo, conel uso de la herencia no se asegura quese pueda aplicar el método M a entida-des cuyo tipo estático sea A , sino solo alos que son declarados de tipo B. Con lavariante de la herencia, el siguiente códi-go reporta error de compilación:

A a = new B();a.M(); // no compila

Mientras que definiendo a M comode extensión de A la invocación a.M() escorrecta.

Esta es precisamente la situaciónque se presentaba con las interfacesIEnumerable<T> e IEnumerable, a las quese les ha añadido métodos de extensióncomo es, por ejemplo, el caso del méto-do Where; de modo que si x es de tipoIEnumerable<T>, se puede escribir sinerror x.Where(…). Pero en este caso noes el sintáctico el único aporte de losmétodos de extensión. Aún cuando elequipo de C# hubiese decidido pagarel precio de una total refactorizaciónde la librería de tipos con vistas a rede-finir IEnumerable<T> e IEnumerable paracolocarle métodos como Where, ¿dón-de colocar una implementación con-creta de Where, como la que se muestraa continuación, si como se sabe, no sepuede definir código dentro de unainterfaz4?

public IEnumerable<T> Where<T>(Func<T, bool> predicate)

{foreach (T x in this)

if (predicate(x)) yield return x;

}

Esto se soluciona al definir Wherecomo un método de extensión:

// OJO: no es C# 3.0 válido

namespace System.Drawing {

public extension struct Color {

public Color GetIntermediate(Color other, double pos){int R = (int)(this.R + (other.R - this.R) * pos);int G = (int)(this.G + (other.G - this.G) * pos);int B = (int)(this.B + (other.B - this.B) * pos);int A = (int)(this.A + (other.A - this.A ) * pos);return Color.FromA rgb(A ,R,G,B);

}

public Color GetDarkened(double pos){

return this.GetIntermediate(Color.Black, pos);}

}}

Listado 2. Clase de extensión para Color.

4 Realmente pensamos que los tipos interface podrían tener métodos con código, siempre que éste use solo abstracciones de la propia interfaz; peroesto llevaría a una discusión sobre el tema de la viabilidad de tener algo como herencia múltiple en C#, lo que se sale del alcance de este artículo.

Page 29: dotNetManía - sergiogonzalezc.files.wordpress.com · Nueva herramienta de monitorización en SQL Server 2008 38-40 SQL Server 2008 incorpora una nueva herramienta que será la base

dnm.plataforma.net<<

dotN

etM

anía

<<

29

public IEnumerable<T> Where<T>(this IEnumerable<T> list,Func<T, bool> predicate)

{foreach (T x in list)

if (predicate(x)) yield return x;

}

Herencia y métodos de extensión

¿Cómo interpretar cuando se añada unmétodo de extensión a una clase base ytambién a una clase derivada de ésta?Observe cómo en el listado 3 (usandonuestra propuesta de clases de exten-sión) se ha añadido el método Move a laclase Control y también a la clase Formque hereda de Control.

¿Redefine el método Move de Form aldefinido para Control? Sí, porque al trans-formarlos en métodos estáticos quedaríansobrecargas distintas. La llamada:

button.Move(3,4);

Utilizaría el Move de Control, porquees equivalente a:

System.Windows.Forms.Control.Move(button,3,4);

Y:

form.Move(3,4);

Utilizaría el Move de Form, porque esequivalente a:

System.Windows.Forms.Form.Move(form,3,4);

En cada caso, el compilador sabríaestáticamente qué método aplicar. Pero¿y polimorfismo también? Es decir, ¿quese pueda hacer algo como en el listado4, para que entonces se aplique elmétodo Move de Form al hacer losiguiente?:

Control ctrl = new Form();ctrl.Move(3,4);

Puede que fuera deseable que acá seaplicara el Move de Form, pero tal vez seademasiado pedir que se hubiese imple-mentado paralelamente todo el apara-taje de la herencia, lo que no se habríapodido lograr con los mismos esfuerzosque se invirtieron en el actual compila-dor de C# 3.0.

¿Extensiones para todo?Propiedades de extensión

Una de las primeras interrogantes quepueden surgir al conocer a los métodosde extensión es: ¿solo métodos? ¿Porqué no también propiedades?

Desde sus propios inicios, .NETFramework admite que las propiedadessean parametrizadas; sin embargo, enC# este recurso solo se emplea para lapropiedad especial que se crea para losindexadores. Estos parámetros podríanservir para construir una suerte de pro-piedades de extensión, tomando al pri-mer parámetro como equivalente alparámetro de extensión que se marca

// OJO: no es C# 3.0 válido

namespace System.Windows.Forms {

public extension class Control {

public void Move(int dx, int dy){

this.Left += dx;this.Top += dy;

}}

public extension class Form {

public void Move(int dx, int dy){

this.StartPosition = FormStartPosition.Manual;((Control) this).Move(dx, dy);

}}

}

Listado 3. Propuesta para clases de extensión de tipos herederos.

// OJO: no es C# 3.0 válido

namespace System.Windows.Forms {

public extension class Control {public virtual void Move(int dx, int dy){

this.Left += dx;this.Top += dy;

}}

public extension class Form {

public override void Move(int dx, int dy){

this.StartPosition = FormStartPosition.Manual;((Control) this).Move(dx, dy);

}}

}

Listado 4. Propuesta para clases de extensión de tipos herederos (2).

Page 30: dotNetManía - sergiogonzalezc.files.wordpress.com · Nueva herramienta de monitorización en SQL Server 2008 38-40 SQL Server 2008 incorpora una nueva herramienta que será la base

dnm.plataforma.net<<

dotN

etM

anía

<<

30

con this en los métodos de extensión. Otro tema dedebate serían las propiedades genéricas, pero dejare-mos esa discusión para otro momento.

Con tales posibilidades a nuestro alcance, se sub-sanaría elegantemente una vieja insatisfacción quetenemos con los controles. Si se definiera la propie-dad de extensión genérica A ncestor que se presenta enel listado 5, al hacer:

Panel panel = button.A ncestor<Panel>;

Obtendríamos el primer objeto de tipo Panel quecontenga al botón button (según el árbol de contene-dores visuales).

Constructores de extensión

Como se muestra en el listado 6, los hipotéti-cos constructores de extensión podrían servir comouna nueva forma de factoría de objetos con sinta-xis habitual. Tales constructores podrían ser tra-ducidos en métodos estáticos especiales que se eje-cutarían después de la invocación del constructorpor defecto. En caso que se deseara aprovechar otroconstructor de la clase, se podría seguir la mismasintaxis de los constructores de C#, como mostra-mos en la extensión de DateTime. Esto nos permi-tiría escribir:

DateTime christmas = new DateTime(Holydays.Christmas);

Extensión de miembros de clase, lo estático de lo estáticoSi ya tenemos métodos de extensión para simularmétodos de instancia agregados a cierto tipo, ¿por quéno tener también métodos de extensión para simularmétodos estáticos agregados al propio tipo? (lo mis-mo podría decirse de las propiedades). Suponga enton-ces que tenemos una definición como la del listado 7.Nótese cómo ahora el uso de la palabra static seríamás coherente con su significado: el método (o la pro-piedad) sería aplicable a través del tipo al que extien-de, y no de una instancia de éste.

En este caso, la sintaxis type oriented adquiere unamayor importancia, pues estos métodos o propieda-des no serían propiamente traducibles a miembros quetengan parámetro especial alguno, sino que el com-pilador los debería entender como aplicables al tipocorrespondiente, e Intellisense los podría detectar tam-bién como miembros de extensión estáticos.

Operadores de extensión

Considere la siguiente línea:

string s = button.Location; // Location es de tipo Point

¿Quién no se ha sentido molesto por tener que lla-mar a ToString cuando quiere presentar como cadena

// OJO: no es C# 3.0 válido

public extension class Control {

public T A ncestor<T> where T: Control {

get{

Control parent = this.Parent;if (parent == null)

return null;return parent is T ?

(T) parent : parent.A ncestor<T>;}

}}

Listado 5. Propuesta para propiedades de extensión.

Si ya tenemos métodos de extensión para simular métodos de

instancia agregados a cierto tipo, ¿por qué no tener también métodosde extensión para simular métodosestáticos agregados al propio tipo?

Page 31: dotNetManía - sergiogonzalezc.files.wordpress.com · Nueva herramienta de monitorización en SQL Server 2008 38-40 SQL Server 2008 incorpora una nueva herramienta que será la base
Page 32: dotNetManía - sergiogonzalezc.files.wordpress.com · Nueva herramienta de monitorización en SQL Server 2008 38-40 SQL Server 2008 incorpora una nueva herramienta que será la base

dnm.plataforma.net<<

dotN

etM

anía

<<

32

de caracteres un valor que no lo es? Conoperadores de extensión como el que sepresenta en el listado 8, eso podría evi-tarse. Es cierto que esto de las conver-siones implícitas puede oscurecer el códi-go y ser provocadas no intencionalmen-te, pero su uso puede ayudar a dar más“declaratividad”, como podrá apreciarseen la sección a continuación.

Combinando miembros de extensiónConsidérese la clase MailMessage de Sys-tem.Net.Mail, que tiene una propiedadTo de tipo MailA ddressCollection, here-dera de Collection<MailA ddress>. Paraindicar a quién va dirigido el mensaje,la sintaxis es como sigue:

mailMessage.To.A dd(new MailA ddress("[email protected]"));

Lo cual vale cuando se quieren aso-ciar varios destinatarios a un mensaje.Sin embargo, cuando es un solo desti-natario, sería más natural poder escri-bir algo como:

mailMessage.To = new MailA ddress("[email protected]");

// OJO: no es C# 3.0 válido

namespace System {

public extension class DataGrid {

public DataGrid(DataSet data) {

DataSource = data;DataBind();

}}

}

namespace System {

public extension struct DateTime {

public DateTime(Holydays day): this(DateTime.Now) {

switch (day){

case Holydays.Christmas: this = new DateTime(12, 25, this.Year); break;

// ...}

}}

}

Listado 6. Propuesta para constructores de extensión.

// OJO: no es C# 3.0 válido

namespace System {

public extension struct DateTime {

public static DateTime Christmas {

get {

return new DateTime(12, 25, DateTime.Now.Year);}

}}}

Listado 7. Propuesta para propiedades de extensión estáticas.

// OJO: no es C# 3.0 válido

namespace System {public extension class Object {public static implicit

operator string (object obj) {

return obj == null ? “” : obj.ToString();

}}

}

Listado 8. Propuesta para operadores deextensión.

Page 33: dotNetManía - sergiogonzalezc.files.wordpress.com · Nueva herramienta de monitorización en SQL Server 2008 38-40 SQL Server 2008 incorpora una nueva herramienta que será la base

dnm.plataforma.net<<

dotN

etM

anía

<<

33

Para lograrlo, habría que hacer dos extensiones:ponerle un set a la propiedad To y agregar un operadorimplícito a MailA ddressCollection, como se muestra enel listado 9. El lector pudiera creer que con agregar una

propiedad extendida To de tipo string el problema seresolvería; pero esto derivaría en un error de sobrecar-ga sobre esta propiedad.

ConclusionesLas capacidades de extensibilidad de un lengua-

je de programación, sin provocar ninguna rupturacon los recursos existentes ni con la sintaxis del len-guaje, son una cualidad importante para la produc-tividad de la programación. Los métodos de exten-sión introducidos en C# 3.0 pueden considerarsedentro de esta categoría de facilitar adecuadamentela extensibilidad.

Aunque, lamentablemente, entre los recursos delvenidero C# 4.0 (de algunos de los cuales hablaremosen próximas entregas) no parece haber ninguna modi-ficación del estilo de las propuestas en este artículo,esperamos que las ideas y ejemplos presentados leayuden a comprender mejor la valía de los métodosde extensión y a desarrollar buenas prácticas en el usode los mismos.

// OJO: no es C# 3.0 válido

namespace System.Net.Mail {

public extension class MailMessage {

public MailA ddressCollection To {

get{

// ...la misma definición original}set {

To.Clear();foreach (MailA ddress address in value)

To.A dd(address);}

}}

public extension class MailA ddressCollection {

public static implicit operatorMailA ddressCollection(string address)

{MailA ddressCollection collection = new

MailA ddressCollection();collection.A dd(address);return collection;

}}

}

Listado 9. Combinando propuestas de miembros deextensión.

Las capacidades de extensibilidad de un lenguaje son una cualidadimportante para la productividad

de la programación. Los métodos de extensión introducidos

en C# 3.0 pueden considerarse dentro de esta categoría

ReferenciasHernández, Octavio. "C#3.0 y LINQ", Krasis Press, 2007.

Microsoft Corporation. "C# Language Specification, version 3.0". http://msdn.microsoft.com/en-us/vcsharp/aa336809.aspx.

Katrib, M., Del Valle, M., Paneque, L., Fresneda, R., Fuentes, T., Sierra, I., Hernández, Y., Som G."Visual Studio 2008. Desafía Todos los Retos". Cuaderno Técnico nº 8 de dotNetManía. Netalia, 2008.

[1]

[2]

[3]

Page 34: dotNetManía - sergiogonzalezc.files.wordpress.com · Nueva herramienta de monitorización en SQL Server 2008 38-40 SQL Server 2008 incorpora una nueva herramienta que será la base

Introducción

Desde su liberación hace unos cuantos años, .NETse erigió como una plataforma en la cual se puedeproducir código eficiente y en un tiempo menor encomparación con otras tecnologías existentes. Estedesarrollo rápido es garantizado en gran medida porun marco de trabajo jerárquico totalmente orienta-do a objetos, que incluye miles de clases listas paraser utilizadas. Se podría decir que “casi” todo lo queun desarrollador necesita se encuentra en algún lugardel espacio de nombres System. ¿Qué hacer enton-ces cuando la búsqueda en MSDN devuelve entra-das que apuntan a un lugar de la API de Windows?

La respuesta es simple: continuar leyendo. Puesen este trabajo examinaremos uno de los recursospara interactuar con código nativo que ofrece ellenguaje C++/CLI. A modo de ejemplo, desarro-llaremos un componente para la reproducción desonido valiéndonos de las librerías del sistema ope-rativo, para luego incluirlo en una aplicación Win-dows Forms hecha con C#.

C++/CLI y la interoperabilidadEl compilador de C++ incluido en Visual Stu-dio 2008 es, a todas luces, único. Con él no solo

podemos generar las aplicaciones nativas de todala vida, sino que también contamos con el sopor-te del lenguaje de programación C++/CLI [1],y sin dudas con la tecnología más poderosa paraobtener de manera exitosa los beneficios de lainteroperabilidad: C++ Interop o IJW (It JustWorks).

Antes de analizar de manera práctica algunosde los servicios de interoperabilidad presentes enC++/CLI, es necesario primero entender de quémanera el compilador genera aplicaciones aptaspara ser ejecutadas por el CLR. Esto se logramediante la opción /clr del compilador, que pue-de configurarse en la ventana de propiedades,sección “General”, y puede tomar los siguientesvalores1.

• /clr• /clr:pure• /clr:safe

Cada opción permite un determinado grupode servicios de interoperabilidad, obteniéndosetres tipos distintos de ensamblados. La tabla 1 ilus-tra estas diferencias.

Un ensamblado mixto es capaz de contenertanto instrucciones nativas como IL. Activando/clr podremos hacer uso de toda la potencia de

Implementando wrappers con C++/CLI

plataforma.net

Horacio Nuñez Hernández es estudiante

de Matemáticas en laUniversidad de La

Habana.Cuenta con las certifica-

ciones C# de Brainbenchy J2EE de NIIT.

Puede ver su blog enhttp://elblogdehora-

cio.blogspot.com.

En este artículo se presenta C++ Interop (también conocido comoIJW - It Just Works), uno de los principales recursos para interactuarcon código nativo que ofrece el lenguaje C++/CLI. Como ejemplo, sedesarrolla un componente que encapsula llamadas a la librería parareproducción de sonido del sistema operativo, para posteriormenteincluirlo en una aplicación escrita en C#.

Horacio Núñez Hernández

1 Hemos excluido el valor /clr:oldSyntax de la lista, ya que indica el uso de las extensiones manejadas (ManagedExtensions), una sintaxis que no se garantiza esté soportada en futuras versiones.

Page 35: dotNetManía - sergiogonzalezc.files.wordpress.com · Nueva herramienta de monitorización en SQL Server 2008 38-40 SQL Server 2008 incorpora una nueva herramienta que será la base

dotN

etM

anía

<<

35

dnm.plataforma.net<<

la interoperabilidad. Nos referimos arecompilar aplicaciones en C++ clási-co e incorporarle componentes mane-jados, permitiendo la mutua invoca-ción, todo lo cual puede llevarse a cabosin mucha dificultad. A menudo se aso-cia el término “C++ Interop” exclusi-vamente a este escenario.

Especificando /clr:safe, nuestrocódigo sólo podrá utilizar los serviciosde P/Invoke y el ensamblado resultan-te sólo contendrá IL, de modo similara cuando se utiliza VB.NET o C# enmodo seguro (safe).

Por otra parte, /clr:pure generaráun ensamblado con instrucciones IL,pero con la diferencia de que podremosutilizar tipos y funciones nativas siem-pre que éstas puedan llevarse a IL. Elcompilador llevará a cabo una suerte deP/Invoke implícito, con el añadido dela seguridad de tipos, donde a diferen-cia del P/Invoke clásico, los datos y pará-metros serán pasados sin ninguna con-versión (marshaling) mientras su repre-sentación sea la misma en ambos entor-nos [2]; en caso contrario, la conversiónserá tarea nuestra, pero en MSDN sepuede encontrar un conjunto de rece-tas para cada caso puntual [3]. El códi-go IL resultante es equivalente al quese obtendría al utilizar C# en modo inse-guro (unsafe). Resulta muy interesantever el código generado a través de laherramienta Reflector de Red Gate.

Por sus características, obviamen-te /clr:pure es la mejor opción paracrear wrappers (módulos encapsulado-res) de la API de Windows con vistasa exponer su funcionalidad a los len-

guajes .NET. Con C++ Interop, solodeberemos incluir los encabezados yespecificar la entrada en el linker. Ésteserá el enfoque a utilizar en nuestrasolución.

Si el lector desea profundizar másen C++/CLI y el modo de compilación/clr, le recomiendo la lectura del exce-lente libro “C++/CLI in Action” [4].

System.Media y Media Con-trol InterfaceEl lector convendrá con el que escri-be en que uno de los espacios un tan-to vacíos que ha dejado .NET Frame-work ha sido el de la multimedia. Demanera algo tardía, en la versión 2.0se incorporó el espacio de nombresSystem.Media, que cuenta únicamentecon poco más que la clase SoundPlayer,mediante la cual solo podemos repro-ducir archivos de sonido cuyo formatosea .wav. A partir de .NET 3.0, dispo-nemos también del control MediaEle-ment, que si bien cubre muchas másnecesidades, está atado a la maquinariade WPF.

Con semejante panorama, si nece-sitáramos reproducir archivos conextensión .wma, .mp3 o .wav en nuestrasaplicaciones Windows Forms, el uso deMedia Control Interface (en adelanteMCI) sería una buena opción, dada sudisponibilidad en la API de Windows.De hecho, la clase SoundPlayer que men-cionábamos anteriormente utiliza lasfunciones especiales de MCI para lamanipulación de archivos .wav.

MCI encapsula la mayor parte delas posibilidades de acceso a los dispo-sitivos multimedia de manera unifor-me, salvo en los casos de aquellos dis-positivos donde se requiera una deter-minada especialización, como ocurrecon algunos periféricos. El control deun dispositivo puede llevarse a cabo através de una interfaz de mensajes detexto, a la cual podemos accedermediante la función mciSendString:

MCIERROR mciSendString(LPCTSTR lpszCommand, LPTSTR lpszReturnString, UINT cchReturn, HANDLE hwndCallback);

O mediante una interfaz de coman-dos con la función mciSendCommand:

MCIERROR mciSendCommand(MCIDEVICEID IDDevice,UINT uMsg, DWORD fdwCommand, DWORD_PTR dwParam);

Es importante destacar que esta fun-ción tiene como cuarto parámetro for-mal el puntero a una estructura que vie-ne determinada según el comando usa-do. Usar una opción u otra no implicaperder funcionalidad. Pero mientras quela interfaz de mensajes fue ideada paraser usada desde lenguajes como VisualBasic, su contrapartida lo fue para C++,y dado que utilizamos C++/CLI nos per-mitiremos aprovecharla.

Como se ha mencionado anterior-mente, es necesario indicar la entradadel linker e incluir los archivos de cabe-cera. Según la documentación de MCI,debemos incluir en el código fuente dosarchivos con extensión .h:

Soporta /clr /clr:pure /clr:safe

.NET Framework Class Library SÍ SÍ SÍ

CRT Library SÍ SÍ NOMFC/ATL SÍ NO NOImplementación de funciones nativas SÍ SÍ NODefinición y uso de tipos nativos SÍ SÍ NODefinición y uso de funciones nativas SÍ SÍ (solo invocación) SÍ (invocación P/Invoke)Invocación desde funciones nativas SÍ NO NOReflexión Solo en DLL SÍ SÍEnsamblado obtenido Mixto Puro Verificable

Tabla 1

Page 36: dotNetManía - sergiogonzalezc.files.wordpress.com · Nueva herramienta de monitorización en SQL Server 2008 38-40 SQL Server 2008 incorpora una nueva herramienta que será la base

dotN

etM

anía

<<

36

dnm.plataforma.net<<

#include <windows.h>

#include <mmsystem.h>

En cuanto a la entrada del linker, debe-remos agregar winmm.lib en el campo“Additional Dependencies” (en “Confi-guration Properties” | “Linker” | “Input”dentro de las propiedades del proyecto).

Diseño del wrapperAl documentarnos acerca de laslibrerías nativas que solucionan nues-tro problema, muchas veces nos encon-tramos con que el modelo de progra-mación elegido para su implementa-ción difiere del que encontramos en.NET Framework. Mientras que en.NET todo es un objeto, en la API deWindows las acciones se llevan a cabopor lo general a través de funciones(MCI es un buen ejemplo de esto). Parasalvar esta diferencia, es necesario recu-rrir a un wrapper, el cual, como su nom-bre indica, envolverá todo o parte de lafuncionalidad presente de la librería,exponiendo una interfaz refactorizadaa la medida de nuestras necesidades2.La figura 1 muestra este concepto,enmarcando la solución que desarro-llaremos en la próxima sección.

Teniendo ya claro el camino a seguir,es hora de hacer el análisis y preparar eldiagrama de clases. La figura 2 muestra

la jerarquía de clases de la posiblelibrería manejada y la interfazpública de nuestro componenteSoundPlayer3.

Foo.Media.SoundPlayerLa clase PlayerBase, cuya clasebase es Component, define la infra-estructura común de propiedadesy eventos, y se encarga de la ini-cialización de los valores, demanera que en las clases deriva-das (en nuestro caso SoundPlayer)nos preocuparemos únicamentede implementar los métodos cuyafuncionalidad es específica paracada dispositivo, es decir Open,Close y los especificados por lainterfaz IPlayBackController. Enlos listados 1 y 2 puede verse elcódigo reducido de los elemen-tos que conforman el diagrama.

Nótese que C++/CLI incluyeal C++ clásico (ver la especificación[2]), por lo que para el soporte detipos valor y referencia de .NET esnecesario el uso de palabras reser-vadas adicionales.

Finalmente, ha llegado elmomento de poner en práctica todaesta teoría (totalmente necesaria)que hemos estado presentando.Aunque, como se argumentó en laprimera sección, con C++/CLI noes tan diferente de lo que sería siutilizásemos C++ de siempre. Elmétodo Play puede verse imple-mentado en el listado 3; si obviá-ramos la presencia de la enumera-ción PlayBackState, no habría for-ma de saber que el resultado denuestra compilación será IL.

El caso de Open (listado 4) estotalmente diferente: la represen-tación de las cadenas de caractereses distinta en los dos entornos. Lareceta en este caso consiste en haceruna conversión a un puntero queobtendremos de la clase Marshalmediante el método StringToHGlo-balA uto, y que luego liberaremoscon el método FreeHGlobal.

Figura 1. Nuestro componenteencapsulará parte de lafuncionalidad de MCI.

2 Note que en materia de patrones de diseño estamos en presencia del patrón Façade [5].3 El soporte para diseñar diagramas de clases de C++ en VS 2008 está disponible únicamente para código nativo, por lo que para el diseño deldiagrama podemos optar por NClass (http://nclass.sourceforge.com), entre otros.

Listado 1

public enum class PlayBackState {Play,Stop,Pause,Seek};public interface class IPlayBackController{

void Play();void Pause();void Seek(int newPosition);void Stop();

};public ref class MediaException : Exception{public:

MediaException(String^ message): Exception(message){}};

Listado 2

namespace Foo{namespace Media {public ref class PlayerBase abstract : Component,

IPlayBackController{

PlayBackState m_state;String^ m_location;int m_position;int m_length;bool m_open;

protected:property MCIDEVICEID DeviceId;void ProcessCommand(MCIERROR result);DWORD GetStatusInformation(DWORD flag);String^ GetErrorInformation(MCIERROR errorCode);virtual void InitializeMembers();virtual void OnMediaOpen(EventArgs^ e);virtual void OnMediaClose(EventArgs^ e);//…

public:PlayerBase();virtual void Open(String^ location) abstract;virtual void Close() abstract;virtual void Play() abstract;virtual void Pause() abstract;virtual void Stop() abstract;virtual void Seek(int newPosition) abstract;//…event EventHandler^ MediaOpen;event EventHandler^ MediaClose;//…

};public ref class SoundPlayer : PlayerBase{

Timer^ m_timer;array<String^>^ supportedExtensions;

protected:virtual void InitializeMembers() override;void UpdatePosition(Object^ sender, EventArgs^ e);

public:SoundPlayer();virtual void Open(String^ location) override;virtual void Close() override;virtual void Play() override;virtual void Pause() override;virtual void Stop() override;virtual void Seek(int newPosition) override;virtual void OnMediaEnded(EventArgs^ e) override;virtual void OnStateChanged(EventArgs^ e) override;

};}}

Page 37: dotNetManía - sergiogonzalezc.files.wordpress.com · Nueva herramienta de monitorización en SQL Server 2008 38-40 SQL Server 2008 incorpora una nueva herramienta que será la base

Actualizando la posición

Los eventos al estilo de PositionChan-ged y MediaEnded son como perlas negrasen esto de los componentes para repro-ducción de multimedia. Para obtener

estos resultados, por simple queparezca bastará con incorporarun temporizador (timer) a nues-tro componente. Concretamen-te, aquí hemos utilizado una ins-tancia de la clase de temporiza-dor perteneciente al espacio denombres System.Windows.Forms,que actualizará cada un segundola propiedad Position del com-ponente, lanzando con ello elevento PositionChanged.

The Managed PlayerUna vez terminada la compila-ción de la librería, basta con aña-dir una referencia al ensambla-do y arrastrar el control a nues-tra aplicación Windows Forms.La figura 3 muestra la aplicaciónde ejemplo, The Managed Pla-yer, en funcionamiento.

ConclusionesCon este artículo, hemos comproba-do lo útil que puede ser C++/CLIcuando de utilizar librerías nativas setrata. Lo que antes resultaba ser unproceso tedioso (con tendencias a

generar depresión), es actualmentecuando menos divertido. El compo-nente SoundPlayer es un buen ejem-plo de ello. Espero que este artículo

haya enriquecido los conocimientosdel lector acerca de la plataforma; alfin y al cabo, nunca se sabe demasia-do, sobre todo sobre .NET =).

Quisiera agradecer a OctavioHernández y Rafael Ontivero porrevisar este documento y aportar susvaliosas sugerencias.

La solución presentada aquí pue-de descargarse del sitio Web de dot-NetManía o desde la página del pro-yecto en CodePlex (http://www.code-plex.com/keniamm).

dotN

etM

anía

<<

37

dnm.plataforma.net<<

Figura 3

if (IsOpen)if (State != PlayBackState::Play){MCI_PLAY_PARMS mpp;mpp.dwFrom = Position;ProcessCommand(mciSendCommand( DeviceId,

MCI_PLAY,MCI_TO,(DWORD)(LPVOID)&mpp));State = PlayBackState::Play;

}

Listado 3

if (IsOpen) Close();

MCI_OPEN_PARMS mop;IntPtr p = Marshal::StringToHGlobalAuto(location);TCHAR* path = static_cast<TCHAR*>(p.ToPointer());mop.lpstrElementName = path;ProcessCommand(mciSendCommand(NULL, MCI_OPEN,

MCI_OPEN_ELEMENT, (DWORD)(LPVOID)&mop));Marshal::FreeHGlobal(p);DeviceId = mop.wDeviceID;IsOpen = true;Location = location;Length = GetStatusInformation(MCI_STATUS_LENGTH);Position = 0;

Listado 4

Figura 2. Diagrama de clases de Foo.Media.

ReferenciasOntivero, Rafael. “C++/CLI: un nuevoenfoque al desarrollo en C++ para .NET”, endotNetManía Nº 33, enero de 2007.

“Blittable and Non-Blittable Types”.En especificación de C++/CLI.http://www.ecma-international.org/publications/standards/Ecma-372.htm.

“Interop How-To”.http://msdn2.microsoft.com/en-us/library/2x8kf7zx(VS.80).aspx.

Sivakumar, Nishant. “C++/CLI inAction”. Manning Publications, abril de2007.

Gamma, R. y otros. “Design Patterns:Elements of Reusable Object-OrientedSoftware”. Addison-Wesley, 1994.

[1]

[2]

[3]

[4]

[5]

Page 38: dotNetManía - sergiogonzalezc.files.wordpress.com · Nueva herramienta de monitorización en SQL Server 2008 38-40 SQL Server 2008 incorpora una nueva herramienta que será la base

dnm.servidores.sql

La arquitectura de SQL Server Performance Studiose ajusta al gráfico que se presenta en la figura 1.

Este artículo le familiarizará con los siguientesconceptos:

• Almacenamiento de la información de moni-torización: dónde se almacena la informaciónobtenida como resultado de la monitorización.

• Colectores de datos y sus tipos: qué informa-ción se captura y flexibilidad de filtrado.

• Proceso de captura de datos: de qué formase captura la información, y qué mecanis-mos ayudan a automatizar este proceso.

• Análisis de la información capturada desdeaplicaciones cliente: cómo pueden los admi-nistradores de bases de datos analizar la infor-mación capturada.

Almacenamiento de la información demonitorización

Introducción

La información capturada se guarda en una basede datos de usuario. Durante el proceso de insta-lación, el administrador de bases de datos elige labase de datos de destino en la que se crearán lastablas y procedimientos almacenados necesariospara guardar esta información. Adicionalmente,toda la información de configuración de los pro-cesos de captura se guarda en la base de datos desistema msdb.

SQL Server Performance StudioNueva herramienta de monitorización en SQL Server 2008

servidores.sql

Eladio Rincón esMCT y MVP en SQL

Server; es Director deTecnologías de Basesde Datos para SolidQuality en España yPortugal, y mantienecon sus compañerosde departamento El

Rincón del DBA(http://blogs.solidq

.com/ES/ElRincon-DelDBA ), donde com-parten sus experien-cias en escalabilidad,

seguridad, rendimien-to y diseño eficiente

de sistemas de basesde datos.

SQL Server 2008 incorpora una nueva herramienta que será la base demonitorización para múltiples servidores: SQL Server Performance Studio.La herramienta se basa en una serie de colectores de datos (data collectors)programables, que capturan información de monitorización. Posteriormente,y con la frecuencia que desee el administrador, esa información se conso-lida en un repositorio (datawarehouse) para su posterior análisis.

Eladio Rincón

Figura 1. Arquitectura de SQL Server Performance Studio.

Page 39: dotNetManía - sergiogonzalezc.files.wordpress.com · Nueva herramienta de monitorización en SQL Server 2008 38-40 SQL Server 2008 incorpora una nueva herramienta que será la base

dotN

etM

anía

<<

39

dnm.servidores.sql<<

Creación de la base de datos demonitorización

Antes de iniciar el proceso, hay queasegurarse de que el servicio SQLAgent está en funcionamiento, porqueel proceso de configuración crea unaserie de trabajos de SQL Agent, comoveremos a continuación. Para crear labase de datos de monitorización, reali-zaremos los siguientes pasos:

1) Conectados a la instancia de SQLServer 2008, expandimos el menú“Management”, pulsamos con elbotón derecho del ratón sobre el ele-mento “Data Collection” y elegimosla opción “Configure ManagementDatawarehouse”.

2) Elegimos la base de datos donde dese-amos guardar la información, y ademásel directorio local de la instancia deSQL Server donde se almacenará tem-poralmente la información de moni-torización antes de “subirla” a la basede datos de almacenamiento.

3) A continuación, debemos mapear ellogin de usuario que necesita acceso ala base de datos de monitorización.Lo más común es dar permiso a losadministradores para realizar cual-quier operación sobre la base de datos.

4) Finalmente, aceptamos las opcionesrecientemente configuradas.

Una vez terminado el proceso, podre-mos ver que en el árbol de objetos de lainstancia bajo “Data Collection” apareceun nuevo elemento más (“System DataCollection Sets”), que a su vez contienetres elementos nuevos, como muestra lafigura 2: “Disk Usage” (Uso de disco),“Query Statistics” (Estadísticas de con-sultas) y “Server Activity” (Actividad delservidor), que son tres colectores de datossobre los que hablaremos en la siguientesección.

Algunas curiosidades, antes deseguir con los colectores de datos:• Las tablas dbo.syscollectors* en la

base de datos msdb contienen la infor-mación de configuración de los pro-cesos de monitorización. En ellas seguarda información como la frecuen-cia de las capturas, colectores habilita-

dos, parámetros de los colectores, fre-cuencia e histórico de ejecuciones, etc.

• La base de datos de registro de moni-torización almacena todas las medi-ciones realizadas; si consultamos lastablas que contiene, veremos nom-bres que nos resultarán familiares yestán relacionados con conceptos deSQL Server, como os_wait_stats,os_memory_clerks, log_usage, query_stats, trace_data, etc.

Colectores de datos

Introducción

Los colectores de datos (data collectors)son componentes de monitorización

basados en esquemas XML predefini-dos que se instalan en SQL Server 2008.Como hemos comentado previamente,estos colectores capturan informaciónque se guarda de forma local (en unacaché local configurable), y que poste-riormente se consolida en la base dedatos de monitorización. La arquitec-tura de los colectores se basa en el esque-ma que se muestra en la figura 3.

Tipos de colectores

En función de sus características,podemos clasificar los colectores dedatos en los siguientes tipos:

• Consulta T-SQL. Este tipo de colec-tor ejecuta una consulta T-SQL ycachea el resultado de la consulta;posteriormente, la información seconsolida en la base de datos de moni-torización. La ejecución de procedi-mientos almacenados de sistemacomo sp_who, sp_lock, etc. constitu-yen ejemplos de posibles consultas demonitorización.

• Traza SQL. Este tipo de colector per-mite automatizar la captura de trazasde SQL Profiler; funcionalmente, suoperativa es similar a la de las trazas deSQL Profiler de lado de servidor.

• Contadores de rendimiento. Eneste grupo entraría la automatiza-ción del seguimiento de compo-nentes de hardware como discos,CPU, red, etc., o de contadores

Figura 2. Colectores de datos creados por SQL Server.

Figura 3. Arquitectura de los colectores de datos.

Page 40: dotNetManía - sergiogonzalezc.files.wordpress.com · Nueva herramienta de monitorización en SQL Server 2008 38-40 SQL Server 2008 incorpora una nueva herramienta que será la base

específicos de SQL Server comopeticiones por segundo, transaccio-nes por segundo, etc.

• Actividad de consultas. Los colecto-res de este tipo permiten monitorizar laejecución de consultas, planes de ejecu-

ción, texto de consultas T-SQL, o estadísticas comolecturas, escrituras, ejecucio-nes o la duración de las con-sultas a las que se realizaseguimiento.

Por otra parte, en fun-ción de su creación pode-mos dividir los colectoresde datos en:

• Colectores de datos desistema, creados por SQLServer (figura 2).

• Colectores de datos deusuario, creados poradministradores de basesde datos para dar sopor-te a necesidades específi-cas de monitorización.

Actualmente, desdeSQL Server ManagementStudio no es posible crearde una manera visual colec-tores de datos de usuario,sino que éstos deben crear-se usando procedimientosalmacenados de sistema o laAPI expuesta a través de losobjetos SMO.

Colectores de datos desistema

Los colectores predefi-nidos de sistema son lossiguientes:

• Uso de disco. Utilizacomo base las DMV de sis-tema como sys.partitions,sys.allocation_units ,sys.dm_io_virtual_file_

stats y comandos de siste-ma como DBCC SQLPERF

(LOGSPACE), que ofreceninformación sobre los ficheros de bases dedatos, tamaño y actividad, como puede ver-se en la figura 4. • Estadísticas de consultas. Este colec-

tor agrega información de otras DMVcomo dm_exec_requests, dm_exec_ses-

sions y dm_exec_query_stats (figura 5).• Actividad del servidor. Integra infor-

mación extraída de vistas DMV comosys.dm_os_wait_stats, sys.dm_os_latch_stats y sys.dm_os_schedulers(figura 6).

Configuración de los colectores dedatos

Para cada colector de datos, es posi-ble configurar los siguientes parámetros:

• Presencia o ausencia de caché local.• En caso de presencia de caché local,

la localización de este almacenamien-to temporal y la frecuencia con que seconsolida la información capturada enla base de datos de monitorización.

• Caducidad de los datos monitoriza-dos (por defecto, 730 días).

ConclusiónSQL Server 2008 incorpora una nuevaherramienta empresarial que hace másfácil el diseño, implementación y des-pliegue de sistemas de monitorizaciónde servidores de bases de datos. Estaherramienta se apoya en componentesya existentes de SQL Server como SQLProfiler, el Monitor de rendimiento y lasDMV de administración ya familiares ala gran mayoría de administradores debases de datos, lo que ayudará a una rápi-da implantación en sistemas migradosdesde SQL Server 2005.

dotN

etM

anía

<<

40

dnm.servidores.sql<<

Figura 5. Colector de datos de estadísticas de consultas.

Figura 6. Colector de datos de actividad de servidor.

Figura 4. Colector de datos de uso de disco.

SQL Server PerformanceStudio hace más fácil la

implementación de sistemas de monitorización

de servidores de bases de datos

Page 41: dotNetManía - sergiogonzalezc.files.wordpress.com · Nueva herramienta de monitorización en SQL Server 2008 38-40 SQL Server 2008 incorpora una nueva herramienta que será la base
Page 42: dotNetManía - sergiogonzalezc.files.wordpress.com · Nueva herramienta de monitorización en SQL Server 2008 38-40 SQL Server 2008 incorpora una nueva herramienta que será la base

Creo que lo que mejor manera de definir a los quenos dedicamos a esto del software es llamarnosvagos. ¿Para qué vamos a hacer lo mismo dos, tres,N veces, si podemos programarlo una vez y des-preocuparnos? Esto me ha pasado con los archi-vos de configuración de WCF y quiero compar-tir con vosotros cómo lo he resuelto.

No creo que os descubra nada nuevo si digo queWCF “mola un huevo”. Podemos montar la estruc-tura de comunicaciones tanto en un archivo de con-figuración como directamente por código. En losproyectos en los que he participado, con el archi-vo de configuración me ha sobrado; por eso, segu-ramente, es el método que más me gusta.

Un archivo XML en el que se basan las comu-nicaciones de nuestro sistema. Los archivos deconfiguración han estado siempre ahí, siempre loshemos usado, pero gracias a la abstracción, patro-nes de diseño y todo lo que ha hecho que el desa-rrollo de software se convierta en una ingeniería,podemos tener componentes tan generales comopersonalizables. ¿Veis por dónde voy? A mí no megusta desarrollar software: me encanta. Lo hagamejor o peor. Y aunque sepa que es una ingeniería,personalmente lo considero un arte.

El “problema” cuando estamos desarrollandocon WCF es a la hora de poner el sistema en unentorno de desarrollo, de preproducción o en pro-

ducción. Me explico. En desarrollo, montamosnuestros servicios en nuestra máquina local, deci-dimos qué bindings nos convienen más, creamoslos servicios, los configuramos y empezamos conlos consumidores. Todo perfecto; esto es la leche.Pero luego toca montarlo todo en un(os) servi-dor(es) de desarrollo, y entonces saltan las alar-mas: tenemos que trastear con los archivos de con-figuración para que los servicios funcionen enel(los) servidor(es) de desarrollo. ¿Tenemos quecambiarlos a mano? ¿En preproducción y en pro-ducción también?

Trivial: tenemos los proyectos de instalación[1] y LINQ to XML [2]… Qué tonto puedo pare-cer algunas veces.

En este artículo vamos a ver cómo con un sim-ple instalador vamos a poder desplegar todo el sis-tema sin tener que estar tocando a mano esos archi-vos de configuración. Con un instalador en plan“Siguiente, Siguiente, Aceptar” tendremos nues-tro sistema desplegado y configurado.

Para simplificar un poco, en Visual Studio 2008tendremos una solución con dos proyectos de con-sola: uno llamado Servidor, que va a servir de hosta un servicio WCF, y otro (Cliente) que va a hacerde cliente.

Una vez que añadimos un servicio WCF alproyecto Servidor, ya tenemos el primer A pp.con-

WCFConfiguraciones e instaladores

plataforma.net

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

en Montrel S.A. Desde2004 colabora activamen-

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

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

brado Microsoft StudentPartner en 2006 y miem-

bro del equipo ganadorde Imagine Cup 2006

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

wordpress.com.

El despliegue de los servicios y clientes WCF en diferentes entornos(desarrollo, preproducción, producción) es una tarea propensa a erro-res en la que normalmente se hace necesario “tocar” manualmente losarchivos de configuración. En este artículo se presenta una propuestapara simplificar el despliegue de nuestros servidores y clientes WCFmediante proyectos de instalación que solicitan la dirección de los ser-vicios y actualizan automáticamente estos archivos.

Juan María Laó

Page 43: dotNetManía - sergiogonzalezc.files.wordpress.com · Nueva herramienta de monitorización en SQL Server 2008 38-40 SQL Server 2008 incorpora una nueva herramienta que será la base

fig de la “discordia”: el que nos va apermitir configurar la forma de comu-nicarse con los clientes.

Las operaciones que publique nues-tro servicio no son relevantes para esteartículo, ya que lo que nos interesa escómo automatizar el proceso de actua-lización de los archivos A pp.config. Ydigo “los” porque al agregar la refe-rencia al servicio WCF en el cliente,también nos va a aparecer otro… quetambién habrá que configurar en pro-ducción.

Ahora lo que nos queda es crear unproyecto de instalación para nuestrasaplicaciones, tanto el servidor como laaplicación cliente. Vamos a ver cómocrearíamos el proyecto de instalacióndel proyecto Servidor para que nos pre-gunte por la dirección en la que quere-mos publicar nuestros servicios.

Lo primero es añadir un proyectode instalación a la solución (figura 1).En el cuadro de diálogo de tipos de pro-yecto, debemos seleccionar el nodo“Setup and Deployment” (Instalacióny despliegue), que se encuentra en lacategoría “Other Project Types” (Otrostipos de proyectos), y la plantilla “SetupProject” (Proyecto de instalación).

A continuación, tenemos que aña-dir el resultado de la compilación delproyecto Servidor, indicándole así alproyecto de instalación qué es lo quequeremos instalar. Para ello, en elExplorador de soluciones hacemos cliccon el botón derecho en el proyecto de

instalación, y seleccionamos la opción“Add” | “Project Output”. En el cua-dro de diálogo que aparece, indicamosque queremos añadir la salida de com-pilación del proyecto Servidor. Allí, enel desplegable “Configuration” pode-mos indicar que se utilice la configura-ción activa, “Debug” o “Release”. Estova a depender de los gustos y de lo olvi-dadizos que seamos a la hora de gene-rar y compilar nuestros ensamblados.Personalmente, prefiero la opción“Release”; así no tengo que acordarmede cambiar la configuración de compi-lación de Visual Studio a la hora degenerar el instalador.

Una vez agregada la salida del pro-yecto Servidor, tenemos que añadir unaacción personalizada(Custom Action) para lainstalación. Para ello, en elExplorador de solucioneshacemos clic con el botónderecho en el proyecto Ins-talador y seleccionamos enel menú contextual “View”| “Custom Actions”. En lapestaña que aparece, hace-mos clic con el botón dere-cho en “Custom Actions” yseleccionamos “Add Cus-tom Action”. Y en el cuadrode diálogo subsiguiente, nosvamos a “Application Fol-der” y seleccionamos la sali-da principal (Primary Output) del pro-yecto que acabamos de añadir.

Si en este momento compilamos yejecutamos el instalador, nos preguntarápor la ruta en la que queremos instalar. Yen esa ruta nos copiará tanto el ejecuta-ble como su archivo de configuración.

Solo nos queda hacer que el insta-lador nos pregunte en qué direcciónqueremos publicar los servicios. Tene-mos que añadir un cuadro de diálogo ala interfaz del instalador con un cuadrode texto en el que se podrá indicar esadirección. Para ello, en el Exploradorde soluciones hacemos clic con el botónderecho sobre el proyecto Instalador yseleccionamos en el menú contextual“View” | “User Interface”. En la nue-va pestaña que aparece, nos vamos alnodo “Install” | “Start”, hacemos cliccon el botón derecho y seleccionamos“Add Dialog”, y luego el diálogo pre-definido “TextBoxes (A)” (figura 2).

Una vez añadido el diálogo, en elárbol donde se nos muestran los dife-rentes pasos del proceso de instalaciónaparecerá un nuevo elemento. Debe-

dotN

etM

anía

<<

43

dnm.plataforma.net<<

Figura 1

Figura 2

Cuando tengamos en un pro-yecto un archivo app.config, alcompilar el proyecto el archivopasará a llamarse de la mismaforma que el ensamblado resul-tante, pero con la extensión.config añadida.

[ ]NOTA

Page 44: dotNetManía - sergiogonzalezc.files.wordpress.com · Nueva herramienta de monitorización en SQL Server 2008 38-40 SQL Server 2008 incorpora una nueva herramienta que será la base

dotN

etM

anía

<<

44

dnm.plataforma.net<<

mos posicionarlo después del de bien-venida (“Welcome”). El cuadro de diá-logo predefinido que hemos añadidoofrece cuatro cuadros de texto. Comosolo necesitamos uno, en las propieda-des de ese cuadro de dialogo cambia-remos los valores de Edit2Visible,Edit3Visible y Edit4Visible a false, paraque no aparezcan durante la instalación.

Si en este punto compilamos y eje-cutamos el instalador, veremos ésteincluirá ahora un nuevo paso con el cua-dro de diálogo que recién hemos aña-dido después de la bienvenida.

Por último, solo nos queda recogerel dato que se introduzca en el cuadro detexto del diálogo y actualizar con él elarchivo de configuración. Para ello, nece-sitamos agregar a la solución un nuevoproyecto de tipo Librería de clases quecontenga una clase especial que va a serllamada cuando se ejecute la instalación.Llamaremos a este proyecto A yudaInsta-lacion. Al crearlo, Visual Studio nos agre-gará por defecto una clase que no nos vaa hacer falta, así que la eliminamos.Entonces añadimos al proyecto un ele-mento de tipo InstallerClass, al que lla-maremos A ctualizarConfiguracion (figu-ra 3). Con esto se añadirán al proyecto lasreferencias a todos los ensamblados nece-sarios que van a hacer posible la ejecu-ción del código que escribamos cuandose instale nuestro Servidor.

Si nos vamos a la vista de código del

elemento añadido, veremos que se tra-ta de una clase que hereda de la claseInstaller de .NET Framework. Estaclase implementa toda la funcionalidadnecesaria para operar en el contexto deuna instalación, y nos permite sobres-cribir ciertos métodos que se van a eje-cutar en determinados momentos de lainstalación. Aquí lo que queremos esque en el momento de la instalación seactualice el código del archivo de con-figuración con la dirección que se hayasuministrado durante el proceso.

Tenemos que añadir otro “PrimaryOutput” al proyecto de instalación,como ya hicimos anteriormente, peroesta vez añadimos el proyecto A yu-daInstalación. La idea es que el instala-dor despliegue con el proyecto lalibrería de clases, a la que llamaremospara que se encargue de actualizar elarchivo de configuración.

Como cabría esperar, la llamada a lalibrería de clases debemos implementar-la como otra acción personalizada, aun-que esta vez la añadimos debajo del nodo“Install” (figura 4). Y como deberemospasarle el texto que se haya introducidoen el cuadro de texto para que sepa conqué actualizar el A pp.config, selecciona-mos “Primary output from Ayudainsta-lacion” y modificamos su propiedad Cus-tomA ctionData como se muestra en la figu-ra 4. De esta manera indicamos que loque se escriba en el cuadro de texto con

nombre “EDITA1” se debe guardar enel contexto de la instalación bajo la clave“direccion”, lo que hará que ese valor seaaccesible para el código de la acción per-sonalizada que acabamos de añadir.

Finalmente, vamos al proyecto A yu-daInstalacion y escribimos el códigonecesario para actualizar el archivoA pp.config. En la clase A ctualizarConfi-guracion, sobrescribimos el método Ins-tall como se muestra en el listado 1.

En el código, inicialmente se obtie-ne la ruta completa del archivo de con-figuración, que va a ser la concatena-ción de la ruta de instalación y el nom-bre del archivo de configuración. Laruta de instalación también se pasacomo un parámetro en el contexto dela instalación, y el nombre del archivode configuración es Servidor.exe.con-fig (o Cliente.exe.config para el pro-yecto Cliente). A continuación, y unavez obtenida la dirección que se ha pasa-do al instalador (que debería validarsemediante expresión regular u otra téc-nica), se carga el contenido del archivode configuración en un XElement y semodifican los elementos y los atributosque nos interesan. Lo que necesitamoses cambiar el valor del atributo baseA d-dress, reemplazando en él “localhost”por la dirección pasada al instalador.Gracias a LINQ to XML, esta tareapuede llevarse a cabo de una maneramuy sencilla.

ConclusiónA lo largo de este artículo, hemos mos-trado cómo crear un proyecto de ins-talación personalizado que nos permi-ta especificar en tiempo de instalación

Figura 4

Figura 3

Page 45: dotNetManía - sergiogonzalezc.files.wordpress.com · Nueva herramienta de monitorización en SQL Server 2008 38-40 SQL Server 2008 incorpora una nueva herramienta que será la base

dotN

etM

anía

<<

45

dnm.plataforma.net<<

la dirección de nuestros serviciosWCF. De esta manera, cada vez quevayamos a desplegar nuestro servidorno tendremos que tocar las configu-raciones a mano, cosa muy tendiente

a errores. Solo tendremos que pasar-le la dirección durante la instalación,y nuestros servicios quedarán confi-gurados, preocupándonos tan solo unavez sobre cómo vamos a configurarlos

en desarrollo, y olvidándonos de estetema en lo adelante. Esta misma téc-nica podemos aplicarla exactamentede la misma manera a las aplicacionesclientes.

using System.Collections;using System.Collections.Generic;using System.ComponentModel;using System.Configuration.Install;using System.Xml.Linq;

namespace A yudaInstalacion{

[RunInstaller(true)]public partial class A ctualizarConfiguracion : Installer{

public A ctualizarConfiguracion(){

InitializeComponent();}

public override void Install(IDictionary stateSaver){

base.Install(stateSaver);

// Obtenemos la ruta completa al archivo de configuraciónstring ruta = Context.Parameters[“assemblypath”];int ultima = ruta.LastIndexOf(“\\”);ruta = ruta.Substring(0, ultima + 1);ruta += “Servidor.exe.config”;

// Obtenemos dirección del serviciostring direccion = Context.Parameters[“direccion”];

// Reemplazamos “localhost” por dirección obtenidaXElement config = XElement.Load(ruta);IEnumerable<XElement> direcciones =

config.Descendants(“baseA ddresses”);foreach (XElement dir in direcciones){

foreach (XElement add in dir.Descendants(“A dd”)){

foreach (XA ttribute atr in add.A ttributes()){

if (atr.Name.LocalName == “baseA ddress”)atr.Value = atr.Value.Replace(“localhost”, direccion);

}}

}config.Save(ruta);

}}

}

Listado 1. Código de la clase instaladora.

Referencias

Documentación MSDN sobre proyectos de instalación: http://msdn.microsoft.com/es-es/library/2kt85ked.aspx

Documentación MSDN sobre LINQ to XML:http://msdn.microsoft.com/es-es/library/bb387098.aspx

[1]

[2]

Page 46: dotNetManía - sergiogonzalezc.files.wordpress.com · Nueva herramienta de monitorización en SQL Server 2008 38-40 SQL Server 2008 incorpora una nueva herramienta que será la base

Introducción

Las pruebas unitarias son uno de los principalesrecursos con que contamos para poder asegurar lacalidad de nuestros desarrollos; son una herra-mienta imprescindible no solo para testers, sinotambién para desarrolladores.

Como muchos ya sabréis, una prueba unita-ria no es más que un trozo de código que pruebaotro trozo de código. Su objetivo principal es elde comprobar que el código implementado, sobreel que se desarrolla la prueba, se comporta tal ycomo se espera de él. Si algún lector no está fami-liarizado con las pruebas unitarias, o está intere-sado en recordar las características que debe teneruna buena prueba unitaria y los beneficios queéstas nos aportan, les recomiendo que revisen losenlaces que se incluyen al final del artículo.

Aunque anteriormente ya existían herramien-tas para pruebas unitarias (por ejemplo, NUnit),la aparición de Visual Studio Team System(VSTS) fue un hito importante para los profesio-nales que trabajamos con tecnologías Microsoft.VSTS incorpora toda una serie de herramientasy funcionalidades que nos permitirán implemen-tar las tareas relacionadas con las pruebas unita-rias de una manera más productiva y eficaz: gene-ración de código de pruebas, ejecución de las prue-

bas desde el IDE, evaluación de la cobertura decódigo de las pruebas, entre otras.

Prueba de servicios WCFA lo largo de este punto, describiremos los aspec-tos más importantes a tener en cuenta cuando que-ramos realizar pruebas unitarias sobre serviciosWCF. Las pruebas unitarias a realizar sobre los ser-vicios WCF podrían realizarse de la misma mane-ra que sobre cualquier otro tipo de módulo, salvopor una peculiaridad que es importante conocer.

Los servicios WCF son expuestos a través deun host, generalmente Internet Information Ser-ver, y poseen una configuración que indica cómoellos se exponen: HTTP, HTTPS, TCP, etc. Poreste motivo, al menos una de las pruebas queimplementemos debe tener como objetivo com-probar que la configuración del servicio es correc-ta y que recibirá adecuadamente las peticiones delas aplicaciones cliente.

La prueba unitaria que implementemos tieneque simular ser un cliente real. Para ello, en el pro-yecto de pruebas en el que tenemos la prueba uni-taria tendremos que generar un proxy del servicio aprobar e invocar a los métodos del servicio a travésde ese proxy, como si fuese un objeto de un cliente.

Pruebas unitarias Un enfoque práctico

ALManía

Ibon Landa es Software Architecten AvanGroup. Cola-bora activamente conel grupo de usuarios

Artalde.NET y escribeen http://geeks.ms/blogs/

ilanda.

Mucho se ha hablado sobre las características que deben cumplir laspruebas unitarias y sobre los beneficios que nos aporta su uso. Por estemotivo, en este artículo intentaremos dar un paso más y profundizaren el mundo de las pruebas unitarias, intentando aportar un enfoquepráctico, centrado en explicar algunos de los recursos que tenemosactualmente a nuestra disposición.

Ibon Landa

Page 47: dotNetManía - sergiogonzalezc.files.wordpress.com · Nueva herramienta de monitorización en SQL Server 2008 38-40 SQL Server 2008 incorpora una nueva herramienta que será la base

El siguiente paso es asegurarnos deque siempre que ejecutemos la pruebael servicio a probar esté a la escucha,porque de lo contrario nuestra pruebafallaría. Si el proyecto en el que se alber-ga el servicio es una librería de servi-cios WCF, no es necesario realizar nin-guna acción adicional para conseguirque el servicio esté a la escucha en elmomento de ejecutar la prueba. Estetipo de proyectos hace uso del host deservicio de WCF (WcfSvcHost) para hos-pedar el servicio de manera automáti-ca. Si el servicio está en un proyectoWeb de WCF, este proceso no se rea-lizará de manera automática. Será nece-sario usar el atributo A spNetDevelop-mentServer y el método TryUrlRedirec-tion [1] en el método que implementala prueba (listado 1).

El atributo A spNetDevelopmentServerpermite que creemos un servidor dedesarrollo para el servicio; servidor tem-poral que se arrancará en el momentoen que ejecutemos la prueba y que fina-lizará al terminar la prueba. Este servi-

dor establece el puerto de escucha deforma dinámica, lo que podría hacerque la prueba fallase, al no coincidir laURL que se ha creado en el servidorcon la URL que está establecida en elfichero de configuración. Para hacerque la URL que se crea coincida con laque tenemos configurada se usa elmétodo TryUrlRedirection.

El problema con el que nos encon-traremos aquí es que podemos usar esteservidor para probar servicios WebASP.NET, pero no podemos usarlo conservicios WCF. La solución al proble-ma es implementar nuestro propiométodo TryUrlRedirection, tal y comose muestra en el listado 2.

Si obviamos esta peculiaridad, pro-bar la lógica que incluya el servicio seríacomo probar cualquier otro módulo de

nuestra aplicación. Tendremos quegenerar tantas pruebas unitarias comoconsideremos necesarias con el objeti-vo de cubrir el mayor número de esce-narios posibles que puedan darse den-tro del servicio.

Es importante tener en cuenta quelas pruebas unitarias deben estar limi-tadas a probar la funcionalidad propiadel servicio, por lo que es necesarioindependizarlo del resto de módulos delos que pueda depender usando mocks.

MocksLos mocks son un recurso muy útil

y necesario en el desarrollo de pruebasunitarias, que nos van a permitir poderprobar un módulo independientemen-te del resto de módulos de la aplicacióno de dependencias externas. No sonotra cosa que objetos falsos que simu-lan el comportamiento de un objetoreal. Estos objetos falsos son los que seusarán durante la ejecución de la prue-ba unitaria, lo que posibilitará que no

necesitemos el objeto real y que nodependamos de él para poder probarcorrectamente y de manera completanuestro módulo. Por ejemplo, sepodrían usar mocks para independizarlas pruebas del servicio WCF de la lógi-

[TestMethod()]

[A spNetDevelopmentServer(“ServiceServer”, @”C:\UTDemo\ServiceDemo”)]

public void A ddUserTestWithProxy()

{

ServiceReference1.ServiceSampleClient

target = new ServiceReference1.ServiceSampleClient();

A ssert.IsTrue(

this.TryUrlRedirection(

target,

testContextInstance,

“ServiceServer”),

“Web service redirection failed.”

);

bool expected = false;

bool actual;

actual = target.A ddUser(null);

A ssert.A reEqual(expected, actual);

}

Listado 1

public bool TryUrlRedirection(object client, TestContext context, string identifier)

{bool result = true;try{

PropertyInfo property = client.GetType().GetProperty(“Endpoint”);

string webServer = context.Properties[string.Format(“A spNetDevelopmentServer.{0}”, identifier)].ToString();

Uri webServerUri = new Uri(webServer);ServiceEndpoint endpoint =

(ServiceEndpoint)property.GetValue(client, null);string serviceA ddress = endpoint.A ddress.Uri.OriginalString;serviceA ddress = serviceA ddress.Replace(

endpoint.A ddress.Uri.A uthority, webServerUri.A uthority);endpoint.A ddress = new EndpointA ddress(serviceA ddress);

}catch (Exception){

result = false;}return result;

}

Listado 2

dotN

etM

anía

<<

47

dnm.ALManía<<

Page 48: dotNetManía - sergiogonzalezc.files.wordpress.com · Nueva herramienta de monitorización en SQL Server 2008 38-40 SQL Server 2008 incorpora una nueva herramienta que será la base

dotN

etM

anía

<<

48

dnm.ALManía<<

ca de negocio, o poder probar la lógica de negociosin necesidad de disponer de la capa de acceso a datos.

El concepto de mock es sencillo; si tanto el obje-to real como el objeto falso implementan la mismainterfaz y el módulo que estamos probando trabajacontra interfaces en lugar de contra objetos, podre-mos hacer uso indistintamente del objeto falso o delreal sin que esto afecte al módulo, siempre y cuandoambos objetos tengan el mismo comportamiento.

Para poder realizar pruebas unitarias que cum-plan con los requisitos de lo que debe ser una buenaprueba, el uso de mocks debería ser un recurso cons-tante dentro de nuestras pruebas. Pero la generaciónde mocks puede llegar a ser un proceso pesado, lo queprovoca que no siempre los empleemos. Al menos,deberíamos siempre usar mocks en los casos de depen-dencias externas con otros equipos de desarrollo o demódulos con lo que tengamos que integrarnos.

Aunque existen varios frameworks, como Rhino-Mock o NMock, que permiten generar estos obje-tos falsos, no debemos olvidar que cualquier objetofalso que creemos puede considerarse un mock, aun-que no se haga uso de un framework específico. Porejemplo, si el módulo que estamos probando debe lla-mar a un servicio Web externo a nuestra aplicación,podríamos simular esta dependencia generando nues-tro propio servicio Web que exponga la misma inter-faz que el servicio real.

En el ejemplo que se describe a continuación,supondremos que el módulo que estamos probandodebe hacer uso de un helper de envío de correoselectrónicos que no es mantenido por nuestro equi-po de desarrollo. En este caso, es conveniente gene-rar un mock para simular esta dependencia y poder

probar nuestros desarrollos sin disponer del módulode envío de correos. Para el ejemplo, hemos hechouso de RhinoMock [3]. La clase de envío de correosimplementa la interfaz IMail (listado 3).

La clase que implementa la lógica de negocio (lis-tado 4), donde se hace uso del módulo de envío decorreos, debe implementar dos constructores: uno sinparámetros, que será el que se utilice en el mundoreal, y otro que recibe como parámetro un objeto detipo IMail, que será el que se emplee en las pruebasunitarias.

En el código fuente que se muestra en el listado5 podéis ver cómo sería la prueba unitaria que empleaun mock.

El método MyTestInitialize se utiliza para inicia-lizar los mocks que se emplearán en las pruebas que seincluyen dentro de la clase. En este método creare-

public interface IMail{

bool SendMail(string subject, string body);bool SendMail(string subject, string body,

string to, string from);}

Listado 3

public class CustomerBL : ICustomerBL{

private IMail mailHelper;

public ERPServiceClient service;

public CustomerBL(){

service = new ERPServiceClient();this.mailHelper = new Mail();

}

public CustomerBL(IMail mail){

service = new ERPServiceClient();this.mailHelper = mail;

}

// ...}

Listado 4

Los mocks no son otra cosa que objetos falsos que

simulan el comportamiento de un objeto real

Page 49: dotNetManía - sergiogonzalezc.files.wordpress.com · Nueva herramienta de monitorización en SQL Server 2008 38-40 SQL Server 2008 incorpora una nueva herramienta que será la base

dotN

etM

anía

<<

49

dnm.ALManía<<

mos el repositorio de mocks, inicializa-remos los mocks que se utilizarán y cre-aremos el objeto sobre el que realiza-remos las pruebas (CustomerBL), pasán-dole como parámetro el objeto mock quequeremos se utilice, con lo que conse-guiremos que el objeto que se está pro-bando use el objeto falso en lugar de unobjeto real.

En el método InitializeMockObjectes donde se describe el comportamientoque tendrá el objeto falso ante determi-nados parámetros de entrada. En el lista-do 5 se describen dos comportamientospara el método SendMail; en uno de ellosse devuelve true, mientras que en el otrose genera una excepción. Lógicamente,el comportamiento debe ser el mismo quetendría que el objeto real ante los mismosparámetros de entrada.

El último paso sería generar losmétodos de prueba que cubren la fun-cionalidad de nuestra aplicación,haciendo uso de los objetos que hemoscreado anteriormente.

En una de las pruebas se hace usodel atributo ExpectedException. Con esteatributo, lo que estamos indicando esque la ejecución de la prueba generauna excepción del tipo que se indicacomo argumento del atributo. En estaprueba se hace uso de dicho atributopara comprobar que el método que seestá probando genera la excepción ade-cuada cuando los parámetros no soncorrectos, asegurándonos así de que elmétodo que está sometido a la pruebacomprueba los parámetros de entrada.Por tanto, que se genere la excepciónsignifica que la funcionalidad es la ade-cuada.

Orígenes de datos en VSTSEn algunas ocasiones, para poder pro-bar de forma completa un módulo esnecesario probar muchas variantes delos parámetros de entrada. Por ejem-plo, supongamos que el método paraañadir un cliente que expone un servi-cio valida los parámetros de entrada, yque la forma de validación es a travésde una expresión regular, ya que se sigueuna lógica especial para decidir si el

[TestClass()]public class CustomerBLTest{

private MockRepository _mocks;

private IMail mailMock;

private CustomerBL customerBL;

private TestContext testContextInstance;

[TestInitialize()]public void MyTestInitialize(){

// Se crea un repositorio de mocks_mocks = new MockRepository();

// Creamos un mock que implemente IMail.mailMock = _mocks.CreateMock<IMail>();

// Inicializamos el uso de los objetos mocksInitializeMockObject();_mocks.ReplayA ll();

// Creamos una instancia de objeto pasándole el objeto mockcustomerBL = new CustomerBL(mailMock);

}

private void InitializeMockObject(){

Expect.On(mailMock).Call(mailMock.SendMail(“subject”, “body”,

null, “[email protected]”)).Throw(new A rgumentException());

Expect.On(mailMock).Call(mailMock.SendMail(“subject”, “body”,

[email protected]”, “[email protected]”)).Return(true);

}

[TestMethod()]public void A ddUserTest(){

CustomerEntity customer = new CustomerEntity();customer.Name = “MyName”;customer.A ddress = “YYY”;customer.Mail = “[email protected]”;

string actual = customerBL.A ddUser(customer);A ssert.IsNotNull(actual);

bool actualExists = customerBL.ExistCustomer(actual);A ssert.A reEqual(true, actualExists);

}

[TestMethod()][ExpectedException(typeof(A rgumentException))]public void A ddUserTestException(){

CustomerEntity customer = new CustomerEntity();customer.Name = “MyName”;customer.A ddress = “YYY”;customer.Mail = null;

string actual = customerBL.A ddUser(customer);}

Listado 5

Page 50: dotNetManía - sergiogonzalezc.files.wordpress.com · Nueva herramienta de monitorización en SQL Server 2008 38-40 SQL Server 2008 incorpora una nueva herramienta que será la base

dotN

etM

anía

<<

50

dnm.ALManía<<

nombre es válido. En este caso, nos interesará pro-bar diferentes variaciones del nombre del cliente paracomprobar que la validación es la adecuada. Parapoder conseguirlo, podremos generar tantas pruebascomo queramos con las diferentes variaciones posi-bles que se nos ocurran.

El framework de pruebas unitarias de VSTS nosofrece otra alternativa: generar una única prueba y car-gar los diferentes escenarios de datos desde un origende datos. Este origen de datos puede ser una base dedatos, o un fichero XML o CSV. El resultado que obte-nemos es como si ejecutásemos la prueba tantas vecescomo número de registros tenga el origen de datos.

Para poder conseguir esta funcionalidad, se debehacer uso de los atributos DeploymentItem y Data-Source (listado 6). El atributo DeploymentItem (quepuede aplicarse múltiples veces) permite especifi-car un fichero a utilizar como origen de datos parala prueba. En este caso se indica que se desea uti-lizar el fichero Customers.csv, que contiene todoslos valores posibles que queremos probar comoparámetro de entrada. Por otra parte, mediante elatributo DataSource se indica el origen de datos quese empleará en la prueba, así como la forma de acce-der al mismo.

Aunque estos atributos pueden ser especificadosde manera manual, VSTS nos permite establecer losorígenes de datos a través de las propiedades de laprueba unitaria, lo que facilita aún más el proceso degeneración de las pruebas.

En el código de la prueba, podremos acceder a losdatos a través de la variable TestContext que posee laclase de pruebas, usando la propiedad DataRow, comomuestra el ejemplo.

ConclusiónLas pruebas unitarias son uno de los recursosimportantes con que contamos los desarrolladores

para poder asegurar la calidad de nuestras aplica-ciones. Pero aunque los beneficios de las pruebasunitarias puedan parecer claros, no es más ciertoque a día de hoy se usan en muy pocos proyectos.El desconocimiento en esta materia, la falta de tra-dición y algunos falsos mitos pueden ser la causade que su utilización no esté tan extendida comosería deseable.

Como desarrolladores, debemos ser los primerosinteresados en la utilización de pruebas unitarias, yaque somos los primeros responsables de la calidad delproducto. Gracias a ellas, conseguiremos aplicacio-nes de mayor calidad y con un coste de mantenimientomucho menor.

A través de este artículo, hemos pretendidoofrecer una visión práctica de algunos de los recur-sos con los que contamos los desarrolladores paragenerar pruebas unitarias de una manera más efi-ciente y productiva (pruebas de servicios, mocks),y de esta manera animar a su utilización por par-te del lector.

Enlaces de interésIntroducción a las pruebas unitarias. http://msdn.microsoft.com/es-es/library/ms182515(VS.80).aspx

Programación básica con WCF. http://msdn.microsoft.com/es-es/library/ms731067.aspx

RhinoMock. http://ayende.com/projects/rhino-mocks.aspx

Blog de Luis Fraile. http://www.lfraile.net

Blog de Ibon Landa. http://geeks.ms/blogs/ilanda/

[1]

[2]

[3]

[4]

[5]

[TestMethod()][DeploymentItem(“Service.Test\\Customers.csv”)][DataSource(“Microsoft.VisualStudio.TestTools.DataSource.CSV”,

“|DataDirectory|\\Customers.csv”,“Customers#csv”, DataA ccessMethod.Sequential)]

public void A ddUserTest(){

ServiceDemo.Service target = new ServiceDemo.Service();CustomerEntity customer = new CustomerEntity();customer.Name = this.TestContext.DataRow[0].ToString();customer.A ddress = his.TestContext.DataRow[1].ToString();customer.Mail = “[email protected]”;target.A ddUser(customer);

}

Listado 6

Page 51: dotNetManía - sergiogonzalezc.files.wordpress.com · Nueva herramienta de monitorización en SQL Server 2008 38-40 SQL Server 2008 incorpora una nueva herramienta que será la base
Page 52: dotNetManía - sergiogonzalezc.files.wordpress.com · Nueva herramienta de monitorización en SQL Server 2008 38-40 SQL Server 2008 incorpora una nueva herramienta que será la base

La respuesta rápida es que Close es mejor que Dis-pose para liberar proxies de WCF cuando has aca-bado con ellos. La comprensión de por qué Closees mejor que Dispose tiene su intríngulis, pero no estan complicada a fin de cuentas.

La diferencia entre ambos métodos existe soloen presencia de una sesión de transporte. ¿Qué esuna sesión de transporte en WCF? Pues el equiva-lente a la pila de llamadas en la programación tra-dicional. Cuando instancias una clase y obtienes unareferencia al nuevo objeto, esa referencia es guar-dada en la pila. La pila representa un enlace entreun cliente dado y ese objeto. Ningún otro clientepodrá llamar a ese objeto.

En WCF, el cliente no instancia realmente elpropio servicio, de forma que no sería posibleningún enlace directo a través de una pila de lla-madas. Sin embargo, es posible establecer una aso-ciación entre el cliente y el servicio, y ésta se rea-liza en base al concepto de sesión de transporte.En virtud de esta sesión de transporte, todas las lla-madas desde un mismo cliente serán dirigidas almismo canal de transporte, estableciéndose de estaforma una "sesión" única con el cliente a nivel detransporte. La sesión de transporte es un atributoopcional de los enlaces (bindings) de WCF, y no

todos los enlaces lo soportan. El enlace necesitainformación sobre la identidad del cliente con lafinalidad de crear y mantener estos canales “úni-cos”. El enlace básico HTTP, por ejemplo, nosoporta sesión de transporte. El canal de la sesiónde transporte es, en caso de que exista, destruidocuando el proxy cierra la sesión explícitamentemediante el método Close. También es destruidadespués de un período de inactividad configurabledesde el cliente, que por defecto es de 10 minutos.

¿Qué sucede en caso de un fallo abrupto del ser-vicio, como cuando ocurre una excepción? En estecaso, el canal entero cae en estado de fallo (fault), ycualquier acción subsiguiente sobre el proxy origi-nará una excepción de comunicaciones; concreta-mente, una CommunicationObjectFaultedException.La misma excepción se produce cuando el clienteintenta utilizar el proxy después de agotado el tiem-po de espera.

De forma que utilizar Close para liberar el proxyes siempre adecuado. Usar Dispose, no. En particu-lar, esto implica que se debe tener cuidado con lapopular construcción using si el enlace está confi-gurado para usar una sesión de transporte. A propó-sito, la forma de habilitar la sesión de transporte esmediante la propiedad ReliableSession.

Trucos de WCF

Dino Esposito

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

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

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

regular en eventos de laindustria de ámbito

mundial, como Tech-Edo DevConnections, y

europeos, como Dev-Week y Basta.

En mi sesión diaria de tormenta de ideas, he empezado a preguntarme si la mejor formade liberar un objeto proxy de WCF es mediante Dispose o Close. A mí (y de acuerdocon mis pruebas), ambas me parecen lo mismo. Pero entonces, ¿por qué tenemos dosopciones?

todotnet@qa

Este mes exploramos un par de temas relacionados con WCF y uno de ASP.NET MVC. A propó-sito de ASP.NET MVC, me gustaría responder brevemente a una pregunta que se repite frecuen-temente en cursos y a través de artículos: todas las características no relacionadas con la interfazde usuario en ASP.NET, tales como autenticación, membresía/roles, caché, sesión, perfiles, o módu-los/manejadores de HTTP están totalmente soportados en ASP.NET MVC; además, exactamentede la misma forma. Dicho esto, vamos con la primera pregunta de este mes.

tod

otN

et.q

a@

dot

netm

ania

.com

Page 53: dotNetManía - sergiogonzalezc.files.wordpress.com · Nueva herramienta de monitorización en SQL Server 2008 38-40 SQL Server 2008 incorpora una nueva herramienta que será la base

Consideremos el siguiente código:

Si se utiliza una sentencia using, siempre se hará unallamada a Dispose para el proxy al final del bloque. Sinembargo, en el caso en que se produzca cualquier excep-ción dentro del bloque, y se esté utilizando una sesión detransporte, la excepción del servicio pondrá al canal enestado de fallo, y la llamada a Dispose sobre el proxy lan-zará la excepción de comunicaciones, que saldrá del blo-que using. El código que siga al bloque using, por tanto,nunca será alcanzado en caso de excepción.

¿Quiere eso decir que nunca se debe utilizar bloquesusing con proxies con sesiones de transporte? En absolu-to. Basta con encapsular el bloque using en una estructu-ra try/catch, como se muestra en el listado 2.

El mejor código que se puede escribir al trabajar conproxies es el que puede ver en el listado 3.

Para ser más quisquillosos, la posible excepción de comu-nicaciones podría atraparse en el método del proxy; de estaforma, no habría necesidad de capturarla en el cliente.

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<<

Cualquier esqueleto de prueba unitaria generado automá-ticamente no sería más que eso, un esqueleto que habríaque rellenar con los detalles. En la realidad, para hacerpruebas unitarias serias, lo mejor es desarrollar uno mis-mo los propios métodos con todos los niveles de mocks(pruebas) que sean necesarios.

Personalmente, no estoy al tanto de ninguna herra-mienta que pudieras utilizar. Sin embargo, si el problemaes ahorrar algo de tiempo, podrías crear plantillas perso-nalizadas para generadores de código como CodeBreezeo CodeSmith. Tu plantilla analizaría el contrato y produ-ciría los cuerpos de las pruebas, que llamarían a los méto-dos a través de un proxy (generado, de factoría) para un canal.En este contexto, los detalles que quedarían por rellenarserían solo los valores a utilizar para los parámetros y lo quese quiere hacer para comprobar los valores de retorno.

Sin embargo, te recomiendo que escribas prime-ro pruebas unitarias para la clase de servicio, de for-ma que puedas comprobar inicialmente los casos sen-cillos, y eliminar cualquier posible problema debidoa la capa de WCF. Luego se necesitarán mocks para lascapas subyacentes, tales como la de acceso a datos.Una vez que la clase funcione sobre .NET, se podráncopiar las pruebas en otras nuevas que “ataquen” a lacapa de WCF. Entre otras cosas, podrías desear escri-bir pruebas unitarias que llamen a los servicios a travésde WCF sin mock alguno, para así comprobar toda lapila. Obviamente, esto es algo bastante tedioso y algocomplejo de preparar, porque requiere un trabajo deadaptación para el acceso a datos y otros servicios. Sinembargo, es necesario.

Los servicios WCF hay que probarlos. ¿Hay alguna forma de generar automáticamente pruebas uni-tarias? ¿O, al menos, esqueletos de pruebas para servicios WCF? ¿Alguna herramienta que reco-miendes?

using (MyServiceClient proxy = new MyServiceClient())

{try{

proxy.DoSomething();}catch{

// ...}

}Console.WriteLine(“¡Este punto nunca será

alcanzado en caso de excepción!”);

try{using (MyServiceClient proxy = new MyServiceClient()){try{proxy.DoSomething();

}catch{// ...

}}

}catch{// ...

}Console.WriteLine(“¡Este punto sí será alcanzado!”);

MyServiceClient proxy = new MyServiceClient();try{// llamar al método del proxy:proxy.DoSomething();// ...proxy.Close();

}catch{proxy.A bort();// ...

}

Listado 1

Listado 2

Listado 3

Page 54: dotNetManía - sergiogonzalezc.files.wordpress.com · Nueva herramienta de monitorización en SQL Server 2008 38-40 SQL Server 2008 incorpora una nueva herramienta que será la base

ASP.NET MVC no dispone de ningún flujo de trabajo detransición de páginas incorporado, como sí, por ejemplo,lo tiene WSCF (Web Client Software Factory). Resu-miendo, todo lo que hace ASP.NET MVC es implemen-tar un manejador HTTP más sencillo que captura las peti-ciones HTTP. Las peticiones son manejadas totalmentepor dicho manejador, por lo que no pasan a través del ciclode vida clásico de los formularios Web de ASP.NET. Envez de eso, el manejador llama a un método de una instan-cia de un controlador creada a medida. Así pues, no haymecanismos para la selección automática de la páginasiguiente. Las transiciones se controlan mediante códigoutilizando métodos ad hoc de los controladores como Redi-rect o RedirectToAction.

El sistema de enrutamiento no tiene mucho que ver conlas transiciones de páginas. Simplemente, permite añadirnuestros propios patrones de URL para que el manejadorHTTP los reconozca y los mapee a un controlador. EnASP.NET MVC, ninguna petición de URL está vinculadadirectamente a un recurso físico ASPX. Tú decides el for-mato de la URL y cómo se hacen corresponder sus partes ala clase controladora, el método a invocar y sus parámetros.

Respecto al botón de navegación hacia atrás y su con-trol mediante código, lo mejor es usar la nueva API (de ser-

vidor y de cliente) introducida por .NET Framework 3.5SP1. En pocas palabras, tú defines tus propias entradas dehistórico durante el proceso, y la API indicada hace el res-to simulando una llamada en un marco oculto, de formaque el navegador actualice su propio histórico. Este es unejemplo:

La URL falsa contiene información de estado definidapor ti. Cuando el usuario navega a una de esas URL ante-riores, se dispara el evento apropiado, llamado Navigate(nuevamente, de cliente y/o de servidor). La mayor partede esta API se maneja a través del nuevo control ScriptMa-nager. Para más información, consulta la documentaciónde MSDN.

En el momento de escribir estas líneas, no existe un caminode migración bien definido por Microsoft que explique cómorealizar la migración de WF 3.5 a 4.0. No obstante, la clá-sica respuesta de “depende del cliente” siempre es válida,aunque supongo que no de mucha ayuda en este contexto.

Unas cosas por otras, yo no diría que ahora no es unbuen momento para adoptar WF 3.5. Dentro de Micro-soft, algunos equipos de desarrollo están todavía lanzandoproductos que se basan en WF 3.5, como por ejemplo Offi-ce Communications Server R2. Si tienes realmente la nece-sidad de utilizar workflows, y unas perspectivas de calenda-rio que cumplir, entonces WF 3.5 es una gran tecnología.

Pero si el plazo de tiempo antes de que tengas que haceruna release significativa te lleva más allá de 2009 (más o menos

cuando se espera que .NET Framework 4.0 sea liberado),saltarse WF 3.5 y abordar directamente WF 4.0 es una opciónmás que interesante. WF 4.0 elimina una gran cantidad deaspectos difíciles asociados con el desarrollo en WF 3.5, perose trata de una rampa de lanzamiento nueva, por decirlo así.El modelo de fondo es el mismo, pero muchos detalles sondiferentes. Y tengo el barrunto de que no me sentiría cómo-do con una solución desarrollada con WF 3.5 y luego migra-da a WF 4.0. Pero es solo mi opinión personal.

En caso de que te animes a probar WF 4.0, te sugiero quecontactes con Microsoft Ibérica y pidas ayuda al respecto. Unposible post que te puede ayudar lo tienes en la siguiente direc-ción: http://rickgaribay.net/archive/2008/11/20/november-pcsug-meeting-on-wf-3.5---recap--late.aspx.

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

Traducido al castellano por Marino Posadas

Mi empresa está pensando desarrollar algunas soluciones basadas flujos de trabajo. Pensamos lle-gar a tener el nivel de conocimientos necesario en unos pocos meses. Sin embargo, estaríamos tra-bajando con la versión actual (Workflow Foundation 3.5), que es posible que durante este perío-do se quede obsoleta ante la aparición de .NET Framework 4.0. Sería de mucha utilidad si pudieraenumerar qué características serán las mismas, cuáles van a cambiar, y cuáles son diferentes peroen el fondo parecidas.

void Button1_Click(object sender, EventA rgs e){// A quí el código de gestión del evento

// Marcar como punto históricostring state = “...”;ScriptManager.GetCurrent(this).A ddHistoryPoint(state);

}

Tengo un par de preguntas acerca de ASP.NET MVC. Primero, ASP.NET MVC suministra obviamentecontrol sobre el flujo de navegación de páginas, pero, ¿cómo lo hace? ¿Hay una forma de visualizar lastransiciones de página al estilo de los diseñadores de flujos de trabajo? ¿O hay que rellenar un ficherode configuración con las transiciones que se prevén? ¿Para esto es que sirven las tablas de enrutamien-to? En segundo lugar, ¿cómo se las arregla el framework para manejar el botón de navegación “Atrás”?¿Hace falta implementar un sistema propio para controlar esto, por ejemplo colocando información enel viewstate de la página?

Page 55: dotNetManía - sergiogonzalezc.files.wordpress.com · Nueva herramienta de monitorización en SQL Server 2008 38-40 SQL Server 2008 incorpora una nueva herramienta que será la base
Page 56: dotNetManía - sergiogonzalezc.files.wordpress.com · Nueva herramienta de monitorización en SQL Server 2008 38-40 SQL Server 2008 incorpora una nueva herramienta que será la base

dotN

etM

anía

<<

56

dnm.dnm.biblioteca.net<<

Pro Silverlight 2 in C# 2.0 Matthew MacDonaldEditorial: APressPáginas: 608Publicado: 2009ISBN: 978-1590599495Idioma: inglés

Esta nueva obra de Matthew MacDonald se enmarca en una iniciativa de la editorialAPress sobre la divulgación de esta tecnología que cubrirá 4 volúmenes distintos: unaintroducción (“Beginning Silverlight 2”), la obra que nos ocupa, una especie de receta-rio (“Silverlight 2 Recipes”) y la más avanzada (“Pro Silverlight 2 for the Enterprise”),que irán apareciendo a lo largo de este año. De hecho, el tercer título de esta serie, depublicación reciente, lo encontrará igualmente en lector en una de las referencias delfinal de esta página.

De todas las obras publicadas sobre el tema que están apareciendo en este momen-to, ésta aborda prácticamente todos los aspectos necesarios para comenzar la “segundafase” (tras la familiarización inicial con lo que significa programar con Silverlight 2), aun-que también podría servir de introducción a un programador que conozca ya algo deXAML y el lenguaje C#. La presentación de algunos aspectos relacionados con las apli-caciones empresariales y su distribución y mantenimiento completan este excelente tra-bajo, que ha sido muy bien acogido por los lectores.

Data Driven Services with Silverlight 2John PapaEditorial: O'ReillyPáginas: 366Publicado: enero de 2009ISBN: 978-0596523091Idioma: inglés

Prologada por uno de los más activos evangelistas de esta tecnología (Tim Heuer), estaobra aparece como un complemento más que adecuado de la anterior, al abordar todaslas posibles variantes de acceso a datos que ofrece la plataforma Silverlight 2.0 en su esta-do actual, tanto en lo relativo a la tecnología subyacente como a las herramientas nece-sarias para su puesta en marcha. Es de destacar que el autor es un viejo conocido, colum-nista habitual de la revista MSDN Magazine sobre temas relacionados con el tratamien-to de datos, y autor de varias obras de desarrollo, siempre relacionadas con este tema.

El libro aborda múltiples aspectos de las llamadas a servicios ASMX (SOAP), REST,POX, WCF, RSS y AtomPub, e incluye ejemplos reutilizables del uso en Silverlight detodas estas tecnologías, junto a algunos más extensos sobre ADO.NET Data Services,que nos permitirán conectarnos con cualquier servicio de datos disponible, incluyendoDigg, Amazon y Twitter Retrieve. A diferencia de la obra anterior, los ejemplos inclui-dos están disponibles tanto en C# como en VB.NET.

biblioteca.net

nove

dad

es Silverlight 2 Recipes: A problem-solution approach

Jit Ghosh y Rob Cameron. Editorial: APress. Páginas: 616. ISBN: 978-1590599778. Fecha

de publicación: diciembre de 2008. Idioma: inglés.

RESTful .NET: Build and Consume RESTful Web Services with .NET 3.5John Flanders. Editorial: O'Reilly. Páginas: 308. ISBN: 978-0596519209. Fecha de publica-

ción: diciembre de 2008. Idioma: inglés.

TEXTO: MARINO POSADAS

Page 57: dotNetManía - sergiogonzalezc.files.wordpress.com · Nueva herramienta de monitorización en SQL Server 2008 38-40 SQL Server 2008 incorpora una nueva herramienta que será la base

A finales del pasado mes de octubre de 2008, tuvo lugar en Madridla IV Conferencia de Usuarios de SharePoint, conocida comoC.E.U.S. y organizada por Microsoft España. C.E.U.S. es un eventoen el que se ofrecen diferentes contenidos para usuarios de Share-Point, que abarcan desde contenidos avanzados hasta contenidospara usuarios más noveles. Los eventos de esta IV Conferencia sedesarrollaron paralelamente en 8 salas, y desde las 9:30 de la mañanahasta las 18:30 de la tarde aproximadamente, tiempo suficiente paraabordar hasta 8 temas diferentes en los que también participaronempresas de primer orden del panorama empresarial español. Puedeobtener más información sobre C.E.U.S. 2008 enhttp://www.microsoft.com/spain/office/ceus2008.

Aprovechando las conferencias de C.E.U.S. 2008, se dio a cono-cer a SUGES (SharePoint User Group España), o lo que es lomismo, el primer grupo de usuarios de SharePoint en España.SUGES (http://www.suges.es) es una iniciativa surgida de la manode los cuatro MVP de SharePoint de España, que junto con otrosMVP y usuarios formaron el grupo de trabajo a principios del pasadomes de octubre de 2008.

Todos los inicios son siempre complicados y duros, pero losobjetivos de SUGES son bastante ambiciosos. Por una parte, la ideade SUGES no es otra que la de fomentar, colaborar de forma activa,ayudar a adquirir los conocimientos básicos de aprendizaje sobre laherramienta, y compartir el conocimiento sobre SharePoint deforma accesible.

SUGES comparte abiertamente el eslogan de C.E.U.S. 2008, enel que se cita literalmente que “lo natural es colaborar”. Esa es pre-cisamente la filosofía de SUGES, al igual que la del propio SharePoint:ser un punto central de colaboración entre usuarios del producto, y ennuestro idioma. Por esa razón, la idea de SUGES es la de ser el refer-ente como grupo de usuarios de SharePoint en España, y tender lamano a todas las personas que quieran colaborar con el grupo, apor-tar su experiencia, o enviar sus sugerencias y recomendaciones. Todocon un objetivo último: ser cada día mejores con SharePoint.

SharePoint, como sabrá, es un producto que cubre diferentesy muy variadas ramas dentro de la informática: desde la rama de lainstalación, pasando por la administración, la programación con.NET y el diseño para el diseñador de sitios SharePoint, y llegandohasta el usuario final, que es una de las partes fundamentales en laaportación del valor añadido al producto.

De acuerdo a los objetivos de SUGES, la idea fundamental esla de fomentar, promocionar y adoptar globalmente los productosy tecnologías SharePoint, y como valores añadidos, dar soporte ala comunidad apoyando a los grupos de usuarios locales, impulsaracciones diversas como webcasts, conferencias, laboratorios, sesionesATE (Ask The Experts), concursos, proyectos solidarios, proyec-tos colectivos, compartir recursos, documentos e información deinterés para el usuario de SharePoint, etc.

Debido a la separación geográfica que existe entre los diferentespuntos de nuestro territorio nacional, SUGES tiene como retos lacreación de 3 ciclos de conferencias anuales por diferentes puntos denuestro país de un día de duración cada uno, y de unas 6 u 8 sesionespor ciclo, así como la realización de una gran conferencia anual deaproximadamente 2 días de duración, y de entre 12 y 16 sesiones.

Dentro de las iniciativas de SUGES, se debe destacar tambiénel mantenimiento de un sitio Web denominado Proyecto SUGES,dedicado en exclusiva a compartir componentes open source paraSharePoint, y donde ya encontrará las primeras aportaciones.Puede acceder al Proyecto SUGES en CodePlex: http://www.code-plex.com/suges.

Ser miembro de SUGES no implica ninguna responsabilidad,aunque se valora que todos aportemos y colaboremos en la medida denuestras posibilidades. Tampoco pertenecer a SUGES representaningún coste adicional; lo único que se requiere es ilusión y ganas.

Recuerde que puede darse de alta y acceder a los recursos deSUGES accediendo a la Web del Grupo de Usuarios, que encon-trará en http://www.suges.es.

TEXTO: JORGE SERRANO dotN

etM

anía

<<

57

comunidad.net

SUGESSharePoint User Group España

SUGES• Ubicación: España• Fecha de fundación: 03/10/2008• Número de miembros: 181• Página Web: www.suges.es• Email de contacto:[email protected]

Page 58: dotNetManía - sergiogonzalezc.files.wordpress.com · Nueva herramienta de monitorización en SQL Server 2008 38-40 SQL Server 2008 incorpora una nueva herramienta que será la base

dotN

etM

anía

<<

58

desvánMarino Posadas

Channel 10 (http://on10.net o http://onten.net)publica una serie de vídeos relacionados conWindows 7, comenzando por la introducción“oficial”, de mano de Bill Veghte “Rocks Out

Windows 7 and Windows Live”, y complementándolo con otroscinco sobre el mismo tema y sobre el renovado Windows Live.Todo ello disponible en http://on10.net/blogs/maxpowerhouse7/CES-2009-Bill-Veghte-Rocks-Out-Windows-7-and-Windows-Live.Además, la página principal de Channel 10 bien merece una visi-ta periódica por las noticias de cabecera.

Channel 9. Y claro, el hermano mayor,Channel 9 (http://channel9.msdn.com) no podíaser menos, e incluye una página especial igual-mente dedicada al tema, donde analiza des-de aspectos concretos de utilización (como el

ribbon), hasta otros más vinculados con el desarrollo, como losrelacionados con Visual Studio 2010. Los primeros puedenencontrarse en la página http://channel9.msdn.com/posts/yochay/Windows-7-Ribbon-Deep-Dive. ¿Se acaba aquí el material nuevosobre Windows 7? Para nada. Para los amantes de lo “heavy”,nada como escuchar al más “heavy” de los sistemas operativos:Mark Russinovich, que también ofrece su visión sobre Win-dows 7 “Inside Windows 7”, disponible en http://channel9.msdn.com/shows/Going+Deep/Mark-Russinovich-Inside-Windows-7.

Channel 8 (para estudiantes). Y ya puestos, y dadoque no lo habíamos comentado antes en estasección, una referencia al “benjamín” de loscanales: Channel 8 (http://channel8.msdn.com).Todo sobre el mundo académico y las activi-dades relacionadas con las tecnologías Micro-

soft, en todo el globo. Es como el hermano pequeño de Chan-nel 9, y resulta similar en cuanto a contenidos e iniciativas depublicación. Además, se puede encontrar muy buena informa-ción sobre lo que se está haciendo en distintos departamentosde investigación de Microsoft.

Sitio de César de la Torre. Como Architect Evan-gelist en Microsoft Ibérica, César se mantienesiempre al día en las novedades que va presen-tando la compañía y complementa las noticiassobre productos con jugosos comentarios expli-

cativos que muchas veces ahorran más explicaciones. Disponi-ble en http://blogs.msdn.com/cesardelatorre.

TechSupport: un sitio de utilidades.Unode los sitios especializados en recopi-lar utilidades de interés, algunas para

desarrollo y otras para sistemas. En la página recomen-dada se analizan las “46 Best-ever Freeware Utilities”, lis-ta en la que, aparte de haber muy buenas herramientas,todo lo recomendado es gratuito. Accesible enhttp://www.techsupportalert.com/best_46_free_utilities.htm.

documentos en la red (especial Windows 7)

utilidades del mes

sitios del mes

Silverlight alcanza la mayoría de edad con un evento espectacular

Indudablemente, el departamento de Marketing de Microsoftse ha anotado un 10. Si hay un evento que haya sido visto porcasi por todo el mundo (más o menos tiempo, claro), ese ha sidola toma de posesión del nuevo presidente de EE.UU. La pre-sencia en la red ha sido masiva, y el sistema empleado para elstreaming de vídeo: Silverlight. Ya demostró sus capacidades enlas pasadas olimpiadas, y eso que el producto final no estabacompleto. Pero esa tecnología, que forma parte de la platafor-ma, sí lo estaba, ya que es producto de los departamentos deinvestigación de Microsoft.

Al tiempo, el apartado “ShowCase” del sitio oficial del pro-ducto (http://silverlight.net) ya muestra más de 200 aplicaciones,creadas por desarrolladores de todo el mundo y cuyas presenta-ciones y demos están accesibles desde allí. Y es que Silverlight hanacido con una vocación de universalidad. Afortunadamente, estádisponible para múltiples plataformas: Windows, Mac y Linux (através del proyecto MoonLight), y además, dentro del mundo Win-dows, los cinco navegadores principales lo soportan en sus últimasversiones (los últimos en "incorporarse" al club han sido Opera9.6 y Google Chrome 1.0).

Y es que, si una imagen vale más que mil palabras, el vídeomultiplica las imágenes (¿cuánto vale entonces?), y ya todo elmundo puede producir sus vídeos con el teléfono móvil. ¿Cómohacer que toda esa ingente cantidad de información multime-dia sea fácilmente accesible? El mes pasado hablábamos de lasestructuras de la Web 2.0. La integración de Silverlight en esasestructuras, ofreciendo un rendimiento óptimo en la descargade contenido multimedia, puede resultar fundamental en laadopción y propagación de esta tecnología. Y la facilidad deprogramación también, dicho sea de paso. Poner un vídeo enuna página desde Expression Blend requiere solamente un dobleclic sobre el fichero. Además, resulta interesante observar cómouna tecnología de investigación (el streaming adaptativo), pue-de incorporarse con éxito a las tecnologías cotidianas.

firma.firma.firma.firma

Page 59: dotNetManía - sergiogonzalezc.files.wordpress.com · Nueva herramienta de monitorización en SQL Server 2008 38-40 SQL Server 2008 incorpora una nueva herramienta que será la base
Page 60: dotNetManía - sergiogonzalezc.files.wordpress.com · Nueva herramienta de monitorización en SQL Server 2008 38-40 SQL Server 2008 incorpora una nueva herramienta que será la base