Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET ... · con VB.NET y C#. ¡Mi madre es un...

60
El modelo de objetos de Visual Studio .NET dotNetManía nº18 septiembre 2005 • 6,00 (España) Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Legal dotNetManía www.dotnetmania.com Dedicada a los profesionales de la plataforma .NET .NET y software libre ASP.NET 2.0 está aterrizando ToDotNet Q&A Añadiendo nuestra aplicación al área de notificación • Ordenación de datos en Reporting Services • Atención MySQL, aquí dotNet, ¿me recibe? • Interfaces •¡Mi madre es un Singleton! El modelo de objetos de Visual Studio .NET Entrevista Entrevista MVP Online Campus MVP Laboratorio Component Art Web UI 2.1 Tech-Ed 2005 Terminó el tiempo de espera Tech-Ed 2005 Terminó el tiempo de espera Alexander Vaschillo Equipo de desarrollo de SQL Server y WinFS Microsoft Corporation Alexander Vaschillo Equipo de desarrollo de SQL Server y WinFS Microsoft Corporation

Transcript of Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET ... · con VB.NET y C#. ¡Mi madre es un...

Page 1: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET ... · con VB.NET y C#. ¡Mi madre es un Singleton! 46-48 Siguiendo con el tema del último artículo, volvemos a tratar

El modelo de objetos de Visual Studio .NET

dotNetManíanº

18 se

ptiem

bre 2

005

• 6,

00 €

(Esp

aña)

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

Legal

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

.NET y software libre

ASP.NET 2.0 está aterrizandoToDotNet Q&A

Añadiendo nuestra aplicaciónal área de notificación •Ordenación de datos en

Reporting Services •Atención MySQL, aquídotNet, ¿me recibe? •Interfaces •¡Mi madre

es un Singleton!

El modelo de objetos de Visual Studio .NET

EntrevistaEntrevista

MVP OnlineCampus MVP

LaboratorioComponent Art Web UI 2.1

Tech-Ed 2005Terminó el tiempo de esperaTech-Ed 2005Terminó el tiempo de espera

Alexander VaschilloEquipo de desarrollo de SQL Server y WinFSMicrosoft Corporation

Alexander VaschilloEquipo de desarrollo de SQL Server y WinFSMicrosoft Corporation

Page 2: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET ... · con VB.NET y C#. ¡Mi madre es un Singleton! 46-48 Siguiendo con el tema del último artículo, volvemos a tratar
Page 3: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET ... · con VB.NET y C#. ¡Mi madre es un Singleton! 46-48 Siguiendo con el tema del último artículo, volvemos a tratar

Longhorn, Indigo, Avalon... ya son nom-bres para la historia también. Aún no he con-seguido quitarme de la cabeza a Yukon yWhidbey y ya tengo que entrenarme paradecir Windows Vista o Windows Commu-nication Foundation o Windows Presen-tation Foundation, o lo que es peor, las siglasWCF o WPF. Por favor, pronucie en voz alta:UVEDOBLECEEFE (y si no en inglés quees peor) y luego diga suavemente: Indigo...¿con cuál nos quedamos...? Puede repetir conWPF y Avalon con idénticos resultados. Claroque a lo mejor es como ir con zapatillas cómo-das a una fiesta de etiqueta; a todos nos gusta-ría más pero todos vamos con zapatos que esta-mos deseando quitarnos. A lo mejor el mar-keting es como ese tipo de normas sociales.Aunque hay empresas que han triunfado sinseguirlas, por ejemplo, Google o Yahoo, queno les dio por llamarse..., qué sé yo, GSE(Global Searching Engine), por ejemplo.

¡Y qué más da! La cuestión es que loscambios de nombres en clave por los nom-bres de “verdad” suponen entrar en la rec-ta final de una etapa de grandes cambios.Porque Windows Vista Beta 1 es el princi-pio de un gran cambio, no sólo para losusuarios de Windows, también para los pro-fesionales de las TI y sobre todo para losdesarrolladores. Ya tenemos el WinFXRuntime Components Beta 1 (para WindowsVista Beta 1) y un SDK, concretamente elMicrosoft WinFX Software Development Kitfor Microsoft Pre-Release Windows OperatingSystem Code-Named Longhorn, Beta 1 (nome cebaré...), y algunas ayudas para la pro-gramación con..., pérmitame que los escri-

ba por última vez, Avalon e Indigo, llama-das Visual Studio 2005 Extensions for WinFXBeta 1, para ir entrenándonos. Muchas betas1 para la beta 2 de Visual Studio 2005, peronecesarias para que desde hoy pueda tra-bajar con Windows Vista y las tecnologíasque están por llegar desde este otoño alverano que viene.

Bienvenido al número 18 de septiembrede 2005 de dotNetManía.

Le recomiendo la entrevista de MarinoPosadas a Alexander Vaschillo, del equipode desarrollo de SQL Server y WinFS enMicrosoft Corporation. Ahora podemos decir,sin temor a equivocarnos, que no tenemos niidea de cuándo saldrá WinFS (según nuestraspropias fuentes). Bromas aparte, es un todo unlujo tener un mes más a otro miembro del equi-po de desarrollo de SQL Server.

También hemos preparado desde Áms-terdam, una esmerada crónica de Tech-Ed2005 que espero le resulte entretenida.

Si tiene pensado emprender algún tipo deproyecto en .NET bajo alguna licencia de soft-ware libre o tiene curiosidad al respecto, leá-se el artículo de Javier Aragonés sobre losaspectos legales de éstas.

Por supuesto, no se pierda, además nohemos publicado nada anteriormente, el artí-culo de Carlos Quintero sobre el modelo deobjetos de Visual Studio .NET y que actuali-zaremos a Visual Studio .NET 2005 en elmonográfico sobre éste que prepararemos parael número de noviembre.

Por supuesto esto no es todo. Dentrohay más...

Espero que le guste.do

tNet

Man

ía<<

3

Recta finaldotNetManía

Dedicada a los profesionales de la plataforma .NET

Vol. II •Número 18 • Septiembre 2005Precio: 6€ (España)

EditorPaco Marín

([email protected])

AdministraciónPilar Pérez

([email protected])

Asesor TécnicoMarino Posadas

([email protected])

RedactoresAntonio Quirós, Dino Esposito, Guillermo

'guille' Som, Jorge Serrano, José ManuelAlarcón, Luis Miguel Blanco, MiguelKatrib (Grupo Weboo) y Pedro Pozo.

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

Mazzini, Eladio Rincón, Erich Bühler,Fernando Nogueras, Jorge Crespo Cano,José Miguel Torres, Miguel Egea, Octavio

Hernández, Pablo Abbate, Pepe Hevia,Rodrigo Corral y Salvador Ramos.

Además colaboran en este númeroJavier Aragonés Miranda, Carlos Quintero,

Reyes García

Edición y Suscripciones.netalia

c/ Robledal, 13528529 Rivas-Vaciamadrid (Madrid)

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

PublicidadMediadev

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

Fax. 93 423 11 40

ImprimeGráficas Vallehermoso

www.graficasvallehermoso.com

ISSN1698-5451

Depósito LegalM-3.075-2004

<<

dnm.editorial

Page 4: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET ... · con VB.NET y C#. ¡Mi madre es un Singleton! 46-48 Siguiendo con el tema del último artículo, volvemos a tratar

18dnm.sumario

dnm

.sum

ario

.NET y software libre 10-13En este artículo se aclararán diversas cuestiones jurídicas sobre derechos y licencias que sepuede plantear un programador en relación con un proyecto para .NET y con el softwarelibre.

Entrevista a Alexander Vaschillo 14-16Durante la celebración de los Academic Days 2005 en Lisboa, tuvimos ocasión decharlar con uno de los integrantes del equipo de desarrollo de SQL Server y WinFS,quien nos aclaraba algunos aspectos poco conocidos de la evolución de estas tecnologías.

Tech-Ed 2005 17-20Llegamos a Ámsterdam con el convencimiento de que la mayoría de los asistentes deseabaver ya características aplicadas de las versiones, demos con espectáculo, trucos incipientes,y algunos de los mejores anticipos de lo que las versiones finales van a ofrecer. Y así fue…

Añadiendo nuestra aplicación al área de notificación 22-25Conseguir que nuestra aplicación apareciese en el área de notificación de Windows (comohace Messenger o una herramienta antivirus) no era tarea fácil con las herramientas dedesarrollo antiguas. ¿Qué tal se porta .NET a la hora de implementar esta funcionalidad?

El modelo de objetos de Visual Studio .NET 26-30Muchas de las tareas que realizamos a mano en Visual Studio .NET se pueden automatizarmediante macros y muchas otras se pueden mejorar o extender mediante complementos.En este artículo veremos el modelo de objetos que proporciona Visual Studio .NET parapoder manejar el propio entorno de desarrollo desde código.

Interfaces 32-34En esta ocasión veremos más ejemplos, con idea de que nos quede claro cómo utilizar lasinterfaces en nuestros proyectos, aunque en esta ocasión vamos a usar las interfaces de unaforma diferente a lo “habitual”, con la intención de que nos hagamos una idea de lo útilesque pueden llegar a ser estos tipos de datos.

Ordenación de datos en Reporting Services 35-38Uno de los aspectos principales en cualquier generador de informes radica en la capacidadde ordenar los datos visualizados al usuario del modo más versátil posible. Reporting Serviceses una herramienta que nos ayuda enormemente en nuestro trabajo como diseñadores deinformes, gracias a la extensa oferta de elementos que nos ofrece para la creación de informesen general, y la aplicación de ordenamiento a los datos mostrados en particular.

Atención MySQL,aquí dotNet, ¿me recibe? 39-43MySQL es el gestor de bases de datos open source líder en la actualidad. Independientementede la plataforma donde se esté ejecutando este, podemos conectarlo con nuestras aplicaciones.NET usando algunas de las API de comunicación entre MySQL y aplicaciones Microsoft.NET existentes. En este artículo describiremos de forma sencilla cómo realizar esta tareacon VB.NET y C#.

¡Mi madre es un Singleton! 46-48Siguiendo con el tema del último artículo, volvemos a tratar algunos patrones de diseñobásicos. En este caso veremos el singleton. Si bien puede tener dos lugares distintos de dondese llaman, siempre es la misma instancia que atiende a la petición cliente.

dnm.mvp.online 49-50Campus MVP

dnm.todotnet.qa 51-53ASP.NET 2.0 está aterrizando

dnm.laboratorio.net 54-55Component Art Web UI 2.1

dnm.biblioteca.net 57Visual Studio Hacks (James Avery)Hackers de sitios Web (Joel Scambray y Mike Schema)

dnm.desvan 58

Page 5: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET ... · con VB.NET y C#. ¡Mi madre es un Singleton! 46-48 Siguiendo con el tema del último artículo, volvemos a tratar
Page 6: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET ... · con VB.NET y C#. ¡Mi madre es un Singleton! 46-48 Siguiendo con el tema del último artículo, volvemos a tratar

dotN

etM

anía

<<

6

dnm.noticias<<

Windows Vistan

oti

cia

s.n

oti

cia

s.n

oti

cia

s.n

oti

cia

s.n

oti

cia

s.n

oti

cia

sEl sistema operativo que sustituirá a Windows XP primero y a Windows 2003 Server después,dejará de llamarse Longhorn definitivamente para llamarse Windows Vista.

El desarrollo de Longhorn, del nue-vo explorador de Internet y de su mode-lo de programación WinFX enfilan la rec-ta final. Primero, obteniendo sus nom-bres de “calle”: Windows Vista, WindowsInternet Explorer 7, Windows PresentationFoundation (WPF) y Windows Commu-nication Foundation (WCF) serán losnombres comerciales de Longhorn,Internet Explorer, Avalon e Indigo, res-pectivamente; segundo, con la primerabeta de todos ellos: ya están disponiblesla beta 1 de Windows Vista, WindowsInternet Explorer y WinFX que agrupalas versiones preliminares de Avalon eIndigo (falta WinFS ); por último, se hanañadido muchos recursos para los desa-rrolladores, tanto de la nuevas betas, comodocumentación, vídeos, ejemplos, herra-mientas, etc., en la nueva Web llamadaWindows Vista Developer Center en :http://msdn.microsoft.com/windowsvista, yse ha creado una Web específica paraWindows Vista en http://www.windows-vista.com.

WinFX Runtime Components Beta 1

El WinFX Runtime Components Beta 1permite a los desarrolladores experimen-tar con estas primeras compilaciones públi-cas de estas tecnologías.

WCF (Indigo) es el nombre del mode-lo de programación para la construcción

de aplicaciones de sistemas conectados.Esto extiende el .NET Framework 2.0 conAPI adicionales para la construcción deservicios Web seguros, fiables y transac-cionales que interoperan con plataformasheterogéneas, combinando la funcionali-dad de las tecnologías existentes de apli-caciones distribuidas de Microsoft (ASMX,.NET Remoting, .NET EnterpriseServices, WSE y System Messaging).

WPF (Avalon) es el nombre delmodelo de programación del subsiste-ma de presentación para Windows Vista.A través de él programaremos el inter-faz gráfico con código administrado de.NET Framework.

Esta beta 1 soporta Visual Studio 2005beta 2 y .NET Framework 2.0.

WinFX SDK para Windows Vista,Beta 1

Microsoft WinFX SDK contiene docu-mentación, ejemplos y herramientas dise-ñadas para ayudarle a desarrollar aplica-ciones y librerías gestionadas usandoWinFX. Esta release incluye documenta-ción acerca del uso de .NET Framework2.0, de Windows Presentation Foundation yde Windows Communications Foundation.

La documentación y los ejemplos detecnología y aplicación -en Visual Basic,C# y C++- le servirán para comprendercómo usar los API de WinFX en el desa-rrollo de aplicaciones, mientras que lasherramientas le serán de gran ayuda paradicho desarrollo.

El WinFX SDK Beta 1 precisa detener instalado previamente el WinFX

Runtime Beta 1 y del .NET Framework 2.0y Visual Studio 2005 Beta2.

Visual Studio Extensions para WinFXBeta 1

Visual Studio Extensions paraWinFX Beta 1 proporciona a los desa-rrolladores soporte para la construc-ción de aplicaciones WinFX usando laBeta 2 de Visual Studio 2005. Ésteincluye soporte de Intellisense XAMLa través de extensiones de esquemapara el editor, plantillas de proyectopara Windows Presentation Foundationy para el Windows CommunicationFoundation.

El Visual Studio Extensions for WinFXBeta 1 precisa tener instalado previamen-te WinFX Runtime Beta 1, .NETFramework 2.0, Visual Studio 2005 Beta2 yWin FX SDK Beta 1 (mejor consulte en laWeb, por si acaso...).

Pueden descargarse todas las ver-siones desde el centro de descargaspara desarrolladores de Microsoft en:http://msdn.microsoft.com/downloads.

Diponibiliad

Desde el 3 de agosto, Windows VistaBeta 1 está disponible para betatesters ysuscriptores a MSDN y TechNet;Windows Longhorn Server Beta 1 estádisponible sólo para un grupo elegido debetatesters; mientas que las primeras betasdel modelo de programación y deWindows Internet Explorer 7 están dis-ponibles públicamente.

A finales dejunio de 2005 laasamblea gene-

ral de ECMA aprobó la tercera edición delos estándares para C# y CLI, adoptandoya muchas de las características que seincluirán en Visual Studio 2005.

En cuanto al lenguaje C#, el estándarahora contiene nuevas características, talescomo genéricos, tipos que pueden sernulos y métodos anónimos, los cuales pue-

den simplificar la gestión de eventos. Encuanto a CLI, ahora incluye soporte deprimera clase para genéricos a nivel de run-time y de clase, además de un API parale-lo que permite a los desarrolladores desa-rrollar más fácilmente código para la eje-cución concurrente en múltiples hilos.

Puede descargarse la especificacióncompleta en formato PDF desde la URL:http://www.ecma-international.org/publica-tions/standards/Ecma-334.htm.

Estándar ECMA para la especifiación del lenguaje C# 3ª edición

Altova hap r e s e n t a d o

AltovaXML, un procesador que inclu-ye el mismo motor de validación XSLT1.0, XSLT 2.0, XQuery y XML queincorporan el resto de sus herramien-tas de desarrollo XML.

Puede descargarlo de forma gra-tuita desde la Web de Altova enhttp://www.altova.com/altovaxml.html yusarlo en sus aplicaciones libre deroyalties.

Altova presenta AltovaXML, unmotor XML gratuitoEl estándar del lenguaje de programación C# fue aprobado por primera vez por ECMA

en 2002 y por ISO /IEC en 2003.

Page 7: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET ... · con VB.NET y C#. ¡Mi madre es un Singleton! 46-48 Siguiendo con el tema del último artículo, volvemos a tratar

dnm.noticias

dnm.noticias

dotN

etM

anía

<<

7

MBSA nos ayudará a mejorar la seguridadde nuestros equipos, encontrando los erroresde configuración y uso más habituales. La nue-va versión ofrece un interfaz de usuario másintuitivo y más textos informativos en compa-ración con versiones anteriores, calificaciónrigurosa, búsqueda local y remota de actualiza-ciones de seguridad de Office XP o superior,compatibilidad con los servidos de WindowsServer Update, registro y actualización del agen-te, automática desde Microsoft Update, sopor-

te para la detección de actualizaciones deWindows 64 bit y Windows XP Embedded.

Los sistemas para los que está diseñadoson: Windows 2000 SP3, Office XP,Exchange 2000 o superior, SQL Server 2000SP4 o versiones superiores.

Los usuarios de los servicios de WindowsServer Update deberían actualizarse a MBSA2.0 por razones de compatibilidad.

Más información en: http://www.micro-soft.com/technet/security/tools/mbsa2

Microsoft Baseline Security Analyzer 2.0Microsoft Baseline Security Analyzer (MBSA) 2.0 es una herramienta diseñada para facilitar ladetección de problemas de seguridad de los equipos de las pequeñas y medianas empresas.

Microsoft ha liberado la primera beta deSQL Server 2005 JDBC Driver. Esta des-carga está disponible para todos los usuariosde SQL Server de forma gratuita y propor-ciona acceso a SQL Server 2000 y SQLServer 2005 desde cualquier aplicación Java,aplicación servidora o applet de Java. Este esun JDBC de tipo 4 que proporciona conec-tividad a través del estándar API JDBC dis-ponible en J2EE.

La beta 1 de SQL Server 2005 JDBCDriver incluye: compatibilidad con SQLServer 2000 y SQL Server 2005, compati-bilidad con JDBC 3.0, rendimiento mejo-rado, soporte con transacción XA mejora-da, soporte BLOB y CLOB, soporte conautenticación integrada, conjunto de resul-tados actualizable.

Puede descargarlo desde: http://www.micro-soft.com/sql/downloads/2005/jdbc.mspx

SQL Server 2005 JDBC Driver Beta 1

Desde el 19 de agosto está disponiblepara su descarga la edición CTP del SP2de Exchange Server 2003 que saldrá, muyprobablemente antes de que este año ter-mine.

Las mejoras incluyen compresión adi-cional, soporte opcional de autenticaciónbasada en certificados, mejoras del correoelectrónico móvil, mejoras en la protec-ción contra el spam, que incluye compa-

tibilidad para el protocolo de autentica-ción de correo electrónico a través del IDdel remitente o el Exchange IntelligentMessage Filter, mailboxes mejorados quepodrán llegar a tener hasta 75 Gb, un nue-vo formato para la libreta de direccionesoffline, mejoras de rendimiento, etc.

Puede visitar para más información losgrupos de usuarios de Exchange Server(http://www.microsoft.com/technet/commu-nity/newsgroups/server/exchange.mspx) o losblogs relacionados (http://blogs.technet.com/exchange/default.aspx).

Para descargar esta CTP vaya a:http://www.microsoft.com/exchange.

Exchange Server 2003 SP2 CTP

Exchange Server 2003 SP2 CTP es una pre-release no soportada por los servicios desoporte al cliente de Microsoft y que sedistribuye con el propósito de obtenercomentarios de los usuarios.

Enterprise Library es unalibrería de Application Blocks queestán diseñados para guiar a losdesarrolladores en el uso de

buenas prácticas de desarrollo. Aportan todoel código fuente y éste puede ser usado talcual o modificado e incluirlo en nuestras apli-caciones. Todos los Application Blocks han sidoactualizados con un particular enfoque en laconsistencia, extensibilidad y la facilidad deuso e integración.

Esta actualización contiene los mismosApplication Blocks, pero con los parches y exten-siones pedidos por la comunidad de usuarios.

Puede descargarse desde: http://msdn.microsoft.com/practices/default.aspx?pull=/library/en-us/dnpag2/html/entlib.asp

Patterns & Practices Enter-prise Library de Junio 2005La nueva versión es una actualización menorde la que apareció en enero de 2005

En el pasado Tech-Ed 2005 de Orlandose anunció que BizTalk Server 2006 apare-cerá en la semana del 7 de noviembre jun-to a SQL Server 2005 y Visual Studio 2005como parte la plataforma de la próximageneración de sistemas conectados. Sinembargo, la versión RTM (Release ToManufacturing) no verá la luz hasta el pri-mer cuarto de 2006.

Si quiere descargarse esta beta vaya ahttp://www.microsoft.com/biztalk/evaluation/bts2006beta.mspx y siga las instrucciones.

BizTalk Server 2006 Beta 1

BizTalk Server 2006 Beta 1 será compatible conel runtime de 64 bit de Windows Server 2003,.NET Framework 2.0,Windows Server 2003 R2,Visual Studio 2005 y SQL Server 2005.

Este kit incluye herramientas de desa-rrollo y recursos técnicos necesarios paradesarrollar aplicaciones con Visual Studio2005, incluyendo el propio Visual Studio2005 Beta 2, Windows Mobile 5.0 SDK paraSmartphone y para Pocket PC, Microsoft

ActiveSync 4.0, Microsoft Device Emulator1.0 Community Preview, documentación yvídeos de formación.

Puede solicitarlo en CD gratuitamentedesde: http://msdn.microsoft.com/mobility/win-dowsmobile/howto/resourcekit.

Windows Mobile 5.0 Developer Evaluation Kit

El Windows Mobile 5.0 Developer Evaluation Kit le permite comenzar a desarrollar aplicaciones paraWindows Mobile 5.0 antes de la aparición oficial de Visual Studio 2005.

101 Samples for Visual Studio 2005http://lab.msdn.microsoft.com/vs2005/down-loads/101samples/default.aspx

Visual Studio 2005 Starter Kithttp://lab.msdn.microsoft.com/vs2005/down-loads/starterkits

Vídeos para Visual Studio 2005 edi-ciones Expresshttp://lab.msdn.microsoft.com/express/begin-ner/default.aspx

Nuevos recursos desdeVisual Studio 2005Developer Center

Page 8: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET ... · con VB.NET y C#. ¡Mi madre es un Singleton! 46-48 Siguiendo con el tema del último artículo, volvemos a tratar

dotN

etM

anía

<<

8

dnm.noticias<<

dnm.noticias

Este evento, que se celebra unavez cada dos años, reúne a los princi-

pales arquitectos de software de la compa-ñía para exponer sus trabajos ante la comu-nidad de desarrolladores. Así, podremos oírde primera mano, cuáles son las nuevas carac-terísticas, por ejemplo, del nuevo C# 3.0directamente del padre de C#, AndersHejlsberg.

La primera keynote correrá a cargo deBill Gates, quien desvelará, junto con otrosejecutivos de Microsoft, las últimas innova-ciones de la plataforma de Microsoft paradesarrolladores. Existe una larguísima listade ponentes, muchos de ellos ilustres, quepuede consultar en la página oficial que estáen: http://msdn.microsoft.com/events/pdc.

Este año se focalizará en las innovacio-nes de desarrollo para Windows Vista, con-cretamente con el Windows PresentationFoundation (WPF) –antes Avalon– y WindowsCommunication Foundation (WCF) –antesIndigo– y la próxima versión de Office cono-cida en clave como Office 12.

Más de 900 bloggersestán contribuyendo con elsitio Web PDC Bloggers(http://pdcbloggers.net ), queproporciona a los desarro-lladores una alternativa deconexión para poder comu-nicarse con los asistentes ala conferencia y dar su opi-nión a la amplia comunidadde desarrolladores.

Más información en: http://www.developer-powered.com.

dotNetManía estará allí

Para el próximo número publicaremosun extenso resumen de dicho evento tal ycomo hemos hecho este mes con el Tech-Ed Europe 2005. Nosotros también ten-dremos una oportunidad única de conver-sar con algunas de las personas que diri-gen el rumbo de las nuevas tecnologíaspara desarrolladores para los próximosaños. Os lo contaremos.

PDC 2005.Developer poweredDesde el 13 al 16 de septiembre de 2005 Microsoft celebra el PDC 2005, el mayor evento mundialdedicado a las próximas tecnologías de Microsoft para desarrolladores,en Los Ángeles (California-USA) ante miles de desarrolladores de todo el mundo.

Episodio IV de GUSE.NET

Asistieron alrededor de 50 perso-nas. La agenda final del evento fue:

• 16:30-18:20: T-SQL Show con ItzikBen-Gan de SolidQualityLearning.

• 18:30-19:20: De DTS a SSIS conJuansa Díaz de la CAM.

• 19:20-20:00: Ofertas-Demandas de tra-bajo. Novedades.

• 20:00-20:30: Constitución fiscal y for-mal del grupo de usuarios como aso-ciación. Elección de cargos y acta deconstitución.

En esta ocasión, el ponente estrella eraItzik Ben-Gan, socio fundador y mentor prin-cipal de Solid Quality Learning quien pudovenir gracias a la inestimable colaboración deMicrosoft Ibérica. Itzik es un gurú de T-SQL,profesor y ponente habitual de conferenciascomo las de las reuniones de PASS (ProfessionalAssociation for SQL Server), SQL Devcon o

SQL Server Connections. Es autor de varioslibros y artículos en revistas tan prestigiosoascomo SQL Server Magazine.

Además de las charlas técnicas y de losaspectos formales de la constitución del gru-po de usuarios como asociación, también nosinformaron sobre la inminente apertura deuna Web propia, gracias a la colaboración deMicrosoft Ibérica en http:/www.gusenet.comdonde podremos encontrar más informacióna disposición de todos los miembros y delpúblico.

Las reuniones del GUSE.NET se cele-bran normalmente el último viernes de cadames alternativamente en Murcia o en Alicante.Si vive o trabaja cerca le animamos a que asis-ta y participe con ellos. Todos los eventos seránpublicados en http://www.microsoft.com/spain/eventos y es recomendable inscribirse enellos antes de ir.

El pasado viernes 22 de julio se celebró en Murcia, en la CROEM (ConfederaciónRegional de Organizaciones Empresariales),el Episodio IV del GUSE.NET (Grupode Usuarios del Sureste de España) de cuyos orígenes ya nos habló Miguel Egea,uno de sus fundadores,el mes pasado.

Este año tenemos la suerte de ser losanfitriones (los españoles) de este even-to, que se realiza ya por cuarta vez, y queposiblemente sea el evento europeo másimportante para profesionales de las TI.Tres días de aprendizaje a través de entre300 y 400 sesiones que cubrirán aspectosincluso de Windows Server R2, WindowsVista y SQL Server 2005. Los tres pila-res en los que se basarán son: formacióntécnica, evaluación tecnológica y comu-nidad y networking.

La keynote inicial correrá a cargo deBog Muglia, Vicepresidente senior de ladivisión de Windows Server. Dentro delos top speakers se encuentran: JohnCraddock , Mark Russinovich yKimberly L. Tripp.

La cita de este año: en Barcelona. Puedeobtener más información de este evento en:http://www.mseventseurope.com/msitfo-rum/05/pre/content/new.aspx.

Microsoft IT Forum 2005

Entre el 15 y el 17 de noviembre se celebrará enBarcelona el Microsoft IT Forum 2005,el eventoeuropeo para profesionales de las TI

Esta sesión on line le proporcionarálos conocimientos esenciales para la cre-ación de aplicaciones seguras. Divididoen: fundamentos de la seguridad de apli-caciones, recomendaciones para la escri-tura de código seguro, defensa contraamenazas y implementación de seguridaden las aplicaciones con Microsoft .NETFramework.

Los objetivos son desde comprenderla necesidad de implementar la seguri-dad en cada fase del proceso de desarro-llo, hasta las técnicas para definir mode-los de amenazas, minimizar vulnerabili-dades, limitar los daños causados por losataques, etc.

Más información en: https://www.micro-softelearning.com/spain/eLearning/offerDetail.aspx?offerPriceId=51363

Directrices de seguridad deMicrosoft para desarrolladoresDesde Microsoft e-learning,en español y gratuito,acaba de publicarse este curso on line sobredirectrices de seguridad para desarrolladores.

Eventos

Page 9: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET ... · con VB.NET y C#. ¡Mi madre es un Singleton! 46-48 Siguiendo con el tema del último artículo, volvemos a tratar
Page 10: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET ... · con VB.NET y C#. ¡Mi madre es un Singleton! 46-48 Siguiendo con el tema del último artículo, volvemos a tratar

.NET y software libre

En este artículo se aclararán diversas cuestiones jurídicas sobre dere-chos y licencias que se puede plantear un programador en relacióncon un proyecto para .NET y con el software libre.

frecuente oír en una misma frase las palabras.NET y software libre, pero, ¿hasta que punto es o nouna contradicción? ¿Son incompatibles? ¿Puede hacer-se software libre utilizando herramientas de desarrollode .NET? ¿Puede hacerse un proyecto de .NET utili-zando herramientas de desarrollo de software libre? ¿Sepuede hacer un programa inicialmente en software librepara .NET y cambiar la licencia posteriormente? ¿y alrevés? ¿Quién decide qué licencia se ha de usar?

A todas esas preguntas, y a otras, se dará respues-ta en este artículo de manera breve y, esperemos, sufi-cientemente clara, tras analizar, en primer lugar, quése entiende por .NET y por software libre.

¿Qué es .NET?Puesto que los lectores de esta revista con toda

seguridad lo saben mejor que yo, para contestar a estapregunta me limitaré a citar la propia definición quehace Microsoft® al respecto1:

“.NET es una plataforma de software que conecta infor-mación, sistemas, personas y dispositivos. Desarrollado conbase en los estándares de Servicios Web XML, .NET per-mite que los sistemas y aplicaciones, ya sea nuevos o exis-tentes, conecten sus datos y transacciones independiente-mente del sistema operativo, tipo de computadora o dispo-sitivo móvil que se utilice, o del lenguaje de programaciónempleados para crearlo.”

Por tanto, se podría decir que un proyecto para.NET es todo aquel que es compatible, gracias al uso

de estándares, con los restantes proyectos .NET y queposibilita, facilita y potencia la interacción entre todosellos independientemente del sistema, lenguaje, dis-positivo o medio empleado, todos ellos en beneficiodel usuario.

¿Qué es software libre?De acuerdo a la definición que da la Free Software

Foundation, se entiende por software libre todo aquelque cumple con las cuatro libertades que ellos con-sideran imprescindibles2: (1) Libertad para ejecutarel programa, con cualquier propósito, (2) libertadpara estudiar como funciona el programa, y adap-tarlo a tus necesidades (el acceso al código fuente esun requisito para ello), (3) libertad para redistribuircopias de manera que puedas ayudar al vecino y (4)libertad para mejorar el programa, y distribuir tusmejoras al público, de tal manera que toda la comu-nidad se beneficia (el acceso al código fuente es unrequisito para ello).

En este punto conviene hacer dos aclaraciones. Laprimera es que software libre no es lo mismo que soft-ware gratis, o como dice el famoso aforismo, “free soft-ware is not free beer”. Si bien la palabra libre implicalibertad en español, en ingles “free” puede significartanto libre como gratis, por lo que podría llevar a inter-pretaciones erróneas que hacen que la gente asocie“libre” con “gratis”, cuando es perfectamente posiblecobrar por el software libre, tal como Red Hat ha veni-do haciendo con éxito hasta ahora.

Javier Aragonés Miranda

dnm.legal

<< Cada día es más

Javier Aragonés Mirandaes abogado de Suárez

de la Dehesa Abogados,despacho especializado en

Propiedad Intelectual e Industrialy Nuevas Tecnologías.

http://www.suarezdeladehesa.com1 http://www.microsoft.com/latam/net/introduccion/quees.asp2 https://www.fsf.org/licensing/essays/free-sw.html

Page 11: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET ... · con VB.NET y C#. ¡Mi madre es un Singleton! 46-48 Siguiendo con el tema del último artículo, volvemos a tratar

La segunda es que software libre noes sinónimo de software de código abier-to o software abierto (open source). Pesea que se usan indistintamente en muchasocasiones, no son sinónimos. Si bientodo el software libre es software abier-to, pues el acceso al código fuente esun requisito de dos de las cuatrolibertades, no todo el softwareabierto cumple las cuatro liber-tades necesarias para ser consi-derado libre, ya que puede queun programa de código abiertosólo me permita adaptarlo perono distribuirlo.

¿Son incompatibles?Una vez definido qué es .NET y

qué es software libre, nada parece indi-car que sean incompatibles. Es más, unproyecto para .NET podría venir agarantizar una nueva libertad al usua-rio: la libertad para acceder a sus datoscuándo, cómo y desde donde él quieracon la seguridad de que podrá hacerlopues será compatible. Por tanto, desdeel punto de vista de un usuario, un pro-grama de software libre para .NET seríala mejor opción posible, pues dispon-dría de la mayor libertad de uso que sepuede conseguir.

Ahora bien, para determinar si desdeel punto de vista de un programador o deuna empresa desarrolladora de softwareesa opción resulta o no igual de benefi-ciosa son muchas las cuestiones que debe-rían analizarse, todas ellas perfectamenteválidas y posibles, que dependerán de laestrategia empresarial que se elija, en laque aquí no vamos a entrar.

Cuando un programador o unaempresa tiene en mente el proyecto quequiere abordar, o el que le han encarga-do que desarrolle, surgen diversas opcio-nes y cuestiones que han de ser concre-tadas, como cuál es la licencia que se quie-re emplear (propietaria, libre, de códigoabierto), quién será el titular, etc., porello se hace necesario explicar algunosconceptos antes de entrar a hablar de laslicencias y cesiones de derechos.

Herramientas y creacionesLo primero que hay que dejar cla-

ro es que una cosa es la herramienta

y/o el lenguaje en el que un progra-mador crea un programa de ordenadory, otra muy diferente, es el resultadode esa creación, el contenido creadocon la herramienta en un lenguajedeterminado.

Cada pro-gramador elije laherramienta de desarrolloque quiere emplear para crear un pro-grama de ordenador. Dicha herra-mienta de desarrollo no es otra cosa queun programa de ordenador creado porotro programador X o por una empre-sa y, como tal, habrá que disponer deuna licencia de uso para emplearlo, peroello no significa que el titular de esaherramienta de desarrollo, el progra-mador X, tenga algún derecho sobre loque un programador cree utilizando eseprograma. Dicho de manera sencilla:una cosa es el programa Word que estoyempleando para escribir este artículo,que es titularidad de Microsoft®, y otradiferente es el artículo en sí, del cual yosoy el único titular, y sobre el cualMicrosoft® no ostenta ningún derechopese a que yo lo he creado usando suprograma.

Lo mismo es predicable de un pro-grama desarrollado para .NET por unprogramador. Independientemente dela herramienta (o programa) de desa-rrollo que emplee para su creación(Visual Studio .NET, .NET Frame-work, ASP.NET, Mono, etc.) el pro-gramador será, en principio, el único

titular de su creación, sin que el crea-dor de la herramienta empleada tengaalgún derecho sobre ello. La impor-tancia de emplear uno u otro es la posi-bilidad de acceder a la creación. Yo hecreado este artículo con Microsoft®

Office Word 2003, con lo cualsólo lo puedo abrir para edi-

tarlo con un programacompatible, igual que suce-de con el código fuente deun programa, que sólopuede editarse con un pro-

grama compatible con aquelen el que se creó, de ahí la

importancia de elegir un pro-grama o lenguaje determinadosobre otros.El resultado del trabajo de un pro-

gramador es, en principio (ya lo vere-mos) de su exclusiva titularidad y pue-de hacer con él lo que le apetezca. Puederegalarlo, borrarlo, venderlo, grabarloen un CD y guardarlo en un cajón, etc.En fin, un programador es libre dehacer, en principio, lo que quiera con elprograma que ha creado pues para esoes su creación y, por tanto, puede licen-ciarlo como quiera o no licenciarlo enabsoluto.

La titularidadAcabamos de ver que un programa-

dor es libre, en principio, de hacer loque quiera con el programa que ha cre-ado. Y se dice “en principio” pues en lalegislación de propiedad intelectual exis-ten unas presunciones según las cuálessi un programador trabaja para unaempresa, será ésta la titular de los dere-chos sobre la creación del programadore, incluso, puede llegar a ser considera-da la propia empresa como autora delmismo.

El artículo 97 de la Ley dePropiedad Intelectual establece cuatroclases de titularidad respecto de un pro-grama de ordenador en función del pro-ceso de creación:1. Creación individual.- Cuando un

programador crea solo, por su cuen-ta, él es el único titular del progra-ma que crea, y si crea para alguien,debería existir un contrato entreambos que regule la cesión de losderechos, si es que cede alguno. Un

dotN

etM

anía

<<

11

dnm.legal<<

Page 12: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET ... · con VB.NET y C#. ¡Mi madre es un Singleton! 46-48 Siguiendo con el tema del último artículo, volvemos a tratar

ejemplo de este tipo serían la mayo-ría de pequeños programitas free-ware y shareware que pueden encon-trarse por la red.

2. Creación colectiva.- Cuando unprograma se crea por varios progra-madores bajo la iniciativa y coordi-nación de una empresa o de una per-sona, a no ser que se pacte lo con-trario, esta empresa o persona seconsiderará autora del programa y,en consecuencia, será la titular detodos los derechos sobre el mismo.El ejemplo sería cualquier corpora-ción (Microsoft®, Adobe®, etc.,etc.)

3. Creación colaborativa.- Cuandoun programa se crea por varios pro-gramadores que colaboran entre sí,todos ellos será coautores del mis-mo y a todos ellos corresponderá sutitularidad en las proporciones queestablezcan. Como ejemplo estarí-an la mayoría de proyectos de soft-ware libre, o un programita creadoentre varios amigos.

4. Creación asalariada.- Cuando unprogramador crea un programadentro de las funciones que desa-rrolla como asalariado de unaempresa, él seguirá siendo el autorpero los derechos de explotaciónpertenecerán en exclusiva a laempresa. Ejemplos serían la mayo-ría de relaciones laborales de losprogramadores.

Una vez que se determina a quiéncorresponde la titularidad de un pro-grama de ordenador, será a esa personao empresa a quien corresponda decidirla licencia que se aplicará al programa,pues la condición de titular es la que per-mite decidirlo.

(Por brevedad, en este artículo alreferirme a programador me refiero altitular, a no ser que se entienda clara-mente lo contrario.)

Las licencias

Una licencia es el conjunto dereglas que el programador establecepara que el resto de personas en gene-ral pueda interactuar con su programa.El programador establece en la licen-cia lo que permite que el usuario de suprograma haga con el mismo (como,por ejemplo, instalarlo en todos losordenadores de su casa) y también loque se le prohíbe hacer expresamente(como hacer una copia y colgarla en sublog a disposición de todo el mundo,por ejemplo). Por ello, lo primero queha de decidir es qué es lo que quierepermitir hacer a los usuarios y estable-cer una licencia, que puede redactarseexpresamente para ese programa, opuede usarse una de las existentes si seadapta a lo que se quiere.

A la vista de lo expuesto, se puedeafirmar que sí es posible realizar pro-yectos de software libre para .NET,pues el programador puede utilizar parasu creación una licencia de softwarelibre (que otorgue al usuario las cuatrolibertades mencionadas al inicio) deigual forma que puede hacer que el pro-grama que cree sea de código abierto opropietario.

Entra perfectamente en las faculta-des del programador decidir lo que losusuarios hagan con su programa, inde-pendientemente de la herramienta dedesarrollo que emplee en su trabajo. Unprogramador que utilice Mono™ (laherramienta de software libre para desa-rrollo de proyectos .NET multiplata-forma) puede licenciar el programa cre-ado con la licencia que quiera, inclusopropietaria, de la misma manera que unprogramador que utilice Visual Studio®.NET puede convertir el programa cre-ado en software libre aplicando la licen-cia adecuada para ello.

Cambio de licenciaUna cuestión que puede plantearse un

programador es si puede cambiar la licen-cia de un programa por otra diferente unavez que ya se haya distribuido. La res-puesta, como la mayoría que puede darun abogado, será “depende”.

Y la posibilidad de cambio dependede la licencia o del contrato que ya haya

otorgado respecto del programa. Paraque ello no sirva de excusa para evitarla respuesta, expondré unos criterios quepueden emplearse de manera general,aunque luego haya que examinarse casopor caso.

El criterio general que ha de emple-arse es el de conservación y manteni-miento de los derechos cedidos. Si conuna licencia se ceden a los usuarios unosderechos, que han estado disfrutandopacíficamente, éstos mismos usuariosno pueden verse perjudicados por ladecisión del programador de modificarlos términos de la licencia y, por tanto,esos cambios operados no les afectarándurante el periodo de vigencia de lalicencia que les ampara.

Una primera cuestión que hay queexaminar es si la licencia es en exclusi-va o no. Aunque lo normal es que laslicencias de los programas son no exclu-sivas, es decir, se puede ceder el pro-grama tantas veces como usuarios haya,es posible que un programa desarrolla-do a medida para una empresa sí se cedaen exclusiva, lo que significa que nadie(incluido el propio programador en lamayoría de las ocasiones) puede usarese programa sin permiso de la empre-sa. Ello conllevaría que el programa nopueda cambiarse de licencia por el pro-gramador pues, aparte de que proba-blemente se lo prohíba el contrato, sicambia de una licencia exclusiva a unano exclusiva estaría perjudicando a laempresa a la que cedió en exclusiva,pues lo normal es que las licenciasexclusivas cuesten más dinero y sirvanpara que la competencia no use el mis-mo programa.

Lo que sí puede hacerse es cambiaruna licencia no exclusiva a una exclusi-va, pero con ello no puede perjudicar-se a aquellos usuarios que han venidousando el programa porque la licenciase lo permitía. En estos casos el pro-grama caerá en desuso, pues a medida

dotN

etM

anía

<<

12

dnm.legal<<

Un proyecto bajo .NET puede perfectamente ser

software libre ][

Software libre no es lo mismo que software gratis ][

Page 13: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET ... · con VB.NET y C#. ¡Mi madre es un Singleton! 46-48 Siguiendo con el tema del último artículo, volvemos a tratar

que dejen de usarlo los usuarios queestaban amparados por la licencia, nin-gún otro podrá usarlo salvo el que ten-ga la licencia exclusiva.

Un segundo grupo de cuestionesque ha de analizarse es si con el cambiode licencia se limitan o se amplían losderechos ya concedidos. En el supues-to de que se amplíen los derechos o posi-bilidades de uso que proporciona unalicencia no exclusiva, es perfectamenteposible ese cambio, pues el usuario nose ve perjudicado por ello, más bien todolo contrario, pues ahora tendrá másfacultades de las que podrá, o no, apro-vecharse. Por ejemplo, si sólo se per-mite la instalación en un ordenador, yse cambia la licencia para que puede ins-talarse en tres, se está beneficiando enor-memente al usuario y no se le perjudi-ca en nada.

Cuestión distinta es si con el cam-bio de licencia se limitan los derechosdel usuario. Como ya se ha mencio-nado, si se limitan los derechos ya con-cedidos, ese cambio no puede perju-dicar a los usuarios amparados en lalicencia más amplia, pues mientrasdure el término de la misma se encuen-tran perfectamente amparados. Conlas actualizaciones y sucesivas versio-nes, que sí se regirán por la nuevalicencia más restrictiva, el problema seminimiza, pues si un usuario quierebeneficiarse de las mismas deberáaceptar la nueva licencia, y ya sólo serácuestión de tiempo que los usuariosque dispongan de la vieja licencia vayandesapareciendo. Por este motivo, lorecomendable es aprovechar el lanza-miento de una nueva versión para rea-lizar el cambio de licencia, incenti-vando así su adopción por parte de losusuarios.

Pese a la sencillez del procesoexpuesto, la transición de licencia pue-de ser más complicada si se hace de soft-ware libre a propietario, pues si es soft-ware libre, lo normal es que la licenciasea de duración indefinida, con lo quelos usuarios podrán redistribuir, adap-tar y actualizar el programa. En estoscasos, el futuro del programa libredepende (1) de que se cree una comu-nidad de desarrollo, pues si no se crea,lo normal es que caiga en desuso, (2) delprecio y (3) de las novedades que seintroduzcan en el nuevo código, pues siestos últimos son atractivos los usuarioslos preferirán.

Existen numerosos ejemplos decambios en las licencias. Un ejemplo depaso de software libre a propietario seríael programa denominado Yanoff (pro-grama de lectura de noticias para PalmOS) que cambió de ser software librebajo GPL (licencia más usada de soft-ware libre) a ser código cerrado. En elsitio Web del programa se reconoce quelos usuarios anteriores podrán seguirdesarrollando el mismo en la versión de2003, pero no en las posteriores.

En el sentido contrario, de softwa-re propietario a software libre, uno delos ejemplos más notables se ha dadocon OpenOffice.org, la suite de ofimáti-ca que pasó de ser propietaria a tenerdoble licencia, una comercial y una libre(LGPL), y que actualmente se está pen-sando en pasarlo todo a GPL. Otroejemplo anunciado recientemente se hadado respecto del código fuente del jue-go Quake III, que la empresa desarro-lladora del mismo piensa distribuir bajola licencia GPL.

Proyectos modelosTodo lo dicho con anterioridad sola-

mente es aplicable a los programas cre-ados íntegramente por el programador,ya que si el programador introduce códi-go no original en el programa que desa-rrolla, ha de respetar la licencia bajo lacual se ha distribuido dicho código. Estacuestión tiene especial relevancia en eldesarrollo bajo .NET, pues en las herra-mientas de desarrollo se suelen incluir

proyectos, módulos y rutinas modeloque pueden ser empleadas por el pro-gramador. Dicho código modelo sola-mente podrá ser empleado si se respetala licencia del mismo, que puede, o no,permitir su distribución como softwarede código abierto.

Por ejemplo, en la licencia deMicrosoft® ASP.NET Source Projects3 seestablece que se puede utilizar el soft-ware modelo con finalidad comercialpero expresamente establece que nopuedes combinarlo o distribuirlo consoftware cuya licencia requiera que sesuministre el código fuente. Sin embar-go, también hay ejemplos que sí permi-ten la modificación y distribución delcódigo fuente, como DotNetNuke, desa-rrollado con ASP.NET, cuya licencia4,denominada X11 o MIT, es una licen-cia de software libre.

Por tanto, antes de emplear códigoajeno en un programa propio convieneexaminar la licencia del mismo paradeterminar lo que se puede y no se pue-de hacer, pues de otra manera se correel riesgo de infringir los derechos de sustitulares.

ConclusiónDe todo lo expuesto se deduce que

un proyecto desarrollado para .NETpuede licenciarse de la manera quemejor se adapte a la estrategia comer-cial del titular de los derechos del mis-mo, pues puede hacerlo como softwa-re de código abierto, propietario olibre, sin que en ello influya la herra-mienta empleada en su desarrollo. Ysi la estrategia comercial cambia, conella también puede modificarse lalicencia, respetando el principio gene-ral de no perjudicar los derechos de losusuarios actuales.

dotN

etM

anía

<<

13

dnm.legal<<

3 http://www.asp.net/samplessourcelicense/Default.aspx4 http://www.dotnetnuke.com/Default.aspx?tabid=776

El programador es quiendecide qué licencia quiere

dar a su programa ][

Los cambios de la licenciano pueden perjudicar los

derechos de los usuarios actuales

][

Page 14: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET ... · con VB.NET y C#. ¡Mi madre es un Singleton! 46-48 Siguiendo con el tema del último artículo, volvemos a tratar

Entrevista a Alexander Vaschillo

Durante la celebración de los Academic Days 2005 en Lisboa, tuvimos oca-sión de charlar con uno de los integrantes del equipo de desarrollo de SQLServer y WinFS, quien nos aclaraba algunos aspectos poco conocidos de laevolución de estas tecnologías.

y desarrollo o solamenteen desarrollo?

En la actualidad estoy en desarrollo, exclusiva-mente. Trabajo en grupos de desarrollo, casi siem-pre vinculados a la gestión de bases de datos y tec-nologías relacionadas con ellas, como los ObjectSpaces anteriormente, o la tecnología vinculada aWinFS, el futuro subsistema de almacenamiento deLonghorn.

Hace unos meses tuvimos ocasión de hablar tam-bién con Andrew Conrad, del equipo de desarrollode Object Spaces. La reacción de los lectores que seguí-an el tema, fue de sorpresa, al saber que esa tecnolo-gía no estaría visible, sino embebida en el subsistema,y no utilizable directamente, como un API…

Object Spaces ha sido una tecnología en evolucióny realmente, Microsoft no ha publicado en ningúnmomento que tal tecnología fuese a estar disponible“desde fuera”, como tú comentas. Tienes razón en elsentido de que se pensó que podría accederse desdefuera, pero desde un inicio, la tecnología estaba pen-sada para usarse de forma interna. WinFS, de hecho,utiliza esta tecnología y también un lenguaje especialde consultas, como mostraba yo antes en uno de losejemplos de mi conferencia.

Otra pregunta que está provocando ríos de tinta,especialmente en la prensa especializada de los EstadosUnidos, es si, realmente, WinFS va a estar dentro deLonghorn de alguna forma, –aunque no en su ámbi-to total de desarrollo– o es que no va a estar en abso-luto, aunque pueda aparecer como una beta instala-ble. ¿Qué puedes decirnos al respecto?

Bueno, –y esto es una de las cosas de las que ten-go miedo a pronunciarme– creo que lo cierto es queno va salir como parte de Longhorn, ni en parte,

ni en su totalidad. Pienso que aparecerá un ciertotiempo después, aunque no podría decir cuántotiempo. La buena noticia es que será capaz de fun-cionar en otros sistemas operativos, y no sólo enLonghorn.

¿Quizá una parte de esta funcionalidad estará pre-sente por defecto en Longhorn? Aunque sea unapequeña parte…

No. No lo creo.Pongamos la pregunta de otra forma. ¿Habrá en

Longhorn algún tipo de tecnología, –aunque no seaWinFS– que mejore la experiencia de búsqueda deinformación en el sistema, se llame como se llame?

Marino Posadas

dnm.directo.entrevistas

Marino Posadas esasesor técnico y

redactor dedotNetManía, MVP de

C# y formador deAlhambra-Eidos

<< ¿Tu trabajo es en investigación

Alexander Vaschillo

Page 15: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET ... · con VB.NET y C#. ¡Mi madre es un Singleton! 46-48 Siguiendo con el tema del último artículo, volvemos a tratar

Con toda seguridad existirán mejo-ras a ese respecto, pero tendrán másque ver con tecnologías que, si bienno están vinculadas a WinFS, permi-tirán un uso más rico de las posibili-dades de búsqueda de información enel sistema.

Bien, sigamos hablando de tecno-logías vinculadas con SQL Server y elalmacenamiento. Una de las noveda-des más importantes en SQL Server2005 es el tipo de datos XML ¿Podráser utilizable incluso en arquitecturasde almacenamiento Web, para guar-dar páginas de contenido (XML) ypáginas de presentación (XSL) de for-ma que se pueda tener –literalmente–guardado un sitio Web en campos deuna base de datos?

Sin duda. Es más, nosotros pensa-mos que con el tiempo será el mejorsitio posible para el almacenamientode información, pero sobre todo, porque podremos hacer búsquedas den-tro del propio contenido del campo.Digamos, por ejemplo, que podremospedir a SQL Server que nos seleccio-ne un conjunto elementos de ciertonombre o que posean algún atributoconcreto, y estén incluidos dentro dela estructura del fichero XML alma-cenado en un campo. O extender esabúsqueda a todos los campos XML deuna tabla en busca de elementos rela-cionados por nombre, atributo o valor.Ese creo que será uno de los usos másimportantes de esta tecnología.

¿Y qué hay de las posibilidades de suutilización como mecanismo de inte-gración, tanto en aplicaciones como enflujos de trabajo entre plataformas oaplicaciones distintas, al estilo de lo quehace BizTalk Server ahora?

XML es un concepto para permitir laintegración y la transmisión de informa-ción independiente de su formato origi-nal o su destino final. Por tanto, no sóloes cierto lo que propones, sino que se vaextender a otras herramientas comoSharePoint desde el punto de vista de laintegración. Además, esto resolverá pro-blemas que los usuarios de las caracterís-ticas de XML de la versión 2000 de SQLServer habían mencionado a la hora de lautilización de los esquemas de los datosque se manejaban.

Por supuesto, el otro punto fuertede esta nueva versión es la integracióncon el CLR. ¿Crees que esa caracterís-tica será suficiente para una migración?

¿O que será lo suficientemente com-prendida como para motivar la migra-ción a esta versión?

Para situaciones diferentes, respues-tas diferentes. Somos conscientes que –ala fecha de hoy– hay gente a la que esacaracterística le trae sin cuidado. Existenotros, sin embargo, que han estado espe-rando la oportunidad de almacenar obje-tos dentro de la base de datos, y esa opor-tunidad se la brinda ahora esta nueva ver-sión. Dependerá de cada aplicación con-creta si la tecnología se aplica inmediata-mente o no.

¿Crees que el perfil típico del desa-rrollador típico de SQL Server se ade-cua a la incorporación inmediata de estasnovedades, o requerirá una fuerte cur-va de aprendizaje?

Yo no creo que sea un problema. Laaceptación de .NET es y seguirá siendocreciente, y su conocimiento, también.Cuando el desarrollador vea que hay for-mas de hacer cosas con menos esfuerzo ymás fiabilidad, irá adoptando la tecnolo-gía, como se ha hecho siempre. O tam-

bién, en el caso de consultas realmentecomplejas que podrían ser abordadas deotra forma novedosa en esta forma.

Has comentado en tu charla, que unprocedimiento almacenado (desde estaóptica), se puede convertir en un servicioWeb. Incluso que podremos convertirprocedimientos almacenados existentesen servicios Web. Esto nos lleva a una pre-gunta natural asociada con esto. ¿Qué vaa suceder con las Extensiones de los ServiciosWeb (WSE)?

En efecto, todo eso va a ser posible enla próxima versión. Pero no puedo con-testarte a esta pregunta en este momen-to. La tecnología de la que yo era res-ponsable, tenía que ver con SQL/XML,

Creo que lo cierto es que no va salir (WinFS) como partede Longhorn, ni en parte, ni en su totalidad. La buena

noticia es que será capaz de funcionar en otros sistemasoperativos, y no sólo en Longhorn

dotN

etM

anía

<<

15

dnm.directo.entrevistas<<

Alexander Vaschillo y Marino Posadas

Page 16: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET ... · con VB.NET y C#. ¡Mi madre es un Singleton! 46-48 Siguiendo con el tema del último artículo, volvemos a tratar

y la forma en que esto se ve desde el pun-to de vista externo. Veremos qué sucedeen los próximos meses…

Otro punto de confusión que me gus-taría aclarar aquí es la posibilidad dealmacenar ficheros en un campo de labase de datos. Cuando oí esto, al princi-pio pensaba que se almacenaría un “pun-tero” por así decirlo, a la posición físicade ese fichero, junto a información rela-cionada con él. Pero tú has comentadoque se trata de un almacenamiento realdel fichero dentro de un campo de unatabla de base de datos…

Su uso depende del contexto y delpropósito de uso que el fichero tenga.Pongamos que hablamos del formatoJPG. Una de las necesidades que se plan-tean es hacerlo de forma que se puedanincluir estos campos en consultas espe-ciales capaces de devolver informaciónadecuada acerca de esos datos. El otropunto a tener en cuenta, es que si utili-zas un tipo de almacenamiento comúnpara ficheros que –originalmente– sonbien distintos, en la salida se debe detener una idea clara de cuál es ese for-mato, para poder utilizarlo.

No sé si esta va a ser la utilización ópti-ma en la actualidad. Quizá lo sea en elfuturo y WinFS almacenará realmentecualquier tipo de información para ser-virla en la forma adecuada a quien la soli-cite, pero en la actualidad, esa no es la idea,o al menos, no en su sentido global. Lautilización ideal de esta tecnología serácuando existan más tipos de datos ade-cuados a los distintos tipos de almacena-miento, pero quizá eso requiera de máspotencia de ordenador y sólo tenga sen-tido dentro de unos años, cuando esapotencia esté disponible ampliamente.

A propósito de potencia de almace-namiento, James Gray decía que lapotencia vinculada al hardware tendrá ungran impacto en cómo usamos el softwa-re, puesto que un disco duro de dentro de10 años, será –en sí mismo– un ordena-dor como los actuales, con su CPU, sumemoria, etc. Entonces, el problema prin-cipal (como ya lo es hoy) será el del acce-so. ¿Podríamos ver en un futuro a WinFSpresente en cada dispositivo de almace-namiento vinculado a un sistema quesoporte .NET Framework?

Es una idea interesante. Y, efectiva-mente, así son las cosas hoy día.

Probablemente, la línea de investigaciónmás importante, una vez solventados losproblemas de almacenamiento sea la delacceso a esa información almacenada.Tenemos que ver WinFS como una capapor encima de cualquier tipo de almace-namiento. Un día estará presente inclu-so en los teléfonos móviles.

Siempre que hablo de bases de datostengo que referirme a las bases de datosorientadas a objetos. ¿Las ves factibles,entonces, con la tecnología actual?

WinFS es una capa por encima de latecnología de acceso a bases de datos.Ahora conocemos bien los entresijos delfuncionamiento óptimo de una base dedatos relacional. El problema es conse-guir que esos objetos se almacenen en unmotor relacional bien dimensionado yoptimizado, de la misma forma que aho-ra. De momento, esta tecnología nos pue-de ayudar a solventar el problema queplanteaba Jim Gray y que él mismo estácontribuyendo a resolver. Que el propiomecanismo de acceso a la información sevuelva más lógico, más apropiado para laforma en la que los seres humanos nece-sitamos acceder a la información. De todasformas, siempre va a existir algún tipo debúsqueda de la información, pero la for-ma en que organicemos su almacena-miento y construyamos los mecanismospara su acceso, serán vitales para el tiem-po de respuesta adecuado.

Para concluir, una comparación res-pecto a la importancia tecnológica a lar-go plazo de los 3 subsistemas deLonghorn: Avalon es la cosmética: muybonito, muy espectacular, pero su apor-tación se detiene ahí. Indigo es más impor-tante, creo, porque son comunicaciones.Pero WinFS es crítico, porque se trata decómo se comporta nuestra información,cómo se almacena, y cómo se recupera.¿Estoy en lo cierto?

Para mí, totalmente cierto. Incluso loque los otros dos subsistemas manejan (ymanejarán) seguirá siendo informaciónque se almacena, se lee, se transforma, setransporta y se vuelve a almacenar. Esasecuencia es, efectivamente, crítica en elcomportamiento de cualquier sistemaoperativo, y lo va a ser todavía más enLonghorn, y los sistemas venideros.

Muchas gracias por tu visión defuturo y hasta la próxima.

Gracias a vosotros.

dotN

etM

anía

<<

16

dnm.directo.entrevistas<<

La aceptación de .NET es yseguirá siendo creciente, ysu conocimiento, también.Cuando el desarrolladorvea que hay formas dehacer cosas con menos

esfuerzo y más fiabilidad, iráadoptando la tecnología,

como se ha hecho siempre

Page 17: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET ... · con VB.NET y C#. ¡Mi madre es un Singleton! 46-48 Siguiendo con el tema del último artículo, volvemos a tratar

dotN

etM

anía

<<

17

Tech•Ed Europe 2005

dnm.directo.eventos<<

dotNetManía quizá recuerde queel año pasado, a la vuelta del evento de Ámsterdam,titulábamos nuestra crónica como de un tiempo de espe-ra. Bien, la espera ha concluido, y –si bien las anun-ciadas versiones de VS 2005 y SQL Server 2005 noverán la luz hasta noviembre de este año–, las betascon las que estamos trabajando y el material expuestoen esta edición del Tech-Ed, muestran un grado demadurez suficiente como para poder evaluar estas betascon conocimiento de causa.

Llegamos a Ámsterdam con el convencimientode que la mayoría de los asistentes deseaba ver yacaracterísticas aplicadas de las versiones, demos conespectáculo, trucos incipientes, y algunos de los mejo-res anticipos de lo que las versiones finales van a ofre-cer. Y así fue.

Nos recibió Andrew Lees, con una keynote (o con-ferencia principal), en la que presentaba los dos pro-ductos como fruto de dos principios: la madurez en laplataforma, debido a tratarse de un tercera versión, yel “feedback” de los usuarios, inclusive durante el perí-odo de desarrollo. Presentó un nuevo SQL Server,mucho más maduro en todos sus aspectos, con una plé-tora de nuevas y reforzadas opciones, nuevos servicios,nuevas formas de construir la capa de datos en las apli-caciones y un sistema de réplicas y tolerancia a fallos,que llegaba al momento culminante cuando, –maza enmano– vuelve a aparecer en plena demostración de peti-

ciones a servidores y destruye –literalmente– uno delos equipos, que salta por los aires, mientras el otro ser-vidor se hace cargo de las peticiones que le llegaban alequipo destruido y permite seguir funcionando comosi nada: “Esto es tolerancia a fallos”, añadía, entre losaplausos de toda la audiencia, encandilada por una demotan contundente y clara como efectista. En otra de lasdemos, Brian Keller, Product Manager de Visual Studio,(con quien tuvimos ocasión de hablar posteriormen-te), nos mostraba lo tremendamente sencillo que resul-ta crear aplicaciones Web o Windows con el nuevoVisual Studio 2005, incluyendo, casi de fábrica, las capa-cidades de mantenimiento completo de una tabla deuna base de datos cualquiera, sin tener que escribir unasola línea de código fuente. Una característica de pro-ductividad que agradecerá todo aquel que tenga queabordar tareas rutinarias de mantenimiento. Y esto,funcionaba exactamente igual para Windows que paralas aplicaciones Web.

Posteriormente, mediado el evento, tuvimos oca-sión de asistir a una segunda keynote, realizada porDavid Vaskevitch, quien nos aportada la sabiduríaacumulada al frente de la construcción de aplicacio-nes en Microsoft, para analizar la evolución del soft-ware, desde hace 10 años hasta ahora, y justificada enesa evolución, extrapolar las tendencias y las prome-sas de los fabricantes, para acabar dibujando un per-fil muy evolucionado en el que el software es cadavez más inteligente, más próximo al usuario final, yMicrosoft, y las herramientas que allí se presentaban,sus valedores tecnológicos, gracias a un proceso deinnovación continua, fruto de las elevadas inversio-nes en investigación, llevadas a cabo por Microsoft

<< El lector veterano de

En la entrevista con Brian Keller,Product Mannager de Visual Studio

Marino Posadas

Andrew Lees durante la “keynote” inicial (la maza asoma como amenaza)

Page 18: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET ... · con VB.NET y C#. ¡Mi madre es un Singleton! 46-48 Siguiendo con el tema del último artículo, volvemos a tratar

Research, y cuya tendencia parece seguiren crecimiento.

Más profunda, y también más filosó-fica que la anterior, la charla de Vaskevitch,venía a recordarnos que la evolución tec-nológica es ya un fenómeno imparable yla empresa que quiera mantenerse viva,debe participar de esa corriente de reno-vación, adoptando las novedades en ini-cio, y ofreciendo a sus clientes las últimasposibilidades tecnológicas con conoci-miento del medio.

La organización de contenidos,las ponencias y… los ponentes

Al igual que el año pasado, las sesio-nes se dividían en varios bloques tron-cales, o tracks, tales como Seguridad,Herramientas de Desarrollo, GestiónOperativa, Inteligencia de negocio, etc, alos que precedían un día de Pre-Conferences, con una oferta de semina-rios de gran calidad, y charlas con gurús,como Steve Railey (en seguridad), JeffProsise (a quien también entrevistamos)o Kimberley Tripp (SQL Server),quienes también nos regalaron algunasde las mejores ponencias de este Tech-Ed.

Los más de 6.500 asistentes nos fui-mos repartiendo por las sesiones en unabúsqueda entre la calidad de las ponen-cias en sí, y el interés personal en loscontenidos, que casi siempre concluíacon éxito. Citar aquí todo lo bueno quese vivió en las salas es difícil, pero la per-sonalidad de algunos ponentes era inne-gable: Juval Löwy, conciso y eleganteen su visión de las peculiaridades de lanueva versión de Visual Studio, arran-có varias veces los aplausos de la audien-cia, mostrándonos la nueva herramien-ta, y con una excelente visión popular,enfatizando siempre aquellas partes másproductivas. Incluso superior fue el efec-to en el público causado por el showmanSteve Railey, en sus charlas sobre segu-ridad. Metido entre el público, interro-gando en directo, y haciendo que las res-puestas in situ fueran la ocasión paracontinuar de forma natural sus argu-mentos, abarrotó las sesiones en las queparticipaba, dejando en la audienciasiempre un mensaje entusiasta. Tambiénfue muy celebrada la presentación deJeff Prosise, en el auditórium, con sucharla sobre seguridad en el códigofuente aplicada a la construcción desitios Web con ASP.NET. En el inter-

viú que nos concedió posteriormente yque publicaremos en su momento, nosconfesaba su abandono de las labores deautor de libros (su última obra fue“Programming.NET Framework”),para concentrarse exclusivamente en laescritura de artículos (inaugura una nue-va sección en MSDN Magazine a par-tir de este mes de septiembre), las con-ferencias por todo el mundo y la for-mación y consultoría.

Tampoco pudimos asistir a todas lascharlas que nos hubiera gustado por razo-

nes operativas y de tiempo, perome gustaría recordar con algu-nos adjetivos a los que destaca-ron por méritos propios: elentusiasmo y calidad de AriBixhorn (Lead Product Managerde la estrategia de serviciosWeb), cuando presentabaIndigo, la cohesión y secuencialógica de la exposición deKimberley Tripp en sus variascharlas sobre aspectos diversosde SQL Server 2005, la visión

dotN

etM

anía

<<

18

dnm.directo.eventos<<

Birds-of-a-feather: reuniones de café con equipos de desarrollo

Durante la entrevista con Jeff Prosise… un sabio Juval Löwy en un momento de su ponencia

David Vaskevitch, durante su exposición en la segunda keynote

Con Ari Bixhorn, Lead Product Manager de la estrategiade servicios Web

Page 19: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET ... · con VB.NET y C#. ¡Mi madre es un Singleton! 46-48 Siguiendo con el tema del último artículo, volvemos a tratar

simplificadora de Ingo Rammer, centra-do en el rendimiento, escalabilidad y dis-ponibilidad de los sistemas construidoscon .NET Framework, junto a otro denuestros entrevistados, Arvindra Sehmi,un profundo conocedor de las arquitec-turas de .NET y de SOA en particular.Mark Russinowitch, al igual que ya hicie-ra el año pasado, volvió a recordarnos cuánvulnerables son nuestros sistemas a ata-ques de todo tipo utilizando –a veces– losmás contundentes argumentos en formade demos, que ponían en evidenciamuchas prácticas habituales en la cons-trucción de aplicaciones. Similares –porsu contundencia lógica– resultaronmuchas de las recomendaciones del vete-rano Gert Drappers, ya fuera al referir-se a la afinación de servidores para obten-ción de rendimiento, o al analizar –y des-pués comparar– las capacidades ofrecidaspor la integración del CLR en el motorde SQL Server, respecto a las posibilida-des añadidas al lenguaje T-SQL. Otrosviejos conocidos que estuvieron por allí ycaptaron la atención mayoritaria, fueronRafal Luckawiecki, quien introdujo consu carisma habitual algunas novedades dela que será la versión 4 del marco de tra-

bajo para aplicaciones Microsoft, la MSF4.0, el extrovertido Brian Goldfarb (aquien el lector recordará que entrevista-mos a su paso por Madrid), quien presentómuchas de las novedades de ASP.NET2.0, la polivalente Michelle LerrouxBustamante, interesada en servicios Weby en migraciones desde Java, o TonyGoodhew, que anticipaba algunas de lasque se convertirán –en breve– en buenasprácticas para la construcción de interfa-ces de usuario que resulten fáciles demigrar a Avalon, cuando la plataforma estédisponible en su versión definitiva.

Y por cierto, no se habló demasiadode Longhorn (quiero decir, del que aho-ra sabemos que se llamará Windows Vista)en términos de producto, sino que se rea-lizaron varias presentaciones vinculadas aaspectos muy puntuales del sistema, comonuevas características de seguridad, o lasdos API que se han popularizado a travésde versiones CTP (Avalon e Indigo) y quesabemos que podrán instalarse en los equi-pos actuales. Esto, sin duda, resultará unacicate para la migración al nuevo siste-ma, una vez que vayamos observando susposibilidades.

Los asistentes:el otro Tech-EdMicrosoft se ha empeñado en una

campaña para unir los intereses comunesde los desarrolladores a través de herra-mientas comunitarias. Podemos verlonada más que abrimos la beta 2 de VisualStudio (con un nuevo elemento de menúque nos pone en contacto con recursos decomunidades), y pudimos comprobarlosobre el terreno, a través de las variadasiniciativas que –en ese sentido– poblabantodos los rincones del RAI. Por un lado,unas reuniones informales de café (en uncafé), con integrantes de distintos equiposde desarrollo de los productos (Birds-of-a-feather), o las asesorías gratuitas ofreci-das por la iniciativa Ask-the-Experts, en lasque expertos de hasta 12 tipos de tecno-logías distintas, respondían personalmen-te a las preguntas de usuarios interesados.Por otro, reuniones de comunidades,como la ofrecida en el MVP CommunityLounge, para los MVP asistentes, a la quecompareció, como el año anterior, elDirector Mundial del Programa MVP, SeanO'Driscoll, quien estuvo haciendo balan-ce, de la evolución del programa MVP en

términos de calidad de los seleccionados,de propuestas de colaboración, y de reco-nocimiento empresarial del valor añadi-do que suponen sus miembros.

También estaban disponibles másde 250 equipos para albergar los popu-lares HOL (Hands-on-Labs), prácti-cas de laboratorio dirigidas y/o asisti-das, donde podemos aprovechar laoportunidad para introducirnos en unatecnología de forma guiada. Las sesio-nes Chalk & Talk, aprovechaban lostiempos de descanso, para dar respuestaa preguntas de los asistentes en direc-to, que también podían participar –soli-citando respuestas con anterioridad–,en las Panel Discussions, que, modera-das por un experto en el tema de dis-cusión, comentaban las respuestas a laspreguntas propuestas, en el marcogeneral de la sesión e incluso admitíanpuntualizaciones en directo para sopor-te y apoyo de las soluciones propues-tas. Parece que continúa –en general–la tendencia a facilitar la participaciónreal de los asistentes en los contenidosy realización de ciertos aspectos deestos eventos.

dotN

etM

anía

<<

19

dnm.directo.eventos<<

Una vista general de los Hands-on-Labs

Con Sean O'Driscoll, Director delPrograma MVP en Redmond

Rafal Luckawiecki

Mark Russinowitch, en su conferencia sobre virus

Page 20: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET ... · con VB.NET y C#. ¡Mi madre es un Singleton! 46-48 Siguiendo con el tema del último artículo, volvemos a tratar

La representación española y laUniversidad

Olvido Nicolás (TechNet), Carlos Oramas (Grupode Soporte), y Alberto Sánchez (relaciones conUniversidades), de Microsoft Ibérica, llevaron el peso dela representación española, que, en el apartado univer-sitario era bastante numerosa, con asistentes de muchasfacultades de informática españolas, (ver foto de grupoadjunta), que encontraron tiempo, para hacer un pocode todo, y continuaron el proceso de divulgación de latecnología .NET que comenzara ya hace varios años, yse ha traducido en varias iniciativas en forma de asigna-turas en la carrera de Informática, seminarios y mastersimpartidos en facultades de toda nuestra geografía. Losrepresentantes de prensa, impecablemente atendidos porMónica García de la agencia Ketchum/SEIS, tambiéntuvimos oportunidad de disfrutar de la ciudad.

Los otros asistentes: los sponsors y fabri-cantes

En este apartado, pudimos apreciar un incrementode la presencia de fabricantes de productos de terceros,cuyas demos de producto, rozaban –a veces– el espectá-culo, como cuando permitían que los usuarios se subie-ran a un Fórmula 1 conectado con un sistema de simu-lación por ordenador, y sintieran (con vibraciones inclui-das), las sensaciones que se deben de sentir al conduciruna de esas máquinas (sin peligro, eso sí). Pudimos com-probar el buen estado de salud de los productos estrellade Altova, Compuware, Oracle, HP, Borland, Deve-lopMentor, Sybari, Symantec, eBay, Infragistics,ScriptLogic (que nos presentó su nueva su nueva solu-ción de administración de sistemas), Citrix (con cuyorepresentante en EMEA, Dave Austin, tuvimos oca-sión de departir sobre la presentación de sus nuevos pro-ductos para la pequeña/mediana empresa) o MainSoft(curiosamente, esta empresa está popularizando un soft-ware –cuya demo nos mostraron en directo– que per-

mite la migración de aplicaciones .NET a la plataformaJ2EE, y que cuenta con el apoyo del promotor de la pla-taforma .NET para Linux, Miguel de Icaza). Tuvimosocasión de comentar por teléfono con Miguel desdeEE.UU., y con el director de MainSoft, Yacoov Cohen,en Israel, que nos comentaron también la visión que tie-nen en Novell sobre los desarrollos para la plataforma.NET, y las implicaciones que prevén con la apariciónde Windows Vista el próximo año.

Y la traca final…Como siempre, la traca final, con mucha gente, varios

ambientes, buena música y comida europea (a buenentendedor…) puso el punto final de unas jornadas inten-sas, repletas de información, que sólo a la vuelta estamosempezando a digerir, y que refrescaremos con el inva-luable DVD post-Tech-Ed, que incluye las grabacionesde todas las sesiones impartidas, y contribuye en buenamedida a la sensación de evento de aprendizaje, ya quepodemos analizar posteriormente cualquier sesión yreproducir su código fuente, como refuerzo de las ide-as, o para asistir –llanamente– a lo que no pudimos verpor falta de tiempo.

ConclusiónEs difícil recoger en una única ubicación tanta activi-

dad y tan gran número de expertos en tecnología, comola que se ha aglutinado en Ámsterdam este año. Hemosvisto el futuro, con un nivel de aproximación a la realidadfinal más que notable. Hemos podido departir con gen-tes de intereses similares y hemos disfrutado de las capa-cidades de albergue que la capital de Holanda ofrece. Unaciudad que ha mostrado ya sobradamente su capacidad ybuena disposición para albergar eventos de este tipo. Elaño próximo repetirá escenario (tercera edición consecu-tiva, como en Barcelona). Lo acogedor de la ciudad y subuen clima para esta época del año, le hacen un huéspedidóneo para este tipo de eventos. Tech-Ed 2006 será sinduda el anticipo de Windows Vista (a punto de aparecer,y cuya presencia será sin duda la más destacada). Esperemosque en un futuro el evento retorne a España, tras los 3años de rigor que, tradicionalmente, no se prolongan enuna misma ciudad organizadora.

dotN

etM

anía

<<

20

dnm.directo.eventos<<

Dos de los representantes de eBay

El grupo de universitarios españoles, con Alberto Sánchez (primero de laderecha, de rodillas)

Page 21: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET ... · con VB.NET y C#. ¡Mi madre es un Singleton! 46-48 Siguiendo con el tema del último artículo, volvemos a tratar
Page 22: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET ... · con VB.NET y C#. ¡Mi madre es un Singleton! 46-48 Siguiendo con el tema del último artículo, volvemos a tratar

¿qué es el área de notificación? El áreade notificación, en inglés llamado System Tray, esuna parte de la barra de tareas de Windows que nosmuestra los programas que tenemos corriendo ensegundo plano y permite acceder a ellos rápidamente(ver figura 1).

Me gustaría que mi aplicación estuviera disponi-ble en dicha área, ¿cómo puedo añadir un icono quela represente?, ¿necesito convertirla a un servicioWindows?… Conforme avanzamos en este tema nostopamos con varios desafíos, en este artículo vamosa intentar resolverlos. Los puntos a tener en cuentason los siguientes:

• Añadir nuestra aplicación al área de notificación.• Distinguir entre cierre de ventana y cierre de

sesión del usuario.• Arrancar nuestra aplicación al inicio de sesión

del usuario sin mostrar la ventana principal dela misma.

• Evitar que haya más de una instancia de nuestraaplicación ejecutándose a la vez.

Esto lo iremos desgranando punto por punto. Enwww.dotnetmania.com se encuentra disponible unaaplicación de ejemplo, realizada en C#, que le ayu-dará a seguirlos. ¡Manos a la obra!

Añadir nuestra aplicación al área de noti-ficación

Gracias a .NET Framework ésta es la parte mássencilla de implementar. Los recursos que necesita-mos son los siguientes:

• Crear un proyecto “Aplicación Windows”.• Añadirle/crearle un icono que, por ejemplo, ten-

drá el nombre Notify.ico, y darle valor“Embedded Resource” a la propiedad “Buildaction”.

• Asignar un menú de contexto a la ventana aso-ciada al icono de notificación; a éste lo llama-remos Notifymenu.

Añadiendo nuestra aplicación al área de notificación

Braulio Díez

dnm.plataforma.net

Figura 1. Área de notificación

<< Lo primero de todo,

Reyes GarcíaHa sido consultora “todo

terreno”.Hoy día se dedica algratificante mundo de la

docencia.

Braulio Díezcolabora habitualmente condotNetManía. Es MCSD en

programación distribuida con Visual C++.

Trabaja como SolutionsDeveloper de Avanade.

Conseguir que nuestra aplicación apareciese en el área de notificación deWindows (como hace Messenger o una herramienta antivirus) no era tareafácil con las herramientas de desarrollo antiguas. ¿Qué tal se porta .NET a lahora de implementar esta funcionalidad?

Reyes García

Servicios Windows

Otra opción para implementar aplicacio-nes que corran en segundo plano es imple-mentarlas como servicios Windows. Estos ser-vicios están siempre corriendo aunque no hayausuario activo, si necesitamos darle un inter-faz de ventanas tendremos que combinar elservicio con una aplicación estándar que podríaser activada vía remoting.

.NET Framework incorpora soporte paracrear servicios, pero esto queda fuera del obje-tivo de este artículo.

][

Page 23: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET ... · con VB.NET y C#. ¡Mi madre es un Singleton! 46-48 Siguiendo con el tema del último artículo, volvemos a tratar

Ya sólo nos queda añadir el código, declarar elobjeto de área de notificación e inicializarlo en elconstructor de la ventana donde lo vayamos a usar(ver el fuente 1).

Tras compilar y ejecutar la aplicación tendráel aspecto que se ve en la figura 2. Sólo un peque-ño detalle: cuando la cerramos, nuestro icono tar-

da en desaparecer, esto lo podemos remediarsobrecargando el método Dispose de la ventana yliberando explícitamente nuestro objeto (ver elfuente 2).

Normalmente las aplicaciones destinadas a ejecutarse en el área de notificación lo hacen mientras el usuario tenga su sesión activa, así pues,

si intentamos cerrar la ventana principal lo que hace es minimizarse

dotN

etM

anía

<<

23

dnm.plataforma.net<<

public class mainForm : System.Windows.Forms.Form{(…)// Declaramos el objeto que manejara nuestra área de notificación.private NotifyIcon m_notifyIcon;(…)

// Constructor de nuestra ventana principal.public mainForm(){

InitializeComponent();// Inicializamos él objeto de área de notificación.m_notifyIcon = new NotifyIcon();m_notifyIcon.Text = “DNM - Botón Derecho muestra menú”;m_notifyIcon.Visible = true;

// Le asignamos el icono que queremos mostrarm_notifyIcon.Icon = new Icon(GetType(),”Notify.ico”);// Le asignamos el menú de contexto que hemos arrastrado a la ventana // principal, los eventos // del menú lo podemos enlazar con métodos directamente desde el editor // de la ventana// principal, como si de cualquier control se tratase.m_notifyIcon.ContextMenu = NotifyMenu;

// También podemos enganchar eventos del Icono que se muestra // por ejemplo si pulsamos // doble click sobre él para que se muestre la ventana principal.m_notifyIcon.DoubleClick += new

System.EventHandler(this.notifyIcon_DoubleClick);}

// Doble click en nuestro icono del área de notificación: mostrar // la ventana... (Podemos hacer lo mismo con otros eventos)

private void notifyIcon_DoubleClick(object sender, System.EventArgs e) {

Show();}

}

Fuente 1. Inicializando nuestro objeto de área de notificación

Figura 2. Nuestra aplicación de ejemplo e icono deNotificación (Smily)

// Liberar recursos que estén en uso.protected override void Dispose( bool disposing ){

if( disposing ){

if (components != null){

components.Dispose();}// Hacemos un dispose de nuestro objeto de //área de notificación.this.m_notifyIcon.Dispose();

}base.Dispose( disposing );

}

Fuente 2. Liberando recursos

Page 24: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET ... · con VB.NET y C#. ¡Mi madre es un Singleton! 46-48 Siguiendo con el tema del último artículo, volvemos a tratar

Distinguir entre cierre de ven-tana y cierre de sesión delusuario

Normalmente las aplicaciones des-tinadas a ejecutarse en el área de noti-ficación lo hacen mientras el usuariotenga su sesión activa, así pues, siintentamos cerrar la ventana princi-pal lo que hace es minimizarse. Parapoder cerrarla, o bien lo hacemos des-de una opción del menú de contexto,o bien cuando el usuario cierra susesión. En este último caso la aplica-ción lo detecta automáticamente y secierra sola.

Para poder distinguir entre cierre desesión o cierre normal de ventana, tene-mos que usar funciones nativas de Win32y capturar el mensaje WM_QUERYENDSES-SION (SystemEvents.SessionEnding nofunciona cuando la ventana principalde nuestra aplicación se encuentraescondida). En el fuente 3 podemosver cómo distinguir cada evento decierre de aplicación.

Arrancar la aplicación cuandose inicie la sesión y no mostrarla ventana

Para que una aplicación arranquecuando se inicie la sesión de usuario esnecesario añadir una entrada a lassiguientes direcciones del registro:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\

Windows\CurrentVersion\Run

HKEY_CURRENT_USER\SOFTWARE\Microsoft\

Windows\CurrentVersion\Run

Con la primera conseguimos que laaplicación se ejecute para cualquier usua-rio que arranque la máquina, la segundaes para el usuario que tenga activa lasesión en ese momento. En dicha entra-

dotN

etM

anía

<<

24

dnm.plataforma.net<<

// Distinguir entre el cierre con el botón aspa de la ventana (minimizar), // o el cierre desde el menú de contexto o el cierre desde la sesión (cerrar // aplicación)private bool m_bRealClosing = false;(…)

// Si recibimos el mensaje WM_QUERYENDSESSION el usuario está cerrando su sesión,// cerrar la aplicación.protected override void WndProc(ref Message m){

base.WndProc(ref m);

// WM_QUERYENDSESSIONif (m.Msg == 0x11){

ReallyCloseApplication();}

}

// Si elegimos en el menú de contexto “Cerrar aplicación”.private void muClose_Click(object sender, System.EventArgs e){

ReallyCloseApplication();}

// Si cerramos desde el botón aspa de la ventana, esconder la ventana, si no // cerrar la aplicación.private void mainForm_Closing(object sender, System.ComponentModel.CancelEventArgse){

if(!m_bRealClosing){

this.Hide();e.Cancel = true;

}}

// Cerrar “de verdad” la aplicación. private void ReallyCloseApplication(){

m_bRealClosing = true;if(this.m_FormAlreadyLoaded){

Close();}else{

// Hacemos un dispose de nuestro objeto de área de notificación.this.m_notifyIcon.Dispose();

}

// Nos salimos de la aplicación (hay que tener en cuenta que la app no tiene // asociada una ventana principal.Application.Exit();

}

Fuente 3. Cerrando la aplicación

Para poder distinguir entrecierre de sesión o cierre

normal de ventana,tenemos que usar

funciones nativas de Win32y capturar el mensaje

WM_QUERYENDSESSION

Page 25: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET ... · con VB.NET y C#. ¡Mi madre es un Singleton! 46-48 Siguiendo con el tema del último artículo, volvemos a tratar

da le indicaremos el nombre de nuestra aplicación y elpath completo donde podemos encontrarla. El frag-mento de código que realiza esta función se puede encon-trar en la aplicación de ejemplo (método NotifyHelper.

RunApplicationOnSessionStartup).Otro punto a tener en cuenta es que la aplicación

se arranque automáticamente de forma “silenciosa”,es decir, que muestre el icono de notificación pero nola ventana principal, para ello modificamos el “main”de la aplicación (ver el fuente 4).

Permitir sólo una instancia de nuestraaplicación corriendo a la vez

Por último, no podemos olvidarnos de que lamayoría de aplicaciones de este tipo no suelen per-mitir que haya más de una instancia de la mismacorriendo a la vez, esto lo controlamos usando elobjeto de sincronización del sistema operativo, unmutex local con nombre. Cuando se arranca la apli-cación intentamos apropiarnos de dicho mutex, siya hay una aplicación del mismo tipo corriendo, la

apropiación fallará y cerraremos la aplicación (verel fuente 5 y 6).

dotN

etM

anía

<<

25

dnm.plataforma.net<<

Para saber más

Si quiere ampliar información acerca de este tema, aquí tiene unos enla-ces que le pueden ser de interés:

“Adding tray icons and context menus”http://www.codeproject.com/csharp/trayiconmenu01.asp

“Making a Windows Forms app respond to System Shutdown”http://www.stevex.org/dottext/articles/155.aspx

“Making a startup Window Form Invisible” http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vbcon/html/vbtsksettingformtobeinvisibleatitsinception.asp

“Adding your application to the Windows Startup” http://www.codeproject.com/system/windows_startup.asp

“More about single instance Mutex”http://www.yoda.arachsys.com/csharp/faq/#one.application.instance

[STAThread]static void Main(){

// La siguiente es la línea de código que hemos // sustituido: //// Application.Run(new mainForm());//// Creamos el mainForm (el constructor muestra el // icono en el área de notificación).mainForm mainform = new mainForm();

// En vez de mostrar la ventana, directamente // dejamos correr la aplicación.Application.Run();

}

Fuente 4.Arrancar la aplicación en modo “silencioso”

[STAThread]static void Main(){

// __UniqueMutexAppName es sólo un string que contiene// un nombre único, e.g. “MiAplicacion_GUID”if(!NotifyHelper.IsOtherInstanceOfTheAppAlreadyRunning(GlobalConstantsValues.__UniqueMutexAppName)){

mainForm mainform = new mainForm();Application.Run();

}}

Fuente 5. Comprobando que no hay otra instancia de la aplicación corriendo

static public bool IsOtherInstanceOfTheAppAlreadyRunning(string uniqueName)

{bool firstInstance;// Si podemos reservar el mutex, no hay más instancias de // la aplicación corriendo._SingleAppInstanceMutex = new Mutex(false, “Local\\” +

uniqueName, out firstInstance);

// No debemos liberar el mutex, cuando la aplicación se cierre, // este será liberado automáticamente.return !firstInstance;

}

Fuente 6. Comprobación con el Mutex

...la mayoría de aplicaciones de estetipo no suelen permitir que haya más

de una instancia de la misma corriendo a la vez, esto lo

controlamos usando el objeto de sincronización del sistema operativo,

un mutex local con nombre

Page 26: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET ... · con VB.NET y C#. ¡Mi madre es un Singleton! 46-48 Siguiendo con el tema del último artículo, volvemos a tratar

El modelo de objetos de Visual Studio .NET

Muchas de las tareas que realizamos a mano en Visual Studio .NET se pueden auto-matizar mediante macros y muchas otras se pueden mejorar o extender mediantecomplementos.En este artículo veremos el modelo de objetos que proporciona VisualStudio .NET para poder manejar el propio entorno de desarrollo desde código.

<< del mes de junio hablamos de la creaciónde complementos (add-ins) para Visual Studio, cen-trándonos solamente en proporcionar la infraes-tructura de comandos, barras de herramientas,menús y botones de nuestro complemento. En esteartículo profundizaremos en el modelo de objetosque nos proporciona el entorno de desarrollo deVisual Studio .NET 2002/2003 para su automati-zación. Este modelo de objetos reside en el ensam-blado EnvDTE.dll, que nos proporciona el espaciode nombres EnvDTE (podemos explorar este mode-lo mediante el examinador de objetos). La clase raízdel modelo es DTE, que son las siglas de DevelopmentTools Environment y representa el entorno de desa-rrollo. Una instancia de dicha clase nos dará acce-so a las ventanas, archivos, documentos, etc. deVisual Studio .NET. La manera de obtener una ins-tancia de dicha clase depende de cómo estemosautomatizando el entorno de desarrollo:

• Usando el editor de macros (menú “Herra-mientas”, “IDE de macros…”), existe una instan-cia implícita con el nombre DTE. Por ejemplo, lasiguiente macro muestra el nombre y la versióndel entorno de desarrollo:

Sub Macro1()MessageBox.Show(DTE.Name & " " & DTE.Version)

End Sub

• Usando un complemento, el métodoOnConnection recibe en el parámetroApplication dicha instancia. Como se recibe deltipo Object, debemos convertirla al tipoEnvDTE.DTE. La variable usada por el asistente decomplementos es applicationObject, por lo que

ésta es la instrucción que veremos siempre endicho método:

applicationObject = CType(application, EnvDTE.DTE)

• Usando un programa externo al propio VisualStudio .NET, por ejemplo un archivo VBScript,se puede crear una instancia de la clase DTEmediante los ProgID “VisualStudio.DTE.7.1”para Visual Studio .NET 2003 y“VisualStudio.DTE.7” para Visual Studio .NET2002, o bien “VisualStudio.DTE” para usar laversión más alta de las que haya instaladas. Aquíse muestra un script en lenguaje VBScript queabre una instancia de Visual Studio .NET, lahace visible, muestra su nombre y versión y lacierra:

Dim objDTE

Set objDTE = CreateObject("VisualStudio.DTE")

objDTE.MainWindow.Visible = True

MsgBox objDTE.Name & " " & objDTE.Version

objDTE.Quit

Con cualquiera de estos métodos tendremos unainstancia de la clase DTE y ya podremos empezar a“jugar” con ella. En los siguientes apartados veremoscómo manejar por código las soluciones, proyectos,archivos y ventanas del entorno de desarrollo, cómoeditar el texto de nuestros documentos de código ycómo obtener información sobre sus elementos decódigo (clases, procedimientos, parámetros, etc.) ¡sintener que “parsear” el documento!

Carlos Quintero

dnm.plataforma.net

En el número 16

Carlos J.Quinteroes Microsoft MVP de .NET desdeprincipios del año 2004. Es autor

del popular complemento MZ-Tools 3.0 para VB6,VB5 y VBA, y

de MZ-Tools 4.0 para VisualStudio .NET 2002/ 2003, ambos

disponibles enhttp://www.mztools.com

Page 27: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET ... · con VB.NET y C#. ¡Mi madre es un Singleton! 46-48 Siguiendo con el tema del último artículo, volvemos a tratar

Soluciones,proyectos y archi-vos

Como sabemos, una solución es unconjunto de proyectos relacionados y éstosa su vez se componen de referencias yarchivos. Para manejar una solución dis-ponemos de la clase EnvDTE.Solution, quese obtiene a partir del objeto DTE median-te su propiedad Solution. Para manejar losproyectos disponemos de la caseEnvDTE.Project, y podemos obtener losproyectos de una solución mediante lacolección Solution.Projects. Para mane-jar los archivos disponemos de la claseEnvDTE.ProjectItem y los archivos de unproyecto se obtienen mediante la colec-ción Project.ProjectItems. En este pun-to hay que indicar que un ProjectItem nosiempre es un archivo, también puede seruna carpeta y que un archivo puede tenera su vez otros archivos relacionados. Porejemplo, las páginas ASPX tienen archi-vos de código por detrás, y los archivos deformularios tienen archivos .RESX rela-cionados. Para tratar ambos casos, la cla-se EnvDTE.ProjectItem proporciona unacolección ProjectItem.ProjectItems, lacual tiene a su vez una propiedadProjectItems.Parent para poder realizarla navegación por la jerarquía en ordenascendente. Finalmente, cualquierProjectItem tiene una propiedadProjectItem.ContainingProject parapoder saber cuál es su proyecto padre. Contodo esto podemos obtener la jerarquía deproyectos y archivos de nuestra solución,y obtener las propiedades de cada ele-mento, como veremos más adelante. Peroantes veamos cómo obtener informaciónsobre las referencias de un proyecto.

Si examinamos la clase EnvDTE.Projectveremos que no hay ninguna colecciónpara obtener las referencias de un proyec-to. Esto es así porque no todos los tipos deproyecto usan referencias (por ejemplo,los proyectos de instalación). Para pro-porcionar acceso a propiedades y métodosespecíficos de un tipo de proyecto existela propiedad Project.Object, que devuel-ve un tipo System.Objectque ha de ser con-vertido a un tipo específico del tipo de pro-yecto. En el caso de C# y VB.NET, estetipo es VSLangProj.VSProject, que estádefinido en el ensamblado VSLangProj.dll,separado del ensamblado EnvDTE.dll y quepor tanto habrá que añadir separadamen-

dotN

etM

anía

<<

27

dnm.plataforma.net<<

Sub MacroInformacionSolucion()Dim objProject As EnvDTE.ProjectDim objVSProject As VSLangProj.VSProjectDim objReference As VSLangProj.Reference

TryIf DTE.Solution.IsOpen() Then

' Muestra las propiedades de la soluciónDebug.WriteLine("Nombre completo de la solución: " & DTE.Solution.FullName)MostrarPropiedades(DTE.Solution.Properties)

' Muestra los proyectosFor Each objProject In DTE.Solution.Projects

Debug.WriteLine("Nombre completo del proyecto: " & objProject.FullName)Debug.WriteLine("Nombre del proyecto: " & objProject.Name)Debug.WriteLine("Nombre único del proyecto: " & objProject.UniqueName)MostrarPropiedades(objProject.Properties)MostrarProjectItems(objProject.ProjectItems)

If TypeOf objProject.Object Is VSLangProj.VSProject ThenobjVSProject = DirectCast(objProject.Object, VSLangProj.VSProject)For Each objReference In objVSProject.References()

Debug.WriteLine("Referencia " & objReference.Identity)Next

End If

Next

End If

Catch objException As ExceptionMessageBox.Show(objException.ToString)

End Try

End Sub

Sub MostrarPropiedades(ByVal colProperties As EnvDTE.Properties)Dim objProperty As EnvDTE.PropertyDim objValue As Object

For Each objProperty In colPropertiesTry

objValue = objProperty.ValueCatch

objValue = NothingEnd Try

If objValue Is Nothing ThenDebug.WriteLine(objProperty.Name & ": <vacío>")

ElseDebug.WriteLine(objProperty.Name & ": " & objValue.ToString)

End IfNext

End Sub

Sub MostrarProjectItems(ByVal colProjectItems As EnvDTE.ProjectItems)Dim objProjectItem As ProjectItem

For Each objProjectItem In colProjectItemsMostrarPropiedades(objProjectItem.Properties)

' Entra en recursiónMostrarProjectItems(objProjectItem.ProjectItems)

NextEnd Sub

Fuente 1

Page 28: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET ... · con VB.NET y C#. ¡Mi madre es un Singleton! 46-48 Siguiendo con el tema del último artículo, volvemos a tratar

te. Una vez que hemos convertido Project.Object aVSLangProj.VSProject, esta clase sí contiene una colec-ción VSProject.References para obtener las referenciasde un proyecto.

La macro del fuente 1 hace uso de todo lo expli-cado y obtiene información de la solución y sus pro-yectos, archivos y referencias.

Conviene indicar que algunas de las propiedades delos objetos del modelo de extensibilidad son de tipoString y no un valor enumerado como cabría esperar.Esto es así porque siendo Visual Studio .NET tan exten-sible que permite albergar nuevos lenguajes de progra-mación o nuevos tipos de proyecto, no se pueden aco-tar los valores que puede tomar una propiedad. Muchosde los valores conocidos de dichas constantes están dis-ponibles en la clase EnvDTE.Constants o en clases delensamblado VSLangProj (para proyectos VB.NET y C#)como las clases VSLangProj.PrjKind (para saber el len-guaje de un proyecto), VSLangProj.prjOutputType (parasaber el tipo de proyecto), etc.

También podemos crear soluciones mediante auto-matización, añadir proyectos a una solución y añadirarchivos o referencias a un proyecto. Esto es muy útilsi deseamos construir una especie de asistente que creeel esqueleto de una aplicación conforme a los estánda-res de proyectos de nuestra empresa. Las soluciones sepueden crear mediante el método Solution.Create, sepueden guardar mediante el método Solution.SaveAsy se pueden volver a abrir mediante el métodoSolution.Open. Para añadir proyectos a una soluciónpodemos usar o bien el método Solution.AddFromFile(para añadir proyectos que ya están creados) o bien elmétodo Solution.AddFromTemplate (para añadir pro-yectos nuevos). Para añadir archivos y carpetas a un pro-yecto tenemos a nuestra disposición varios métodoscomo ProjectItems.AddFolder (para crear carpetas nue-vas), ProjectItems.AddFromDirectory (para añadir todoslos archivos que se encuentren en una carpeta),ProjectItems.AddFromFile (para añadir un archivo exis-tente que se deja en su carpeta y se referencia desde ahí),ProjectItems.AddFromFileCopy (para añadir un archivoexistente que se copia a la carpeta de destino antes deser añadido) y ProjectItems.AddFromTemplate (para aña-dir archivos nuevos).

Para añadir referencias a un proyecto tenemos quehacerlo a través de la colección VSLangProj.Referencesque vimos anteriormente. Esta colección proporcionalos métodos References.Add (para añadir una referen-cia a un ensamblado .NET), References.AddActiveX(para añadir una referencia a un componente COM) yReferences.AddProject (para añadir una referencia aotro proyecto de nuestra solución).

VentanasPara manejar ventanas el modelo de extensibilidad

nos proporciona la clase EnvDTE.Window. BásicamenteVisual Studio .NET proporciona 3 tipos de ventanas:

• La ventana principal del IDE, que se obtienemediante la propiedad DTE.MainWindow.

• Las ventanas de documentos.• Las ventanas de herramientas (ToolWindows), como

el explorador de soluciones, la lista de tareas, laventana de propiedades, etc.

La propiedad DTE.ActiveWindow devuelve la ven-tana activa del IDE. Se puede acceder a todas las ven-tanas mediante la colección DTE.Windows, que pode-mos iterar en busca de una ventana en particular. Paraventanas de herramientas es más óptimo buscar coníndices únicos proporcionados por las constantes deEnvDTE.Constants.vsWindowKindXXX. Muchas de lasventanas del IDE proporcionan un modelo de obje-tos que permite manipular su contenido. Para ello,las ventanas proporcionan una propiedadWindow.Object que puede ser convertida al tipo ade-cuado de dicha ventana. Por ejemplo, la macro delfuente 2 obtiene la ventana de la lista de tareas y mues-tra las tareas de la lista.

Las propiedades como Window.Object devuelvenun objeto del tipo _ComObject, así que ¿cómo sepuede saber el tipo del espacio de nombres EnvDTEal que tenemos que convertirlas? La respuesta vie-ne de la mano de una función poco conocida:

dotN

etM

anía

<<

28

dnm.plataforma.net<<

Sub ObtieneListaTareas()

Dim objWindow As EnvDTE.WindowDim objTaskList As EnvDTE.TaskListDim objTaskItem As EnvDTE.TaskItem

objWindow = DTE.Windows.Item(EnvDTE.Constants.vsWindowKindTaskList)objTaskList = DirectCast(objWindow.Object, EnvDTE.TaskList)

For Each objTaskItem In objTaskList.TaskItemsDebug.WriteLine(objTaskItem.Description)

Next

End Sub

Fuente 2

También podemos crear solucionesmediante automatización, añadir proyec-tos a una solución y añadir archivos o

referencias a un proyecto

Page 29: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET ... · con VB.NET y C#. ¡Mi madre es un Singleton! 46-48 Siguiendo con el tema del último artículo, volvemos a tratar

Microsoft.VisualBasic.Information.TypeName(obje-

to). Para el caso de la macro anterior, nos habríadevuelto “TaskList”. Otros tipos comunes queencontraremos en la propiedad Window.Object son:

• EnvDTE.UIHierarchy. Permite navegar la jerarquíadel explorador de soluciones, del explorador deservidores y del explorador de macros, aunque node la vista de clases).

• EnvDTE.ToolBox. Para la ventana de la caja de herra-mientas)

• System.ComponentModel.Design.IDesignerHost.Para diseñadores de formularios.

• EnvDTE.TextWindow. Para ventanas de texto.• EnvDTE.HTMLWindow. Para diseñadores HTML.

Con esas clases podremos descubrir y manipularel contenido de sus respectivas ventanas.

DocumentosComo hemos visto hasta ahora, un ProjectItem es

un archivo en disco, y una ventana es un elemento dela interfaz de usuario que, en el caso de archivos, nospermite editar su contenido. Entre ambos existe unaentidad intermedia que es el documento. El documen-to proporciona un buffer editable que se mantiene enmemoria hasta que se cierra, permitiendo guardar loscambios en disco en cualquier momento. Para mane-jar documentos tenemos las clases EnvDTE.Document (paradocumentos en general) y EnvDTE.TextDocument (paradocumentos de texto). El IDE nos proporciona la lis-ta de documentos en la colección DTE.Documents, y eldocumento activo en la propiedad DTE.ActiveDocument.La relación de un documento con su ProjectItem es deuno a uno (propiedad Document.ProjectItem), pero undocumento puede estar abierto en varias ventanas, porejemplo, el documento Form1.vb puede tener abiertauna ventana de código y una ventana con el diseñadorde formularios. La propiedad Document.Windows nosdevuelve las ventanas de un documento y la propiedadDocument.ActiveWindow nos devuelve la ventana activadel documento. Para abrir un documento a partir deun ProjectItem se usa el método ProjectItem.Open, querecibe como parámetro el tipo de ventana que quere-

mos abrir (EnvDTE.Constants.vsViewKindDesigner,EnvDTE.Constants.vsViewKindCode, etc). Dicho métododevuelve un objeto DTE.Window, cuyo documento pode-mos obtener con la propiedad Window.Document. Se pue-den guardar los cambios de un documento con el méto-do Document.Save y se puede cerrar un documento conel método Document.Close, que nos permite indicar enun parámetro si hay que guardar los cambios o no.

Edición de textoPara los documentos que son de texto, la llamada

Document.Object("")o Document.Object("TextDocument")nos devuelve un objeto EnvDTE.TextDocument. Los méto-dos más importantes de esta clase están relacionados conlos objetos EnvDTE.TextPoint, EnvDTE.EditPoint yEnvDTE.TextSelection. Los dos primeros representanposiciones en el documento de texto, con propiedadescomo TextPoint.Line para obtener el número de línea yTextPoint.LineCharOffset para obtener la columna. Ladiferencia entre ambos es que el TextPoint no es edita-ble, mientras que el EditPoint sí lo es. Se puede obtenerun EditPoint a partir de un TextPointmediante el méto-do TextPoint.CreateEditPoint. La macro del fuente 3muestra cómo insertar un texto en la cabecera del docu-mento de texto activo.

El explorador de macros contiene un proyectode ejemplo con multitud de macros que nos servi-rán para conocer todo lo relativo a la edición decódigo fuente.

El modelo de códigoEl modelo de código de Visual Studio .NET permi-

te descubrir los elementos (clases, propiedades, proce-dimientos, parámetros, atributos, etc.) de nuestros archi-

dotN

etM

anía

<<

29

dnm.plataforma.net<<

Sub InsertarEncabezado()

Dim objTextDocument As EnvDTE.TextDocumentDim sTexto As String

If Not (DTE.ActiveDocument Is Nothing) ThenTryobjTextDocument = DTE.ActiveDocument.Object("TextDocument")

CatchEnd Try

If Not (objTextDocument Is Nothing) ThenobjTextDocument.StartPoint.CreateEditPoint.Insert("' Archivo " &_DTE.ActiveDocument.Name & Microsoft.VisualBasic.ControlChars.CrLf)

End IfEnd If

End Sub

Fuente 3

El modelo de código de Visual Studio.NET permite descubrir los elementos

de nuestros archivos de código

Page 30: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET ... · con VB.NET y C#. ¡Mi madre es un Singleton! 46-48 Siguiendo con el tema del último artículo, volvemos a tratar

vos de código. La clase central para estecometido es EnvDTE.CodeElement, cuyapropiedad CodeElement.Kind nos devuel-ve el tipo de elemento. A su vez, un obje-to de la clase EnvDTE.CodeElement se pue-de convertir a un tipo específico acordecon su tipo que proporciona funciones ymétodos que son sólo aplicables a ese tipode elemento de código (por ejemplo,EnvDTE.CodeNamespace, EnvDTE.CodeClass,etc). En C++ existen muchos tipos de ele-mentos (y de hecho C++ usa un modelode código distinto), pero en VB.NET yC# los elementos de código que tenemosse muestran en la tabla 1.

Hay que señalar que existe una claseEnvDTE.CodeType para manejar de formaunificada los elementos de código que sontipos (clases, estructuras, interfaces, dele-gados y enums).

Para navegar por los elementos decódigo de un archivo usaremos la propie-dad ProjectItem.FileCodeModel, y para unproyecto usaremos Project.CodeModel. Enambos casos el objeto devuelto tiene unapropiedad CodeElements que nos devuel-ve la colección de elementos raíz. Paraobtener los elementos de código hijos de

un CodeElement es necesario usar el tipopropio de cada elemento de código:CodeNamespace.Members, CodeClass.Members, etc. (curiosamente la propiedadCodeElement.Children que intuitivamen-te sería la que emplearíamos no funcio-naría, ya que sólo vale para C++). La macrodel fuente 4 recorre los elementos de códi-go del documento de código activo.

El modelo de código también permi-te generar código fuente, al menos en teo-

ría. Para ello, diver-sas clases disponende métodos quecomienzan con“Add”. Por ejemplo,tenemos FileCodeModel.AddNamespace,FileCodeModel.Add

Class, CodeClass.AddFunction, CodeFunction.AddParameter,etc. La mala noticiaes que muchos deestos métodos noestán implementa-dos para todos loslenguajes, de mane-ra que es posible que

un método funcione con C# pero no conVB.NET o viceversa. En cualquier casosiempre podemos construir por nosotrosmismos el párrafo de texto con el elementode código que queremos agregar y usar lafunción EditPoint.Insert como se expli-có en un apartado anterior.

Y con esto terminamos este artí-culo. Naturalmente se han quedadoalgunas cosas en el tintero, porque laextensibilidad de Visual Studio .NET

da para escribir libros enteros (o almenos unos cuantos capítulos), perose han tratado los aspectos funda-mentales. En un par de meses estarádisponible Visual Studio 2005, quepromete mejorar e introducir nove-dades en el modelo de extensibilidadpara hacernos la vida más fácil.

DocumentaciónLa documentación de referencia

imprescindible para entender el mode-lo de extensibilidad de Visual Studio.NET es la siguiente:[1] Manipulating the Development

Environment: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vsintro7/html/vxoriManipulatingDevelopmentEnvironment.asp

[2] Automation and ExtensibilityReference: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vsintro7/html/vxoriExtensibilityReference.asp

[3] Libro “Inside Microsoft Visual Studio.NET 2003”, de Craig Skibo y otros:http://www.microsoft.com/mspress/books/6425.asp

dotN

etM

anía

<<

30

dnm.plataforma.net<<

Elemento de código Propiedad Kind Tipo propioEspacio de nombres vsCMElementNamespace EnvDTE.CodeNamespace

Clase vsCMElementClass EnvDTE.CodeClass

Estructura vsCMElementStruct EnvDTE.CodeStruct

Enum vsCMElementEnum EnvDTE.CodeEnum

Interface vsCMElementInterface EnvDTE.CodeInterface

Delegado vsCMElementDelegate EnvDTE.CodeDelegate

Propiedad vsCMElementProperty EnvDTE.CodeProperty

Procedimiento vsCMElementFunction EnvDTE.CodeFunction

Variable vsCMElementVariable EnvDTE.CodeVariable

Parámetro vsCMElementParameter EnvDTE.CodeParameter

Atributo vsCMElementAttribute EnvDTE.CodeAttribute

Tabla 1

Sub MostrarElementosDeCodigo()Dim objProjectItem As ProjectItemIf Not (DTE.ActiveDocument Is Nothing) ThenobjProjectItem = DTE.ActiveDocument.ProjectItemIf Not (objProjectItem.FileCodeModel Is Nothing) ThenMostrarElementosDeCodigoRecursivo(objProjectItem.FileCodeModel.CodeElements, 0)

End IfEnd If

End Sub

Sub MostrarElementosDeCodigoRecursivo(ByVal colCodeElements As CodeElements, _ByVal iNivel As Integer)Dim objCodeElement As EnvDTE.CodeElementDim colMembers As EnvDTE.CodeElementsFor Each objCodeElement In colCodeElementsDebug.WriteLine(New String(" "c, iNivel * 3) & objCodeElement.Name)colMembers = ObtenerHijos(objCodeElement)If Not (colMembers Is Nothing) ThenMostrarElementosDeCodigoRecursivo(colMembers, iNivel + 1)

End IfNext

End Sub

Private Function ObtenerHijos(ByVal objCodeElement As CodeElement) As CodeElementsDim colCodeElements As CodeElementsIf TypeOf objCodeElement Is CodeNamespace ThencolCodeElements = DirectCast(objCodeElement, CodeNamespace).Members

ElseIf TypeOf objCodeElement Is CodeType ThencolCodeElements = DirectCast(objCodeElement, CodeType).Members

End IfReturn colCodeElements

End Function

Fuente 4

Page 31: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET ... · con VB.NET y C#. ¡Mi madre es un Singleton! 46-48 Siguiendo con el tema del último artículo, volvemos a tratar
Page 32: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET ... · con VB.NET y C#. ¡Mi madre es un Singleton! 46-48 Siguiendo con el tema del último artículo, volvemos a tratar

Las interfaces no las vamos a utilizar siempre des-de la perspectiva de ofrecer funcionalidades “compa-tibles” con las clases de .NET Framework, ni conotras de nuestra propia cosecha, al menos desde elpunto de vista de que al implementar alguna inter-faz, nuestra clase tenga la “funcionalidad” aportadapor dicha interfaz.

Por ejemplo, si necesitamos pasar parámetros a dis-tintos métodos, pero no sólo nos interesa indicar el con-tenido de unas cadenas o unos valores numéricos, sinoque también queremos pasar algo de “acción”, es decir,algún método que actúe sobre esos parámetros o sobrelos valores que internamente el método tenga que usar...,en estos casos también nos puede interesar utilizar lasinterfaces, ya que éstas nos proporcionan una forma deutilizar objetos anónimos (o previamente indefinidos),los cuales dejarán el anonimato en el momento que nues-tro código ejecute dicho método.

Aclaremos un poco todo esto para que nos enten-damos mejor:

Si tenemos un método declarado de esta forma:Para VB: Metodo(parámetro As Interfaz)Para C#: Metodo(Interfaz parámetro)Es obvio que parámetro es del tipo de una interfaz,

por tanto, el argumento real que pasaremos a este méto-do será de un objeto que implemente la interfaz indica-da en el tipo del parámetro. Esa interfaz tendrá ciertafuncionalidad y posiblemente algunas propiedades. Todoeso lo podemos usar en ese método sin importarnos quéobjeto es el que utilizamos a la hora de llamarlo, o paradecirlo de otra forma: sin importarnos de qué tipo es elobjeto pasado como argumento.

Si usamos las interfaces de esta forma, realmentelos tipos que la implementen no lo harán para tenerla funcionalidad de la interfaz, (aunque también), sinoporque así podrán usarse en otros contextos. En elfondo es lo mismo, aunque al usarlas de este modoampliamos la forma de aprovecharnos de las interfa-ces y de la filosofía de las mismas: proporcionar fun-cionalidad anónima y proveer de polimorfismo a nues-tras clases y estructuras.

Dos ejemplos de interfaces como pará-metros

A continuación veremos un par de ejemplos enlos que utilizaremos esta otra forma de darle utilidada las interfaces. El primer ejemplo ya lo vimos en elnº 7 de dotNetManía (pág. 24), en el que usábamosuna clase específica para clasificar tipos que no esta-ban “preparados” para ser clasificados, (no vamos aentrar en detalles sobre cómo hacer una clase quepueda ser clasificada, ya que de eso nos ocupamos enel citado número de dotNetManía.)

El caso era que teníamos una clase “normal” que noestaba preparada para ser clasificada por el propio .NET,es decir, no implementaba la interfaz IComparable. Peroqueríamos clasificar el contenido de una colección quecontenía objetos de ese tipo no clasificable. La soluciónfue usar una de las sobrecargas del método Sort, al quese le pasa como argumento una clase que implementeuna interfaz (IComparer). La clase pasada como argu-mento tiene que implementar dicha interfaz, y se encar-gará de clasificar (o comparar) dos elementos de un tipodeterminado.

Interfaces

En el artículo sobre las interfaces de dnm.inicio.fundamentos publicado en el nº 16 dedotNetManía,explicamos lo que son las interfaces y vimos algunos ejemplos de cómousarlas.En esta ocasión veremos más ejemplos,con idea de que nos quede claro cómoutilizar las interfaces en nuestros proyectos, aunque en esta ocasión vamos a usar lasinterfaces de una forma diferente a lo “habitual”, con la intención de que nos hagamosuna idea de lo útiles que pueden llegar a ser estos tipos de datos.

<<Usar las interfaces como parámetro de métodos

dnm.inicio.fundamentos

Guillermo “Guille” Som

dnm.incio.taller

Guillermo “Guille” Somes Microsoft MVP de Visual Basic

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

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

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

Page 33: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET ... · con VB.NET y C#. ¡Mi madre es un Singleton! 46-48 Siguiendo con el tema del último artículo, volvemos a tratar

Al estar declarado el parámetrocomo un tipo concreto de una interfaz,esa sobrecarga del método Sort se ase-gura de que el objeto usado como argu-mento tiene la funcionalidad que seespera, por tanto, será seguro usarlo, yse supone que hará el trabajo que debehacer.

En el fuente 1 tenemos el códigopara C#1 de la clase “intermedia” quepodemos usar para clasificar objetos deun tipo que no implementa la interfazIComparable. De esta clase sólo usare-mos la parte expuesta por la interfazIComparer, es decir, el método Compare;si esta clase tuviera más miembros, éstosse ignorarán, al menos al usar el objetocomo argumento del método Sort.

Pero no solo tenemos que usar inter-faces definidas en el propio .NETFramework, ya que las interfaces usadaspueden ser de cualquier tipo, lo impor-tante aquí es que el método al que quere-mos pasar un objeto acepte un tipo deinterfaz, y, como es lógico suponer, el obje-to pasado debe implementar esa interfaz.

El segundo ejemplo que usaremospara pasar interfaces a métodos, lo vamos

a basar en una interfaz que podemosimplementar en nuestros formularios. Larazón de hacer esto es porque algunasveces nos podemos encontrar con la situa-ción de que queremos dar cierta funcio-nalidad a nuestros formularios, pero pue-de que esa nueva funcionalidad sea dife-rente en cada uno de ellos.

Una de las formas de pro-porcionar ese nuevo funciona-miento es crear una clase basadaen la clase Windows.Forms.Form,(que es la clase base de cualquierformulario de .NET), y añadir-le la nueva funcionalidad con ele-mentos (miembros) virtuales(reemplazables). Después, sólotendríamos que crear nuevos for-mularios basados en esa clase yasí dispondríamos de todas lasnuevas características añadidasen nuestra clase base.

Pero es posible que la imple-mentación (el código a usar) deesa nueva funcionalidad sea dife-

rente dependiendo de lo que queramosque nuestro formulario haga, por tanto,no tiene mucho sentido escribir un códi-go que después lo vamos a reemplazar enla mayoría de las veces que usemos esa cla-se. En este tipo de situaciones es dondenos podemos beneficiar del uso de lasinterfaces, ya que una interfaz no tienecódigo ejecutable, solamente define losmiembros que tenemos que implemen-

tar, y cada implementación puede ser dife-rente unas de otras porque lo único impor-tante es que (en nuestro caso) el formula-rio implemente esos miembros y le de lafuncionalidad que creamos conveniente.

Por ejemplo, puede ser que queramoscrear un formulario para realizar búsque-das, y queremos que no dependa de nin-gún formulario en particular. Por tanto lopodemos usar con formularios que utili-

cen diferentes tipos de controles paraalmacenar la información en la que reali-zaremos la búsqueda. Para darle esa inde-pendencia al formulario que pedirá losdatos que queremos buscar, podemos uti-lizar una interfaz que defina los miembrosque cada formulario tendrá que imple-mentar, de forma que nuestro formulariode buscar utilice la parte del formularioque implementa la interfaz para llamar alos métodos.

Ni qué decir tiene que ese formula-rio de búsqueda no será el encargado debuscar nada, ya que no sabe dónde ten-drá que realizar dicha búsqueda, por tan-to serán los formularios que imple-menten la interfaz los que se encarguende todo el trabajo.

En la figura 1 tenemos el formula-rio buscar. En el control combo estaránlas últimas palabras usadas en las bús-quedas anteriores.

En el fuente 2 tenemos la definiciónde la interfaz IBuscar que además de unmétodo Buscar al que se le pasará comoargumento la palabra que hay que bus-car, también define dos métodos:

• LeerCfg devuelve un array con laspalabras usadas en búsquedasanteriores

• GuardarCfg tiene un parámetro enel que se indicará la palabra bus-cada en la última ocasión.

En el formulario buscar hemos defi-nido un método Show que se usará paramostrarlo y al que habrá que indicarleun objeto que implemente la interfazIBuscar.

Ese argumento se asignará a unavariable interna del tipo de la interfaz,con idea de usarla para llamar a losmétodos correspondientes del objetopasado. Lo primero que hacemos, des-pués de asignar el objeto recibido a lavariable interna, es llamar al método

dotN

etM

anía

<<

33

dnm.inicio.taller<<

NOTAComo ya sabemos las clases que imple-

mentan una interfaz solamente están obliga-das a definir los miembros de esa interfaz, perono hay nada que nos obligue a escribir códi-go dentro de esos miembros. Por supuesto,implementar una interfaz para después no dar-le “funcionalidad” no tiene mucho sentido,pero es conveniente saber que el compiladorno chequeará que esos miembros realmentehagan algo.

][

Fuente 1. Código de la clase que implementa la interfaz IComparer

public class ColegaComparer : IComparer{

public int Compare(object x, object y){

Colega c1 = ((Colega)x);Colega c2 = ((Colega)y);return string.Compare(c1.Apellidos, c2.Apellidos);

}}

1 En el texto sólo aparecen los fuentes en C# pero puede descargarse también los de VB.NET desde nuestra Web www.dotnetmania.com

Figura 1. El formulario buscar en tiempode diseño.

Page 34: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET ... · con VB.NET y C#. ¡Mi madre es un Singleton! 46-48 Siguiendo con el tema del último artículo, volvemos a tratar

LeerCfg para asignar al combo las pala-bras usadas con anterioridad.

Cuando el usuario pulsa en el botón“Aceptar”, se llama al método Buscar dela interfaz, y si devuelve un valor ver-dadero querrá decir que el texto indi-cado ha sido hallado, por tanto llama-mos al método GuardarCfg para que elformulario sepa que esa es la palabra quedebe añadir a su lista de palabras inter-nas. En caso de que devuelva un valorfalso, se sigue mostrando el formulariode búsqueda hasta que se encuentre algoo se cancele.

Tal como comentamos en la nota,no tenemos por qué implementar códi-

go en los métodos defi-nidos por la interfaz, y talcomo veremos en elcódigo implementado enel formulario que usaIBuscar, no se hace nadaen el método GuardarCfg,pero como las interfaces“obligan” a que tenga-mos que implementar

todos los miembros definidos en ellas,estaremos obligados a crear al menos elcuerpo del método para que nuestrocódigo compile.

La aplicación de ejemplo utiliza dosformularios que implementan la interfazIBuscar: en uno de ellos se utiliza un con-trol RichTextBox y en el otro un controlTextBox. Para buscar en el primero utili-zamos el método Find, mientras que en elsegundo llamamos al método IndexOf dela propiedad Textde la caja de textos. Estosimplemente es para que veamos que real-mente al código del formulario buscar leda igual qué tipo de control será el que seuse para hacer la búsqueda, ya que será el

propio formulario el que se encargará dehacer esa búsqueda.

En el fuente 3 tenemos las imple-mentaciones de los tres métodos de lainterfaz IBuscar, además del método quemuestra el formulario de búsqueda, alque hay que indicarle como argumentola instancia actual del formulario, aun-que ese objeto se “filtrará” para dejarpasar sólo la parte del mismo que imple-menta la interfaz.

Esperamos que con lo aquí mostra-do tengamos otra visión de cómo usarlas interfaces, pero esto no lo es todo,en otra ocasión veremos cómo las inter-faces tienen un papel muy importantecuando queremos usar ensamblados de.NET desde aplicaciones COM, porejemplo desde Visual Basic 6, en las quequeremos mantener la compatibilidadbinaria para no forzar a recompilar losejecutables cuando añadimos nuevoselementos a ese ensamblado, pero eso,será en otra ocasión, cuando veamos eltema de la interoperabilidad.

¡Nos vemos!

dotN

etM

anía

<<

34

dnm.inicio.taller<<

Fuente 2. Código de la interfaz y el formulario buscar

// Interfaz para proporcionar métodos para buscarpublic interface IBuscar{

string[] LeerCfg();void GuardarCfg( string palabra);bool Buscar( string texto);

}

// El formulario de buscarprivate IBuscar elForm;public void Show(IBuscar formulario) {

elForm = formulario;// leemos los datos de la configuraciónstring[] lista = elForm.LeerCfg();cboBuscar.Items.Clear();if( lista == null )

cboBuscar.Text = "";else{

foreach( string s in lista)cboBuscar.Items.Add(s);

cboBuscar.SelectedIndex = 0;}//this.Show();

}

private void btnAceptar_Click(object sender, EventArgs e) {

// Llamamos al formulario para que busque el texto// y si lo encuentra cerramos este formm en caso // contrario damos la oportunidad de buscar otra cosaif( elForm.Buscar(cboBuscar.Text) ){

// Llamamos al método guardarCfg// por si quiere guardar la palabra buscadaelForm.GuardarCfg(cboBuscar.Text);Hide();

}else

cboBuscar.Focus();}

private void btnCancelar_Click(object sender, EventArgs e){

Hide();}

Fuente 3. Código del formulario que implementa la interfaz.

public class Form1 : System.Windows.Forms.Form, IBuscar{

public bool Buscar(string texto){

// Realizar una búsqueda en el contenido del textbox// Devolverá True si ha encontrado lo buscado,// y se encargará de resaltar el texto, etc.int pos = RichTextBox1.Find(texto);if( pos > -1 )

RichTextBox1.Select(pos, texto.Length);return pos > -1;

}

public void GuardarCfg(string palabra) {

// El código para guardar la configuración en este formulario// El parámetro será la palabra que se ha indicado en buscar// Tendremos que decidir si la guardamos o que...

}

public String[] LeerCfg() {

// El código para leer la configuración en este formulario// y devolverla como un array de tipo Stringreturn new String[] {"Porque", "no engraso", "los ejes",

"me llaman", "abandonao", "gustan", "suenen"};}

private void btnBuscar_Click(object sender, EventArgs e) {

// Mostrar el formulario de búsquedaFormBuscar fBuscar = new FormBuscar();fBuscar.Show(this);

}

Page 35: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET ... · con VB.NET y C#. ¡Mi madre es un Singleton! 46-48 Siguiendo con el tema del último artículo, volvemos a tratar

En este artículo, tal y como apunta su título, nosceñiremos al modo en cómo podemos ordenar losdatos mostrados por un informe, describiendo lastécnicas que a nuestro alcance pone Reporting Servicespara la consecución de dicho fin.

Por tal motivo, se asume que el lector conoce losaspectos elementales en el proceso de creación de uninforme básico, a efectos de poder entrar directa-mente en la descripción de los procedimientos nece-sarios para ordenar un listado.

Respecto a los informes de ejemplo que utilizare-mos, todos se encontrarán situados dentro de un pro-yecto de informes de Visual Studio .NET, y tomaráncomo origen de datos la tabla Customers de la base dedatos Northwind de SQL Server. Igualmente, todosvisualizarán los datos en una región de datos de tipotabla de Reporting Services. Estos ejemplos se encuen-tran disponibles para su descarga como material deapoyo en la dirección www.dotnetmania.com.

Y ya, sin más dilación, comencemos nuestra anda-dura por el universo de los informes ordenados.

Aplicando un orden simpleEl modo más básico de ordenar los datos de un

informe consiste en establecer el criterio de ordena-ción de forma fija en la región de datos utilizada paravisualizar la información.

Como ejemplo de este tipo de caso crearemos un

informe con el nombre rptOrdenBasico; una vez cre-ado su origen de datos y añadidos los campos a mos-trar en la tabla del diseñador, daremos los siguientespasos para crear un orden por el campo Country:

En primer lugar, situados en la pestaña “Diseño”del informe seleccionaremos la región de datos tabla,y a continuación haremos clic derecho en el indica-dor de tabla, que es el recuadro situado en su esqui-na superior izquierda, como muestra la figura 1.

Al aparecer el menú contextual elegiremos la

opción “Propiedades”, que abrirá un cuadro de diá-logo en el que nos situaremos en la pestaña“Ordenación”. En la columna “Expresión” seleccio-naremos de la lista desplegable el campo Country, enla columna “Dirección” dejaremos el valor por defec-to, Ascending, como vemos en la figura 2.

Pulsaremos el botón “Aceptar” y pasaremos a la pes-taña “Vista previa del informe” para ver el resultado enejecución, comprobando que los registros se ordenanpor el campo anteriormente establecido.

Como habrá observado, podemos construir nues-tro orden para el informe basado en varios campos;

dotN

etM

anía

<<

35

Ordenación de datos en Reporting Services

Uno de los aspectos principales en cualquier generador de informes radica en lacapacidad de ordenar los datos visualizados al usuario del modo más versátil posi-ble.Reporting Services es una herramienta que nos ayuda enormemente en nuestrotrabajo como diseñadores de informes, gracias a la extensa oferta de elementosque nos ofrece para la creación de informes en general, y la aplicación de ordena-miento a los datos mostrados en particular.

<<

Luis Miguel Blanco

dnm.servidores.sql

Luis Miguel Blancoes redactor de dotNetManía. Es

consultor en Alhambra-Eidos.Haescrito varios libros y decenas de

artículos sobre la plataforma.NET (lalibreriadigital.com)

Algunas consideraciones iniciales

Figura 1

Page 36: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET ... · con VB.NET y C#. ¡Mi madre es un Singleton! 46-48 Siguiendo con el tema del último artículo, volvemos a tratar

dotN

etM

anía

<<

36

dnm.servidores.sql<<

tan sólo hemos de ir agregándolos en laforma que acabamos de explicar, y esta-blecer su prioridad utilizando los boto-nes de flecha arriba/abajo suministra-dos a tal efecto en esta ventana. La figu-ra 3 muestra este informe en ejecucióncon un orden basado en los camposCountry y City.

Establecimiento del orden entiempo de ejecución

Puede ser puntualmente interesan-te establecer el orden de un informe deforma fija e inamovible en un campo,pero la práctica nos dice en la mayoríade las ocasiones que el mejor diseño eneste sentido es aquel que permite alusuario realizar la selección de aquelloscampos por los que necesita ordenar ellistado.

Para solventar este tipo de situacio-nes, Reporting Services pone a nuestradisposición los denominados parámetros

de informe. Gracias a un parámetro ten-dremos la capacidad de asignar el campode ordenación al ejecutar el informe, evi-tando la rigidez que supone crear un ordenen diseño que no podemos alterar, comoocurría en el caso anterior.

Ilustraremos este escenario de tra-bajo creando un nuevo informe con elnombre rptOrdenParametro, en el queincluiremos un parámetro asociado alorden de su región de datos, que nospermita seleccionar qué campo quere-mos utilizar para ordenar.

Crear un parámetro es una labor muysencilla; una vez que nos situemos en lapestaña “Diseño del informe”, seleccio-naremos la opción de menú “Informe” +“Parámetros del informe”, que abrirá elcuadro de diálogo para el mantenimien-to de parámetros. Pulsando el botón“Agregar”, crearemos un parámetro conel nombre parCamposOrdenar, de tipoString, como muestra la figura 4.

Tras asignar los valores de configu-ración necesarios en este cuadro de diá-logo y pulsar el botón “Aceptar”, elparámetro será creado, por lo que nues-tro siguiente paso consistirá en asociar-lo con la expresión de orden del infor-me. Para ello, abriremos la ventana depropiedades de la tabla, y en la pestaña“Ordenación” escribiremos la expresiónde forma que la colección Fields delinforme utilice el parámetro en lugar deun campo fijo, como puede ver en lafigura 5.

Al ejecutar este informe desde la pes-taña “Vista previa” no se mostraráninmediatamente los datos como sucedíaen el pasado ejemplo, ya que el motorde Reporting Services no sabe a prioriel campo por el que queremos ordenar.En esta ocasión aparecerá en la barra deherramientas del informe una caja detexto perteneciente al parámetro crea-do, en la que teclearemos el nombre delcampo de orden y pulsaremos el botón“Ver informe” para ejecutar el listado,como vemos en la figura 6.

Téngase en cuenta que utilizandoesta técnica se distinguen mayúsculas yminúsculas, por lo que al escribir elnombre del campo en el parámetrodebemos hacerlo exactamente igual queaparece en la base de datos, o se produ-cirá un error.

Empleando una consulta diná-mica

Nuestra siguiente forma de ordena-ción consiste en el uso de una consultadinámica de Reporting Services; carac-terística que nos permite modificar entiempo de ejecución la consulta SQLincluida en el informe, encargada deextraer los datos a visualizar.

Una consulta dinámica se destacaporque dispone de una parte variableque está representada por un paráme-tro al que, como ya hemos visto, pode-mos asignar valor en tiempo de ejecu-ción, siendo lo que dota a este tipo deconsultas de su verdadera potencia.

Como ejemplo de este tipo deordenación crearemos el informerptOrdenConsultaDinamica, que ini-cialmente elaboraremos de igualmodo que los ejemplos anteriores enlo que respecta a su conjunto de datosy diseño.

Al crear el parámetro para esteinforme lo definiremos como una lis-

Figura 2

Figura 3

Figura 4

Figura 5

Figura 6

Page 37: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET ... · con VB.NET y C#. ¡Mi madre es un Singleton! 46-48 Siguiendo con el tema del último artículo, volvemos a tratar

ta de valores, en la que asignaremosuna etiqueta identificativa y el nom-bre del campo de orden para cada ele-mento de la lista. La ventaja de crearel parámetro de esta forma radica enque facilitamos al usuario la seleccióndel campo de orden, evitamos poten-ciales errores por una incorrecta escri-tura del nombre del campo, y sólo per-mitimos que la ordenación se haga porlos campos que realmente nos intere-sa exponer. Adicionalmente, y paraque al comenzar a ejecutar el informe,este no aparezca vacío, introducire-mos también como valor predetermi-nado uno de los nombres de campo.Véase la figura 7.

Seguidamente volveremos a la pes-taña “Datos” del informe y cambiare-mos la consulta SQL para convertirla adinámica, lo cual conseguimos ence-rrando entre comillas la parte fija de laconsulta, concatenándola a continua-ción al parámetro del informe. Comoresultado obtenemos una expresión eva-luable por el motor de informes. Ver elsiguiente código fuente:

="SELECT * FROM CUSTOMERS ORDER BY " &

Parameters!parCamposOrdenar.Value

Es importante hacer notar en estepunto, que para que una consulta diná-mica se ejecute adecuadamente, debe-mos eliminar todos los retornos de carroque pudieran existir. En nuestro ejem-plo no se da tal circunstancia, pero tén-gase en cuenta para el caso de consultasSQL con mucho código.

Completados todos los pasos de cre-ación de este informe, al ser ejecutado

desde la vista previa nos ofrecerá el pará-metro como una lista desplegable, de laque seleccionaremos el campo paraordenar los datos. Ver la figura 8.

Cuando diseñemos un informe quevaya a necesitar una consulta dinámica,recuerde que es recomendable comen-zar el diseño del modo habitual, utili-zando una consulta normal que devuel-va los campos que vayamos a visualizar.Una vez que hayamos depositado dichoscampos en el diseñador del informe, vol-veremos a la pestaña “Datos” y conver-tiremos la consulta en dinámica. Siempezamos la creación del informedirectamente con una consulta dinámi-ca, no se generarán automáticamentelos campos que necesitemos emplear enla zona de diseño, y tendremos que cre-arlos manualmente.

Ataque directo al código RDLTodo el proceso de creación de un

informe a través del diseñador tienecomo resultado la producción de unarchivo con la extensión .RDL (ReportLanguage Definition), que como supropio nombre indica, consiste en unlenguaje de definición basado enXML, que se utiliza en ReportingServices para escribir el código de losinformes.

Cuando estamos situados en el dise-ñador de informes, podemos visualizarel código RDL del mismo, para elloseleccionaremos la opción de menú deVisual Studio .NET “Ver” + “Código”.Adicionalmente, si el informe tiene susdatos ordenados, existirá un nodo conel nombre “Sorting”, que incluirá el sub-nodo “SortBy”, el cual, a su vez, con-tendrá los subnodos “SortExpression”y “Direction”, que son los que definenrespectivamente el campo y direcciónde ordenación para el informe, comovemos en la figura 9.

La generación de código RDL delinforme es un aspecto del que no tenemosque preocuparnos, ya que es el diseñadorde informes el que se encarga de esta tarea,sin embargo, vamos a plantear a conti-nuación un escenario de trabajo un tantoparticular.

Supongamos que hemos creado uninforme con el nombre rptOrdenExterno,ordenado de forma fija por el campoCountry, lo que hace que no podemoscambiar su orden mediante parámetros;pero tenemos la necesidad puntual decambiar dicha ordenación a otro campodistinto desde una aplicación externa queacceda al servidor de informes y haga estaoperación.

Para lograr este propósito tenemosque comunicarnos con el servicio Web delservidor de informes, y a través del mis-mo acceder a nuestro informe, para podermanipularlo por código. A continuacióndescribimos los pasos requeridos para lle-var esta operación a cabo.

En primer lugar crearemos un nuevoproyecto de tipo aplicación Windows (oASP.NET según se prefiera) con el nom-bre CambiarOrdenInforme, y seleccionare-mos la opción de menú “Proyecto” +“Agregar referencia Web”, que mostraráel cuadro de diálogo para la búsqueda deservicios Web. Haciendo clic en el enla-ce “Servicios Web del equipo local”, serealizará un rastreo de los instalados ennuestra máquina, localizando el corres-pondiente al servidor de informes: ReportService, como vemos en la figura 10.

dotN

etM

anía

<<

37

dnm.servidores.sql<<

Figura 7

Figura 8

Figura 9

Figura 10

Page 38: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET ... · con VB.NET y C#. ¡Mi madre es un Singleton! 46-48 Siguiendo con el tema del último artículo, volvemos a tratar

Tras hacer clic sobre el nombre de este servicio Webpulsaremos el botón “Agregar referencia”, lo que esta-blecerá el enlace entre nuestro proyecto y dicho servi-cio, para así poder manipular los informes publicadosen el servidor de informes a través de los métodos pro-porcionados por este servicio. Ver la figura 11.

Segu ida-mente añadire-mos al formula-rio de la aplica-ción un ComboBox, que relle-naremos conlos nombres delos campos sobre los que or-denaremos, yun Button, que

al ser pulsado, ejecutará el código encargado de modi-ficar el orden de los datos del informe.

Como paso final delproceso, en el eventoClick del botón escribi-remos el código del fuen-te 1, en el cual, tras ins-tanciar un objeto corres-pondiente al servicio Webe identificarnos como un

usuario válido, obtendremos la definición del infor-me. Posteriormente, gracias a las clases del espa-cio de nombres System.Xml, cargaremos la defini-ción del informe en un documento XML y obten-dremos el valor del nodo que contiene la expre-sión de ordenación, modificándola por el campoque hemos seleccionado en el formulario.Finalmente, pasaremos el documento XML delinforme a un stream en memoria, y éste a un arrayde bytes que grabaremos como nueva definicióndel informe. En el fuente 1 se muestran las accio-nes que acabamos de describir.

Una vez modificado el orden del informe deesta manera, podemos abrir una ventana del nave-gador Web e introducir la dirección http://local-host/ReportServer?/InformesOrdenados/rptOrdenExterno, para comprobar que efectivamente, losdatos se ordenan ahora en base al nuevo campoelegido.

Informe de conclusionesA lo largo de este artículo hemos introducido al

lector en las capacidades de ordenación de datos bási-ca y avanzada con Reporting Services, una de lasmuchas características de esta interesante herramientade generación de informes. Esperamos que todo loaquí comentado le sea de utilidad en la creación desus propios listados.

dotN

etM

anía

<<

38

dnm.servidores.sql<<

Figura 11

Figura 12

Imports CambiarOrdenInforme.localhostImports System.XmlImports System.TextImports System.NetImports System.IO'....Private Sub btnCambiarOrden_Click ByVal sender As System.Object, _

ByVal e As System.EventArgs) _Handles btnCambiarOrden.Click

Dim oRS As ReportingServiceDim sInforme As StringDim aBytDefInforme() As ByteDim sCodInforme As StringDim oXMLInforme As XmlDocumentDim oNodoOrden As XmlNodeDim msInforme As MemoryStreamDim aBytNuevoInforme() As ByteDim aAvisos() As Warning

' instanciar un objeto del servicio web' del servidor de informesoRS = New ReportingService

' asignar credenciales de identificaciónoRS.Credentials = CredentialCache.DefaultCredentials

' informe a manipular incluyendo rutasInforme = "/InformesOrdenados/rptOrdenExterno"

' obtener el contenido del informe en formato binarioaBytDefInforme = oRS.GetReportDefinition(sInforme)

' convertir el contenido del informe a textosCodInforme = Encoding.Default.GetString(aBytDefInforme)

' crear un documento xml y cargar dentro el texto del informeoXMLInforme = New XmlDocumentoXMLInforme.LoadXml(sCodInforme)

' localizar el elemento que contiene el campo de orden' y cambiarlo por el valor del ComboBoxoNodoOrden = oXMLInforme.GetElementsByTagName("SortExpression")(0)oNodoOrden.InnerText = "=Fields!" & Me.cboCampos.Text & ".Value"

' pasar el informe a un streammsInforme = New MemoryStreamoXMLInforme.Save(msInforme)

' posicionar el stream saltando' los códigos de controlmsInforme.Position = 3

' pasar el stream a un array de bytesaBytNuevoInforme = New Byte(msInforme.Length - 4) {}msInforme.Read(aBytNuevoInforme, 0, aBytNuevoInforme.Length)

' grabar el array de bytes que contiene' el informe modificado en el servidor de informesaAvisos = oRS.SetReportDefinition(sInforme, aBytNuevoInforme)

' si hay problemas al actualizar' se muestran con el array de objetos WarningIf Not (aAvisos Is Nothing) Then

For Each oAviso As Warning In aAvisosMessageBox.Show(oAviso.Message)

NextElse

MessageBox.Show("Establecido nuevo orden de datos en el informe")End If

End Sub

Fuente 1

Page 39: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET ... · con VB.NET y C#. ¡Mi madre es un Singleton! 46-48 Siguiendo con el tema del último artículo, volvemos a tratar

dotN

etM

anía

<<

39

Atención MySQL,aquí dotNet,¿me recibe?

MySQL es el gestor de bases de datos open source líder en la actualidad.Independientemente de la plataforma donde se esté ejecutando este, podemosconectarlo con nuestras aplicaciones .NET usando algunas de las API de comunica-ción entre MySQL y aplicaciones Microsoft .NET existentes. En este artículo des-cribiremos de forma sencilla cómo realizar esta tarea con VB.NET y C#.

<< informática, nos encontramos muchasveces con situaciones curiosas a la hora de abordarun determinado proyecto. De todos es sabido la pro-liferación y moda por los entornos y productos opensource. Menos extendido en el conocimiento de todosson las diferencias existentes entre los productos depago y los productos gratuitos, y por ello, en muchasocasiones, nuestras decisiones están enfocadas y orien-tadas únicamente en el coste de los productos sinatender a otras características no menos importan-tes. Pero no deseo tratar ese tema de debate en esteartículo, tan sólo mentarlo para que quien lo consi-dere oportuno, recapacite sobre ello.

Lo que no es menos cierto también en todo esto, esque dependiendo del tipo de cliente o del tipo de desa-rrollo a llevar a cabo, algunas veces es mucho más ren-table acudir a entornos o productos de tipo open source.Ni todo tiene por qué ser de pago, ni todo tiene por quéser open source; la virtud, en este caso, está en el caminomedio de ambos puntos distantes, y por supuesto, alcan-zarla y saber cuándo y cómo usar estas tecnologías enel momento preciso, es una tarea compleja.

En el mundo de las bases de datos, está claro quelos productos estrella implantados en las grandesempresas de todo el mundo son Oracle y MicrosoftSQL Server (por algo será), pero no es menos cier-to, que según el volumen o tamaño de una empresa,a veces estos robustos entornos de gestión de basesde datos no son muy bien vistos debido a su elevadocoste (otra vez sale el tema dinero a la palestra de latoma de decisiones).

Aún así, Microsoft dispone también de un entornode nombre MSDE 2000, que no es otra cosa que una

versión reducida y gratuita de Microsoft SQL Server2000. En el año 2005, aparecerá su sustituto, de nom-bre Microsoft SQL Server 2005 Express (futuro MSDE2005 para entendernos aunque el nombre de MSDE seperderá para siempre). Pero una vez más y en numero-sas ocasiones, se dejan ver los defensores de otros entor-nos o productos que no tengan el signo o marcaMicrosoft por detrás –como si la marca Microsoft die-ra alergia– y por eso entre algunos de ellos, tenemosMySQL, el gestor de bases de datos open source líder enese tipo de distribuciones. Una alternativa sin duda, muya tener en cuenta también.

Conociendo MySQLBasado en los términos GNU

(General Public License), este pro-ducto es distribuido por MySQL AB, empresa comer-cial creada por los fundadores de MySQL, como soft-ware open source. MySQL tiene un logotipo muy curio-so que es un delfín y cuyo nombre corresponde conSakila, nombre que fue seleccionado por los fundado-res de MySQL AB entre una amplia variedad de nom-bres sugeridos en Internet por otros informáticos.

MySQL es un sistema gestor de bases de datosrelacional, que cumple los estándares SQL y entrecuyas características encontramos que es un produc-to multihilo, capaz de soportar múltiples usuariosconcurrentes. Ha sido escrito en C y C++ y está dis-ponible para un amplio rango de sistemas operativosdiferentes.

Adicionalmente a esto, desarrollos independientesatesoran el crecimiento de MySQL y proporcionan

Jorge Serrano

dnm.servidores.sql

En el mundo de la

Jorge Serranoes redactor de dotNetManía. EsIngeniero Informático y MVP deVB y de .NET. Es Webmaster de

PortalVB.com y autor dediferentes libros y artículos

técnicos. Jorge está entre losmejores profesores y

conferenciantes sobre latecnología .NET de nuestro país.

Page 40: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET ... · con VB.NET y C#. ¡Mi madre es un Singleton! 46-48 Siguiendo con el tema del último artículo, volvemos a tratar

herramientas de muy diversa naturalezaque nos facilitarán las tareas de manteni-miento, gestión y administración de nues-tras bases de datos.

Respecto a su escalabilidad, debemostomar como referencias, las dadas por losusuarios de MySQL. Así, encontramosdatos que indican que MySQL puedesoportar cerca de 50 millones de registros,60.000 tablas ó 5.000 millones de filas. Sinembargo, no queda claro el funciona-miento del sistema en cuanto a rendi-miento cuando se manejan grandes can-tidades de datos, tablas o filas.

Acerca de las plataformas donde sealoja MySQL, cabe destacar que usarla enotras plataformas que no sean MicrosoftWindows es una elección muy generalis-ta. Sin embargo, lo que sí está claro, esque tengamos donde tengamos alojadonuestro servidor MySQL, en muchas oca-siones podemos tener la necesidad deconectar una aplicación .NET con estemotor de bases de datos, y esto es justa-mente lo que veremos en este artículo.

Sé quien soy y adónde quieroir,pero ¿cuál es el camino?

Está claro que siempre que queremoscomunicar un origen con un destino,necesitaremos un canal que nos permitaesa comunicación. Por supuesto que sabe-mos quienes somos, ¿una aplicación.NET ejecutándose en un sistemaWindows por ejemplo?. También seadónde quiero ir, ¿a encontrarme conMySQL que está instalado en un sitiolocalizado? Pero lo que a lo mejor no ten-go claro del todo, es qué ruta tomar o quérutas o alternativas tengo para llegar a midestino sano y salvo. Sin duda necesitaréun camino, un driver o API que comuni-que ese origen con ese destino.

Por suerte, para llevar a cabo estecometido, existen en Internet diferen-tes fórmulas o caminos que nos permi-

tirán comunicar nuestras aplicaciones.NET con MySQL. A continuaciónveremos algunos de ellos, gratuitos, defácil acceso y uso.

En mi caso y para usar MySQL en misaplicaciones .NET, he usado la versiónMySQL 4.1.7. En el lado de .NET esindependiente el tipo de aplicación o ellenguaje a utilizar. En mi caso he utiliza-do como lenguajes de desarrollo, tantoVB.NET como C#, y aplicacionesWindows como tipo de proyecto. Loestrictamente importante en sí, es la APIo driver, el cuál establecerá la comunica-ción entre nuestras aplicaciones y MySQLcomo veremos a continuación.

Estableciendo nuestra vía decomunicación

Tenemos dos tipos de API de comu-nicación entre MySQL y aplicacionesMicrosoft .NET que podemos establecercomo diferentes: las API gratuitas y lasAPI de pago. Entre las gratuitas, me gus-taría destacar las que detalla la página ofi-cial de MySQL y en las cuales me he basa-do para escribir este artículo. Estas sondos API declaradas como oficiales, y unatercera API declarada como API de cola-boración, cuya responsabilidad recaecuriosamente sobre un desarrollador espa-ñol independiente. Estas API son las quese detallan a continuación:

En este artículo utilizare-mos estas tres API, observandocomo particularidad, que la APIde colaboración MySQLDriverCS,es un driver escrito enteramen-te en C#. Se trata en este últi-mo caso, de una contribuciónopen source que puede ser con-sultada en la página Web indi-cada en la tabla anterior.

Para llevar a cabo nuestro propósi-to, descargaremos por lo tanto cada unade las API comentadas, y las instalare-mos en nuestro sistema. De este modo,tendremos nuestro sistema preparado,para utilizar cualquiera de las API quehemos seleccionado como óptimas.

Usando MySQL ODBC 3.5.1

MySQL ODBC 3.5.1 utiliza ODBCcomo medio de comunicación, por loque si dispone de Microsoft VisualStudio .NET 2002, deberá instalar losdrivers de ODBC .NET Data Providerpara poder acceder a MySQL adecua-

damente o a cualquier otrabase de datos a través deODBC. En el caso de quedisponga de MicrosoftVisual Studio .NET 2003,ODBC .NET Data Providerviene incorporado con.NET.

Una vez instaladoODBC .NET Data Providery MySQL ODBC 3.5.1 ennuestro sistema, estaremospreparados para crear un

dotN

etM

anía

<<

40

dnm.servidores.sql<<

Más información

Se puede recabar más informa-ción en el sitio web oficial deMySQL: http://www.mysql.com ][

Figura 1. El driver apropiado, nos permitirá estableceren canal de comunicación entre MySQL y nuestras

aplicaciones .NET

API de comunicación entre MySQL y aplicacionesMicrosoft .NET

API oficiales

Connector/ODBC - MySQL ODBC driver v.3.5.1http://dev.mysql.com/downloads/connector/odbc/3.51.html

MySQL Connector/Net 1.0.1http://dev.mysql.com/downloads/connector/net/1.0.html

API de colaboración

MySQLDriverCS v.3.0.16bhttp://sourceforge.net/projects/mysqldrivercs

NOTA

Existen otras API de pago yposiblemente gratuitas en Internet.En este artículo, me he ceñido úni-camente al uso de las API marca-das como a tener en consideraciónpor MySQL.com. Advierta además,que las versiones de las API pue-den variar cuando las quiera des-cargar, ya que la mayoría de ellas,corresponden a proyectos en cons-tante evolución

][

Page 41: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET ... · con VB.NET y C#. ¡Mi madre es un Singleton! 46-48 Siguiendo con el tema del último artículo, volvemos a tratar

nuevo origen de datos ODBC como semuestra en las figuras 2 y 3.

Una vez que estemos ya listos parainiciar nuestra andadura haciaMySQL, iniciaremos un nuevo pro-yecto en Microsoft Visual Studio.NET. En mi caso y como ya hecomentado anteriormente, todos losproyectos de este artículo, están basa-dos en proyectos Windows, si bien, el

cambio que existe con la inmensamayoría de proyectos restantes es des-preciable.

Lo importante es importar el espa-cio de nombres System.Data.Odbc parapoder trabajar con ella. En el formula-rio Windows, hemos añadido un con-trol DataGrid y un control Button. Elcódigo de nuestra aplicación de ejem-plo para VB.NET y C# es el que sedetalla en el fuente 1.

Nuestra aplicación en ejecución esla que se muestra en la figura 4.

Usando MySQL Connector1.0.1

Una vez instalado MySQL Connector1.0.1, observamos que esta API contiene

dotN

etM

anía

<<

41

dnm.servidores.sql<<

Más información

ODBC .NET Data Provider loencontrará en la dirección web deMicrosoft: http://www.microsoft.com/downloads/release.asp?ReleaseID=35715

][

Figura 2.Antes de conectar con MySQLa través de ODBC,deberemos crear un

nuevo origen de datos con el driverMySQL instalado en nuestro sistema

Figura 3. Indicaremos los parámetros deconexión con la base de datos para

establecer el canal que usaremos paracomunicarnos con MySQL.Con el

botón “Test”, podremos probar si laconexión está correctamente

configurada

Imports System.Data.Odbc[...]Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)_

Handles Button1.Click' Declaramos las variables de ConexiónDim objConexion As OdbcConnectionDim objDataAdapter As OdbcDataAdapterDim objDS As New DataSet' Establecemos la conexión con el DSN declaradoobjConexion = New OdbcConnection("DSN=PruebaMySQL")' Asignamos al adaptador la instrucción SQL junto a la conexión a utilizarobjDataAdapter = New OdbcDataAdapter("SELECT Nombre, Apellidos FROM tabla", objConexion)' Volcamos los datos a un DataSetobjDataAdapter.Fill(objDS, "ConectMySQL")' Volcamos su contenido al control DataGridDataGrid1.DataSource = objDS.Tables("ConectMySQL")' Cerramos la conexión porque no la vamos a utilizar másobjConexion.Close()' Expandimos el control DataGrid para mostrar sus datosDataGrid1.Expand(0)

End Sub

Fuente 1 (VB)

using System.Data.Odbc;[...]private void button1_Click(object sender, System.EventArgs e){

// Declaramos las variables de ConexiónOdbcConnection objConexion;OdbcDataAdapter objDataAdapter;DataSet objDS = new DataSet();// Establecemos la conexión con el DSN declaradoobjConexion = new OdbcConnection("DSN=PruebaMySQL");// Asignamos al adaptador la instrucción SQL junto a la conexión a utilizarobjDataAdapter = new OdbcDataAdapter("SELECT Nombre, Apellidos FROM tabla", objConexion);// Volcamos los datos a un DataSetobjDataAdapter.Fill(objDS, "ConectMySQL");// Volcamos su contenido al control DataGriddataGrid1.DataSource = objDS.Tables["ConectMySQL"];// Cerramos la conexión porque no la vamos a utilizar másobjConexion.Close();// Expandimos el control DataGrid para mostrar sus datosdataGrid1.Expand(0);

}

Fuente 1 (C#)

Figura 4.Nuestraaplicación en

ejecuciónconectándose a

través de ODBCcon MySQL

Page 42: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET ... · con VB.NET y C#. ¡Mi madre es un Singleton! 46-48 Siguiendo con el tema del último artículo, volvemos a tratar

tres componentes preparados para accedera fuentes de datos MySQL de forma direc-ta, tal y como se muestra en la figura 5.

Estos componentes, están prepara-dos para ser utilizados en Microsoft.NET Framework 1.0 y Microsoft.NET Framework 1.1. De hecho, haydos grupos de componentes que podre-mos utilizar en ambos entornos.

Nosotros, sin embargo, accederemosa MySQL en este artículo, a través decódigo directamente, por lo que iremos ala carpeta “References” de nuestro entor-no Microsoft Visual Studio .NET paraañadir la referencia a MySQL Connector1.0.1 como muestra la figura 6, teniendoen cuenta la versión de Microsoft .NETFramework que estamos utilizando.

De esta manera, lo primero queharemos será importar el espacio denombres MySql.Data.MySqlClient yescribiremos a continuación el siguien-te código para nuestras aplicaciones.Este código quedaría, en este caso, comose indica en el fuente 2.

El resultado de ejecutar estas líneasde código es el mismo que hemos vistoen los ejemplos anteriores. El cambioreside en la manera en la que conecta-mos con MySQL.

Usando MySQL DriverCS3.0.16b

La instalación de MySQL DriverCSconlleva la sorpresa adicional, de que setrata de una API o driver escrito comple-tamente en C#, y el cuál realiza las fun-ciones de conexión entre nuestras aplica-ciones .NET y MySQL.

De la misma manera que hemoshecho en el caso anterior, añadiremos anuestro entorno de desarrollo, una refe-

rencia al componente MySQL DriverCStal y como se muestra en la figura 7.

Una vez hecho esto, estaremosentonces preparados para utilizar estaAPI o driver y conectar así nuestrasaplicaciones a nuestras fuentes dedatos MySQL. Lo primero que hare-mos será importar el espacio de nom-bres MySQLDriverCS para utilizar estedriver en nuestra aplicación, y escri-bir el código de nuestra aplicación (verfuente 3).

dotN

etM

anía

<<

42

dnm.servidores.sql<<

Figura 5.Componentes MySQLConnector 1.0.1 en Visual Studio .NET

Figura 6.Añadiendo la referencia deMySQL Connector 1.0.1 en

Visual Studio .NET

Imports MySql.Data.MySqlClient[...]Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _

Handles Button1.Click' Declaramos las variables de ConexiónDim strConexion As StringDim objConexion As MySqlConnectionDim objDataAdapter As MySqlDataAdapterDim objDS As New DataSet' Establecemos la conexión con el DSN declaradostrConexion = "Database=test;Data Source=localhost;User Id=root;Password=dotnetmania"objConexion = New MySqlConnection(strConexion)' Asignamos al adaptador la instrucción SQL junto a la conexión a utilizarobjDataAdapter = New MySqlDataAdapter("SELECT Nombre, Apellidos FROM tabla", objConexion)' Volcamos los datos a un DataSetobjDataAdapter.Fill(objDS, "ConectMySQL")' Volcamos su contenido al control DataGridDataGrid1.DataSource = objDS.Tables("ConectMySQL")' Cerramos la conexión porque no la vamos a utilizar másobjConexion.Close()' Expandimos el control DataGrid para mostrar sus datosDataGrid1.Expand(0)

End Sub

Fuente 2 (VB)

using MySql.Data.MySqlClient;[...]private void button1_Click(object sender, System.EventArgs e){// Declaramos las variables de Conexiónstring strConexion;MySqlConnection objConexion;MySqlDataAdapter objDataAdapter;DataSet objDS = new DataSet();// Establecemos la conexión con el DSN declaradostrConexion = "Database=test;Data Source=localhost;User Id=root;Password=dotnetmania";objConexion = new MySqlConnection(strConexion);// Asignamos al adaptador la instrucción SQL junto a la conexión a utilizarobjDataAdapter = new MySqlDataAdapter("SELECT Nombre, Apellidos FROM tabla", objConexion);// Volcamos los datos a un DataSetobjDataAdapter.Fill(objDS, "ConectMySQL");// Volcamos su contenido al control DataGriddataGrid1.DataSource = objDS.Tables["ConectMySQL"];// Cerramos la conexión porque no la vamos a utilizar másobjConexion.Close();// Expandimos el control DataGrid para mostrar sus datosdataGrid1.Expand(0);

}

Fuente 2 (C#)

Page 43: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET ... · con VB.NET y C#. ¡Mi madre es un Singleton! 46-48 Siguiendo con el tema del último artículo, volvemos a tratar

El resultado de ejecutar estas líneasde código es, una vez más, el mismo quehemos visto en todos los ejemplos ante-

riores. La manera en la que deseamosconectar es la que varía y la que debe-mos elegir nosotros mismos, segúnnuestras necesidades.

ConclusionesComo podemos observar, las simi-

litudes de conexión a fuentes de datosMySQL son bastante cosiderables entreunas API o drivers y otros, aunque esosí, existen algunas diferencias léxicas atener en cuenta.

MySQL ODBC driver v.3.5.1 nosobliga a establecer una conexión ODBCy a usar System.Data.Odbc. Además, estaforma de conexión hace previsible queexista una diferencia de rendimientoentre el acceso ODBC y otros métodosde acceso. El acceso a través de ODBCsiempre ha estado criticado por la faltade rendimiento y más aún si se compa-ra con un driver de acceso nativo al ges-tor de bases de datos, como podría serpor ejemplo System.Data.SqlClient paraMicrosoft SQL Server 7.0 ó superior.

MySQL Connector 1.0.1 es quizás elque más parecido tenga con System.Data.Odbc y el resto de espacios de nom-bres que permiten accesos a diferentesfuentes de datos. Su uso es bastanteintuitivo y sencillo. Los componentes,nos facilitan asimismo, la posibilidad deescribir aplicaciones n-tier de formarápida y sencilla.

MySQL DriverCS es quizás a la horade establecer la conexión con MySQLel driver más curioso. La forma en laque establece la conexión no es a la quenos tienen acostumbrados otros drivers,pero es igual de efectiva. No es tan com-pleto como lo podría ser MySQLConnector 1.0.1 pero su simplicidad es aveces mucho más interesante que lascaracterísticas que nos pueda aportarotra API de conexión.

Nótese además, que en nuestrosejemplos, hemos utilizado la instalaciónque MySQL realiza por defecto, por loque el puerto de MySQL para estable-cer la comunicación es el puerto pordefecto, el 3306. Si por razones que con-siderara oportunas, deseara modificarese puerto a la hora de instalar MySQL,debe tener en cuenta que quizás debahacer referencia al puerto directamen-te como parámetro de conexión, comopuede ser el caso de la creación del ori-gen de datos a través de ODBC o en eluso de MySQL DriverCS como pará-metro del método MySQLConnectionString.

Aún así, hemos podido ver con ejem-plos prácticos, cómo establecer comu-nicaciones con nuestras aplicaciones.NET y MySQL, utilizando para ello,diferentes API o drivers que nos hanpermitido establecer de una maneramuy sencilla la comunicación efectivacon MySQL.

dotN

etM

anía

<<

43

dnm.servidores.sql<<

Imports MySQLDriverCS[...]Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)Handles Button1.Click' Declaramos las variables de ConexiónDim objConexion As MySQLConnectionDim objDataAdapter As MySQLDataAdapterDim objDS As New DataSet' Establecemos la conexión con el DSN declaradoobjConexion = New MySQLConnection( New MySQLConnectionString("localhost", "test", _

"root", "dotnetmania").AsString)' Asignamos al adaptador la instrucción SQL junto a la conexión a utilizarobjDataAdapter = New MySQLDataAdapter("SELECT Nombre, Apellidos FROM tabla", objConexion)' Volcamos los datos a un DataSetobjDataAdapter.Fill(objDS, "ConectMySQL")' Volcamos su contenido al control DataGridDataGrid1.DataSource = objDS.Tables("ConectMySQL")' Cerramos la conexión porque no la vamos a utilizar másobjConexion.Close()' Expandimos el control DataGrid para mostrar sus datosDataGrid1.Expand(0)

End Sub

Fuente 3 (VB)

using MySQLDriverCS;[...]private void button1_Click(object sender, System.EventArgs e){// Declaramos las variables de ConexiónMySQLConnection objConexion;MySQLDataAdapter objDataAdapter;DataSet objDS = new DataSet();// Establecemos la conexión con el DSN declaradoobjConexion = new MySQLConnection(new MySQLConnectionString("localhost", "test",

"root", "dotnetmania").AsString);// Asignamos al adaptador la instrucción SQL junto a la conexión a utilizarobjDataAdapter = new MySQLDataAdapter("SELECT Nombre, Apellidos FROM tabla", objConexion);// Volcamos los datos a un DataSetobjDataAdapter.Fill(objDS, "ConectMySQL");// Volcamos su contenido al control DataGriddataGrid1.DataSource = objDS.Tables["ConectMySQL"];// Cerramos la conexión porque no la vamos a utilizar másobjConexion.Close();// Expandimos el control DataGrid para mostrar sus datosdataGrid1.Expand(0);

}

Fuente 3 (C#)

Figura 7

Page 44: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET ... · con VB.NET y C#. ¡Mi madre es un Singleton! 46-48 Siguiendo con el tema del último artículo, volvemos a tratar
Page 45: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET ... · con VB.NET y C#. ¡Mi madre es un Singleton! 46-48 Siguiendo con el tema del último artículo, volvemos a tratar
Page 46: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET ... · con VB.NET y C#. ¡Mi madre es un Singleton! 46-48 Siguiendo con el tema del último artículo, volvemos a tratar

¡Mi madre es un Singleton!

Siguiendo con el tema del último artículo, volvemos a tratar algunos patronesde diseño básicos. En este caso veremos el singleton. Si bien puede tener doslugares distintos de donde se llaman, siempre es la misma instancia que atien-de a la petición cliente.

Se asegura que solo se crea una instancia de unaclase. Todos los objetos que usen una instancia de estaclase siempre usarán la misma instancia.

ObjetivoEn principio se desea que se pueda acceder en una

manera centralizada a un recurso único en el sistema.También puede usarse en los casos donde la cre-

ación de un objeto implique consumir demasiadosrecursos. De esta manera se crearía el objeto y que-daría guardado.

Contexto de usoEs uno de los patrones que más utilizo cuando tra-

bajo. Lo utilizo para centralizar la información comopuede ser la información de conexión a un servicioWeb, o de rendimiento, como puede ser crear la capade datos solo una vez.

Implementación: ¿Cómo se hace unSingleton?

Lo primero que hay que tener claro es que nadiedesde fuera de la clase puede crear una instancia, portal motivo el constructor debe ser privado.

Para poder obtener la instancia, necesitaremos deun método o propiedad. Este método no puede serde instancia, sino de clase, es decir un static (o sha-red en Visual Basic) que siempre devuelve la mismainstancia.

La instancia que retorna es privada y static.El resto de lo que contenga la clase depende de la

lógica de negocio que maneje.En el diagrama UML 1 se puede ver como queda.

Una de las primeras preguntas que se me ocurriócuando vi este patrón por primera vez fue “¿y por quéno usar todos los métodos estáticos?”. De hecho, laplataforma .NET tiene clases con todos métodos está-ticos, como System.Console. Algunas de las razonespuede ser que se debe usar una interfaz. Por ejemplo,si se crea una clase para reproducir audio y otra clasepara reproducir vídeos, los dos deberían ser Singletonpara no reproducir dos temas al mismo tiempo, y teneruna interfaz IMovimientos, con métodos para adelan-tar o atrasar un tema. En el diagrama UML 2 se visua-liza el resultado.

Daniel Mazzini

dnm.arquitectura

<< Resumen

Daniel Mazzinicolabora habitualmente con

dotNetManía. Es Arquitecto deSistemas de Información en

Insert Sistemas. Imparte cursostanto de C# como de VisualBasic.NET para Aula DAT y

colabora en los talleres MSDNde Microsoft Ibérica.

Diagrama UML 1

Diagrama UML 2

Page 47: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET ... · con VB.NET y C#. ¡Mi madre es un Singleton! 46-48 Siguiendo con el tema del último artículo, volvemos a tratar

dotN

etM

anía

<<

47

dnm.arquitectura<<

Quizás la razón más importante para usar unSingleton antes que los métodos estáticos son los cam-bios; es posible, agregando no más de 10 líneas de códi-go, hacer que una clase normal pase a ser Singleton,mientras que de la otra forma, tendría que pasar todo aestáticos, con el importante cambio que significa en laclase cliente. Por lo tanto, me da la posibilidad de pen-sar mi arquitectura sin interesarme la cantidad de ins-tancias necesarias, luego agregaré las líneas necesariassi es de una sola instancia.

En la sección de ejemplo se ven las líneas de códi-go necesarias para crear el Singleton, todas ellas ence-rradas en una región.

Evitando copiasYa hemos visto que la idea de un Singleton es que

sea una instancia única. Para mantenerla así, existentemas a tener presentes:

• Serialización. Un objeto se serializa por distin-tas razones; generalmente porque es un objetoque se transfiere entre capas y debe pasar comobinario o XML a otra capa, o simplemente parapersistir su información en un archivo de disco.Un objeto Singleton no debe incluirse en nin-gún proceso de serializacion.

• Clonación. El segundo tema a tener presente esla clonación. Un objeto Singleton no debeimplementar la interfase IClonable, ni directani indirectamente.

• Herencia. En cuanto a herencia, para que nadiepueda heredar de esta clase y crear más de unasubclase, lo que generaría, en tiempo de eje-cución, más de una instancia, se le indica a laclase del Singleton que no podrá ser heredada(sealed).

• Sincronización de threads. El último tema, la sin-cronización de threads, es el más difícil de con-trolar a primera vista. El método que crea elSingleton es estático, es decir, que distintos thre-ad podrían llamarlo, pudiendo pasar de tener 0instancias a tener 2 instancias si dos thread entranpor vez primera a crear la instancia. Para miti-gar este problema usamos una técnica de pro-gramación de múltiples hilos llamado doble check,donde se chequea dos veces un valor, antes y des-pués del bloqueo del thread.

Evitando confusionesAlgo que suele suceder con bastante frecuencia

es que cuando desarrollamos una aplicación tenemosun objeto que es único para toda la aplicación, y que-remos poder compartirlo desde distintas aplicacio-nes. En este caso, el Singleton que usaremos es el deremoting. Remoting me permite crear un objeto quevive en el servidor y que es el mismo para distintos

clientes porque se comparte por referencia. El patrónSingleton me permite crear algo único para el mis-mo cliente de formulario Windows, como puede serla información referente al menú y sus opciones visi-bles según los roles que tenga en la aplicación.

Con aplicaciones Web la cosa cambia un pocoporque tengo el objeto Application, colocando unobjeto ahí será el mismo para todos los que accedana la Web.

Ventajas de este patrón• Existe solo una instancia de la clase.• Acceso de forma controlada a la instancia. No

usamos variables globales.• Otras clases que hagan uso de la clase Singleton

obtendrán una instancia por medio de un méto-do estático, antes que construyéndolo.

• El método que me trae la instancia encapsu-la el proceso de creación; a veces el procesode creación puede significar realizar otra tarea,por ejemplo, abrir un archivo que hará de log.Podemos valernos de los archivos de confi-guración.

Desventajas• Subclases. Debido a que el método estático es

la clave para llegar a la instancia que está den-tro de la clase Singleton, y como los métodosestáticos no pueden ser virtuales, y por endesobrescribirse, esto genera problemas a la horade crear una clase que herede del Singleton.Tendríamos que ocultar con el comando new.

RolesEl Singleton es un patrón muy sencillo en cuan-

to a roles porque solo consta de una clase.Singleton: Clase de de la cual queremos tener

una única instancia.

EjemploPodemos seleccionar en tiempo de ejecución a

qué destino enviar un mensaje, a una cola de mensa-je de MSMQ o a una colección cola. Para esto pode-mos hacer una interfaz llamada IMensajeria, que ten-ga dos métodos: uno para enviar mensajes y otro paracerrar la cola. El fuente 1 muestra el código de lainterfaz.

public interface IMensajeria{

void Send(EntidadBase body);void Close();

}

Fuente 1

Page 48: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET ... · con VB.NET y C#. ¡Mi madre es un Singleton! 46-48 Siguiendo con el tema del último artículo, volvemos a tratar

Una vez creada la cola, debemos enviar el mensa-je. Deseamos no tener que crear la cola cada vez, sinosolamente enviar el mensaje. Para esto usaremos elpatrón Singleton. El diagrama UML 3 muestra laestructura final.

Para facilitar la escritura desde el código cliente,he cambiado el método ObtenerInstancia por la pro-piedad Instancia de solo lectura. También se puedever la creación retardada de la instancia, es decir, quehasta que no la necesita no se crea, así como el cons-tructor privado. El fuente 2 muestra los pasos paracrear la instancia única.

También estoy asociando lo explicado en el artí-culo anterior, un modelo SuperClase Abstracta. Larazón es que me interesa enviar cualquier objeto siem-pre y cuando herede de EntidadBase.

Todo esto se ejecuta desde una aplicaciónWindows, donde puede seleccionar si loenvió a una cola normal o a MSMQ.También puedo enviar un objeto u otro.

Patrones asociadosEste sigue siendo un patrón básico, por lo tanto,

encontramos muchos otros patrones:• Factory method: Generalmente las factorías de obje-

tos son Singleton. Con una sola factoría alcanza.• Builder: Separa la construcción de un objeto de su

representación, de forma que el mismo proceso pue-da crear diferentes representaciones. La manera másfácil de entenderlo es la serializacion, donde tene-mos un conjunto de caracteres con un determinadoformato (XML, binario, SOAP) y a partir de aquívuelve a crear distintos objetos.

dotN

etM

anía

<<

48

dnm.arquitectura<<

Diagrama UML 3

private static Cola instanciaUnica;private static object lockObject= new object();

Queue queue;

private Cola(){queue= Queue.Synchronized( new Queue());

}

public static Cola Instancia{get{//doble check://Es posible que un segundo thread este creando la//instancia mi entras se bloquea al primer thread//Por tal motivo, se vuelve a preguntar despues //del bloque si es nullif (instanciaUnica==null){lock(lockObject){if (instanciaUnica==null)instanciaUnica= new Cola();

}}return instanciaUnica;

}}

Fuente 2

Figura 1

...se desea que se pueda acceder de una manera centralizada a un recurso único en el sistema.También puede usarse en los casos donde la

creación de un objeto implique consumir demasiados recursos.De esta manera se crearía el objeto y quedaría guardado.

Page 49: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET ... · con VB.NET y C#. ¡Mi madre es un Singleton! 46-48 Siguiendo con el tema del último artículo, volvemos a tratar

dotN

etM

anía

<<

49

<< principal de los MVP es compartir y que sumayor vicio es la tecnología son algunas de las caracte-rísticas de este grupo de personas afín a productosMicrosoft.

Lo que está claro, es que si usted está leyendoeste artículo es porque tiene cierto interés sobreMicrosoft .NET y la tecnología en general, su divul-gación, expansión, aprendizaje, etc. En resumen, todolo que sea aprender le llama la atención.

El artículo de la sección dnm.mvp.online de estemes nos acerca a la iniciativa emprendida por Krasis(http://www.krasis.com), empresa especializada en lastecnologías de la información, y en la persona de JoséManuel Alarcón, MVP de ASP/ASP.NET, que ensu afán por divulgar la tecnología nos facilita enor-memente la formación en línea a distancia sobre lastecnologías Microsoft en general y sobre .NET enparticular. Todo en nuestro idioma.

CampusMVP, la formación al poderPara hablar de esta interesante iniciativa, hay que

hablar de campusMVP, y para hablar de campusMVP enprofundidad hay que explicar primero lo que es.

campusMVP es una iniciativa promovida por Krasisy José Manuel Alarcón, y realizada con la colaboraciónde otros MVP en la que se ofrecen cursos de forma-ción en línea sobre tecnologías Microsoft (tanto de pro-gramación como de sistemas) y en los que los conteni-dos y la tutorización es realizada exclusivamente porMVP. Este es su gran valor diferencial.

No se trata de cursos pensados para obtener unacertificación o título, sino que se dirigen a personascon la intención de progresar en sus conocimientosy en definitiva, hacer formación continua para sercada vez mejores profesionales. Por eso son cursoscortos, de temas muy concretos y normalmente espe-cializados, con un precio muy asequible tanto a nivelpersonal como empresarial.

Aún así, las miras de campusMVP son mucho másamplias; entre otras cosas, permite incluso licenciarcontenidos a empresas de formación que quierancomercializarlos por su propia cuenta.

Algunas cosas sobre CampusMVPEl hecho de que campusMVP haya apostado por la

formación en línea a distancia no es casual. JoséManuel, consciente de los ritmos de trabajo y desa-

rrollo profesional, y las dificultades que hoy existenpara acudir a lugares donde se pueda recibir forma-ción sobre un producto en concreto (en muchas oca-siones la propia empresa prefiere contratar al forma-dor para que vaya a su empresa a dar la formación),ha decidido este medio de formación debido a queesto permite al alumno elegir el horario más satisfac-torio para él, y marcar así su propio ritmo de apren-dizaje. Adicionalmente, la importante figura del tutorañadida a los cursos, respalda los conocimientos adqui-ridos y resuelve cualquier contratiempo o duda plan-teada en un momento en particular.

Obviamente, si hablamos de formación en línea,hablamos de Internet y por ello, es razonable que elusuario disponga de una conexión a Internet a travésde la cuál, poder llevar a cabo su aprendizaje.

Todos los cursos están divididos en lecciones, ycada una de las lecciones en epígrafes. Los epígrafesson de pequeña duración, por lo que la flexibilidada la hora de parar o continuar en un momento dadode la formación en línea es muy grande.

El sistema informático implantado en la formaciónen línea, le permite siempre elegir qué quiere hacer cadavez que se sienta delante del PC. Puede retomar la for-mación en el lugar en el que lo dejó la última vez o pue-de ir a la parte del curso que desee.

Otra de las características a reseñar de los cursosen línea de campusMVP es la información indirectade apoyo de que dispone el alumno. De esta mane-ra, los cursos se complementan con trucos, enlaces,preguntas frecuentes, etc.

¿Y los tutores?Los tutores son conocidos MVP con una larga

experiencia en formación, escribiendo libros y artí-culos y preparando material técnico. A la hora deescribir este artículo, los MVP que participan comotutores de alguno de los cursos impartidos encampusMVP son:

•José Manuel Alarcón (MVP ASP/ASP.NET)•Alejandro Mezcua (MVP Compact .NET

Framework)•Alex A. Solano (MVP ASP/ASP.NET)•Guillermo Som “El Guille” (MVP Visual Basic)•Iván González (MVP Windows Server)•Jesús López “SQL Ranger” (MVP SQLServer)

•Rodrigo Corral (MVP C++)

Que el objetivo

Jorge Serrano

dnm.mvp.online<<

Campus MVP

Jorge Serranoes redactor de dotNetManía. EsIngeniero Informático y MVP deVB y de .NET. Es Webmaster de

PortalVB.com y autor dediferentes libros y artículos

técnicos. Jorge está entre losmejores profesores y

conferenciantes sobre latecnología .NET de nuestro país.

Page 50: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET ... · con VB.NET y C#. ¡Mi madre es un Singleton! 46-48 Siguiendo con el tema del último artículo, volvemos a tratar

Los tutores no sólo preparan el material y contenido delos cursos, sino que además, colaboran con el alumno en lasdudas o problemas que pueda encontrar en su aprendizaje. Sepuede incluso enviar un mensaje de correo electrónico sobreuna duda o problema puntual al tutor, o quedar con él en unchat a una hora determinada.

¿Qué cursos hay actualmente?campusMVP está en continuo crecimiento.

Actualmente hay 8 cursos, aunque la idea y obje-tivo principal es ampliar ese número de cursos

en el futuro.Los cursos actuales son los siguientes:

• C# para programadores de Visual Basic 6.• Desarrollo de aplicaciones Web ASP.NET para disposi-

tivos móviles.• Fundamentos de desarrollo de aplicaciones Web con

ASP.NET.• Planificación, implementación y mantenimiento de

Directorio Activo en Windows 2003.• Programación asíncrona avanzada en la plataforma .NET.• Programación de aplicaciones distribuidas con .NET

Remoting.• Seguridad avanzada de Internet Information Server.• Técnicas de escritura de código seguro.

Los costes de los cursosLos costes de los cursos son siempre un tema importan-

tísimo. Hemos indicado ya que los cursos resultan bastanteeconómicos. Dependiendo del curso seleccionado el costesuele rondar entre los 65€ y los 130€.

La duración de los cursos también varía según el cursoseleccionado.

Si está interesado en conocer más a fondo esta forma deaprendizaje pero no se termina de decidir, debe saber queexiste un curso gratuito y que le puede ayudar a familiari-zarse con este innovador medio de formación en línea a dis-tancia. El curso de Seguridad avanzada de Internet InformationServer, le permitirá no sólo aprender conceptos sobre la segu-ridad de IIS sino que además podrá conocer de primera manocómo funciona campusMVP. Más fácil no se nos puede poner¿verdad?

¿Dónde está CampusMVP?campusMVP es una iniciativa virtual, por lo que debere-

mos acudir a la página Web http://www.campusmvp.com parapoder acceder a todo el material referente a los cursos.

Allí encontraremos todo lo que necesitamos, precios, dura-ciones, cursos que se pueden recibir, descripción de los cur-sos, preguntas y respuestas frecuentes, precios especiales aempresas, etc.

Para cualquier duda respecto a los cursos, se recomiendavisitar la página Web de campusMVP, donde podrá plantearsus dudas o preguntas.

Conclusión

Como vemos, Internet nos proporciona todas las herramientaspara aprender y formarnos a distancia. Sólo hace falta tener cur-sos y contenidos de calidad y campusMVP los proporciona.

Las empesas de hoy en día son muy reticentes a la forma-ción; en los costes de formación no sólo se deben tener en cuen-ta el propio coste del paquete de formación en particular, sinolos costes derivados en traslados, horarios, dietas, etc.

Los métodos de formación como los que nos presentacampusMVP, permite a la empresa tener una flexibilidadmucho mayor y acondicionar el ritmo de formación al rit-mo de trabajo y desarrollo profesional del trabajador. Deesta manera, es posible sacar un mayor provecho de a la for-mación y al trabajador.

José Manuel Alarcón es MVP deVisual Developer ASP/ASP.NET desdeabril de 2004.

Ingeniero superior industrial especia-lizado en diseño de máquinas, posee el títu-lo de Especialista Universitario enConsultoría de Empresa.

Estos antecedentes no lo conducíanprecisamente al mundo de la informática,hasta que un soleado día de mayo de hace

ya muchos años (demasiados) se contagió del “vicio del sicilio”,como él lo llama.

Comenzó programando calculadoras HP-48 en lenguajeRPL para resolver problemas técnicos, pero enseguida se intro-dujo en el mundo de la informática profesional desarrollandotambién aplicaciones de ingeniería. Su primer gran proyecto“serio” fue un entorno de simulación de ciclos termodinámicosaunque realizó algunos desarrollos más relacionados con la inge-niería. Eso fue antes de dejarla definitivamente de lado para dedi-carse a la informática de modo profesional.

Desde entonces ha visto publicados varios libros de progra-mación e ingeniería, y es colaborador en diversas publicacionesdel sector TIC, como dotNetManía, PC World, Windows TIMagazine, etc., siendo autor de cerca de 300 artículos. Colaboracon Microsoft en la impartición de seminarios y en su revistaempresarial (www.empresas.microsoft.com).

En la actualidad es socio de Grupo Femxa, un grupo empre-sarial gallego de servicios profesionales donde dirige diversosproyectos tecnológicos centrados en la teleformación y los ser-vicios a ISP fundamentalmente.

Puedes encontrarlo en su blog sobre programación .NETen www.jasoft.org.

Desde aquí mandamos un cordial y afectuoso abrazo a Joséy nuestros mejores deseos para su pronta recuperación despuésdel percance que sufrió cuando se estaba elaborando este artícu-lo. Por suerte para todos y sobre todo para el bueno de José yquienes le rodean, todo quedará en una mera anécdota.

Si quieres saber más sobre el programa MVP puedes con-sultar la página de Microsoft en: http://mvp.support.microsoft.com

Sobre Jose Manuel Alarcón

José Manuel Alarcón

50

<<do

tNet

Man

ía<<dnm.mvp.online

Page 51: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET ... · con VB.NET y C#. ¡Mi madre es un Singleton! 46-48 Siguiendo con el tema del último artículo, volvemos a tratar

dotN

etM

anía

<<

51

emplean de una forma uotra el control DataGrid. Y no me refiero a contro-les de terceros, sino al DataGrid que viene con el pro-ducto de forma nativa. En ASP.NET 2.0, este con-trol está totalmente soportado (no podía ser de otraforma), pero parece que su hermano mayor, el con-trol GridView, va a sustituirlo en muchas situacionescomunes. Aparte de unos pocos miembros cambia-dos de nombre y un modelo de objetos ligeramentediferente, ambos controles se parecen mucho. Sí quees cierto, que GridView dispone de un modelo deobjetos más claro y refinado y unos cuantos miem-bros adicionales, aparte de incorporar el feedback dedos años de experiencia real. Pero a primera vista,ambos parecen iguales, y muchos desarrolladores sepreguntan si son necesarios los dos.

No hay duda de que DataGrid debe estar enASP.NET 2.0 para garantizar la compatibilidad haciaatrás y migración suave de aplicaciones. Así que lapregunta real es ¿por qué necesitaríamos un nuevocontrol GridView? ¿Cuál es el nuevo valor real queofrece? La primera pregunta de este mes tiene quever con el DataGrid, pero la he seleccionado tam-bién por que puede ilustrar las diferencias respectoal nuevo control.

Tengo una columna Identity en una tabla enla-zada a un DataGrid. Quiero que los usuarios puedanseleccionar una fila y ejecutar ciertas acciones sobrela tabla vinculada con ella. ¿Cómo hago esto sin mos-trar la columna Identity en el DataGrid? Si la colum-na fuera visible, podría encontrar su valor buscandoel dato literal asociado. Pero no quiero que se mues-tre la columna. Ayuda, por favor.

Bueno, esta es una pregunta típica de principian-tes en el DataGrid. Pero, marca una diferencia sig-nificativa entre el DataGrid y el GridView. Veamosprimero lo relativo al DataGrid. La solución pro-puesta es válida tanto para ASP.NET 1.x como paraASP.NET 2.0.

Para mantener accesibles los valores de unacolumna Identity sin mostrarla, basta con añadir esacolumna al DataSet vinculado al control. Para queno se vea, se la mantiene fuera de las columnas enla-zadas al DataGrid. Al mismo tiempo, tienes que infor-mar al DataGrid de la existencia de una columna cla-

ve. Eso lo harás asignando a la propiedad DataKeyFieldel nombre de la columna Identity. Pongamos que lacolumna identidad se llama EmployeeID. En ese caso,sería:

<asp:DataGrid … datakeyfield="employeeid" … />

Cuando se asigna DataKeyField, el DataGrid relle-na la propiedad DataKeys (un array de objetos) conlos valores de la columna especificada correspondien-tes a los registros mostrados. Este array contiene tan-tos elementos como filas se muestran en el DataGrid.Cada elemento contiene el valor del campo clave parael registro enlazado. En este punto, si conoces el índi-ce de la fila seleccionada, (cuyo primer elemento esel 0), puedes ejecutar el siguiente código. Vamos asuponer que el campo clave es un entero:

int key = (int) grid.DataKeys[rowIndex];

El índice de la fila seleccionada puede obtenersede varias formas, dependiendo de la interfaz de usua-rio de la rejilla de datos. Si la rejilla tiene una colum-na Select, la propiedad SelectedIndex devuelve elíndice de la fila. Si necesitas la clave de la fila en edi-ción, la propiedad es EditIndex. Si quieres lanzar unaacción personalizada (por ejemplo desde un botón“Columna”), se obtiene el índice de la fila seleccio-nada a partir del evento de la estructura de datos. Porejemplo, el parámetro pasado al evento ItemCommand–de la clase DataGridCommandEventArgs– dispone deuna propiedad Item.ItemIndex.

En cualquier caso, es importante que el campoclave sea parte del origen de datos enlazado alDataGrid.

Podría pensarse que el mismo modelo es aplica-ble igualmente al control GridView. Sin embargo,aunque el modelo no es radicalmente diferente, exis-ten ciertas diferencias que merecen la pena conside-rarse.

De acuerdo, ya me ha picado la curiosidad. Estoydeseando saber cuáles son las diferencias entre losdos controles.

Imagina un escenario en el que tienes una colum-na Grid Button, para lanzar cualquier acción, por ejem-

ASP.NET 2.0 está aterrizando

Dino Esposito

dnm.todotnet.qa

<< Muchas aplicaciones ASP.NET

Dino Esposito es redactor de dotNetManía.

Formador, consultor y escritorafincado en Roma.Miembro

del equipo de Wintellect,Dino está especializado en

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

[email protected]

Page 52: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET ... · con VB.NET y C#. ¡Mi madre es un Singleton! 46-48 Siguiendo con el tema del último artículo, volvemos a tratar

dotN

etM

anía

<<

52

dnm.laboratorio.net<<

To

do

tNet.

qa@

do

tnetm

an

ia.c

om

To

do

tNet.

qa@

do

tnetm

an

ia.c

om

plo, añadir un elemento al carrito de la compra. Conlos GridView el índice de la fila seleccionada no estransportado por la estructura de datos del evento(como en el DataGrid). Para buscarlo, tienes que recu-rrir a la propiedad CommadArgument. Sería de la siguien-te forma:

Hay que notar que el evento ItemCommand delDataGrid es reemplazado por RowCommand en unGridView. Cierto código de ejemplo en la documen-tación de la Beta 2, sugiere que el usuario debería deponer el índice en el CommandArgument manualmenteescribiendo su propio manejador para el eventoRowCreated. Pero otro código fuente de ejemplo en lamisma documentación utiliza el código indicado antes,y funciona perfectamente. Así que vamos a asumir unbug comprensible y temporal en la documentación.El código muestra cómo obtener el índice de la filaseleccionada. El evento RowCommand se produce paracada botón pulsado de cada fila del grid. Si disponesde múltiples columnas de botones, podrías necesitarasegurarte de que el evento que manejas es el adecua-do. Para ello, puedes comprobar la propiedadCommandName.

El siguiente problema a abordar, es cómo obtenerlos datos correspondientes a la fila seleccionada.Donde esos datos pueden ser de cualquier clase alma-cenada en el origen de datos. Si el grid está vincula-do a un objeto DataTable, los datos correspondientesserán un objeto de tipo DataRow. Si el grid se enlaza auna colección personalizada, como por ejemplo unacolección de Clientes, el ítem de datos se correspon-derá con un cliente individual.

Lo mejor que puedes hacer es aprovechar la colec-ción DataKeys, que ha sido ampliada en esta versiónpara soportar múltiples campos y no solo un campoclave (con los DataGrid, el campo clave debe ser úni-co, aunque la tabla subyacente no posea ningún cam-po de este tipo).

Así que estableces uno o más campos clave paraser manejados por la colección DataKeys. Puedes con-siderar a la colección DataKeys como una colección dedatos personalizados para ser recuperados de formainmediata y sencilla. En el fuente 2 puede ver unGridView de ejemplo.

Puedes usar la nueva propiedad DataKeyNames paraestablecer la lista de campos cuyos valores se almace-narán en la colección de DataKeys para acceso rápido.

La propiedad DataKeyNames es la contrapartida de la pro-piedad DataKeyField en los DataGrid. Es un array destrings en lugar de una cadena simple. Los valores detodos los campos en la propidad DataKeyNames se empa-quetan en un elemento de la colección DataKeys. La for-ma de obtener los valores asociados es la siguiente:

Es esta página de ejemplo, ShoppingCartGrid es ungrid de apoyo que utilizo para mostrar los elementosdel carrito de la compra. Esta enlazado a una colec-ción personalizada de tipos ShoppingCart poblada conobjetos ShoppingItem. La colección personalizada delcarrito se almacena en el objeto Session, y se recupe-ra a través de la propiedad MyShoppingCart. A conti-nuación se ilustra esto con un pseudo-código:

void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)

{if (e.CommandName.Equals("AddToCart")){

int rowIndex = Convert.ToInt32(e.CommandArgument);}

}

Fuente 1

<asp:GridView ID="GridView1" runat="server" DataSourceID="SqlDataSource1" BackColor="white"DataKeyNames="productid,productname,unitprice"AutoGenerateColumns="false" AllowPaging="true" OnRowCommand="GridView1_RowCommand"><Columns>

<asp:boundfield datafield="productname" headertext="Product" />

<asp:boundfield datafield="quantityperunit" headertext="Packaging"/>

<asp:boundfield datafield="unitprice" headertext="Price" DataFormatString="{0:c}" />

<asp:buttonfield buttontype="Button" text="Add"CommandName="Add" />

</Columns></asp:GridView>

Fuente 2

void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)

{if (e.CommandName.Equals("AddToCart")){

// Get the index of the clicked row int rowIndex = Convert.ToInt32(e.CommandArgument);

// Add the item to the shopping cartAddToShoppingCart(rowIndex);

}}

private void AddToShoppingCart(int rowIndex){

DataKey data = GridView1.DataKeys[rowIndex];

ShoppingItem item = new ShoppingItem();item.NumberOfItems = 1;item.ProductID = (int) data.Values["productid"];item.ProductName = data.Values["productname"].ToString();item.UnitPrice = (decimal) data.Values["unitprice"];MyShoppingCart.Add(item);

ShoppingCartGrid.DataSource = MyShoppingCart;ShoppingCartGrid.DataBind();

}

Fuente 3

Page 53: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET ... · con VB.NET y C#. ¡Mi madre es un Singleton! 46-48 Siguiendo con el tema del último artículo, volvemos a tratar

public ShoppingCart MyShoppingCart{

get {return Session["MyShoppingCart"];}set {Session["MyShoppingCart"] = value;}

}

Y por último, DataKeys. Por diseño, devuelven un arrayde objetos DataKey, con tantos campos como elementoshaya en la propiedad DataKeyNames del GridView. La for-ma de recuperar un campo concreto es la siguiente:

item.ProductID = (int) data.Values["productid"];

En general, las propiedades contenidas en el nue-vo GridView son una extensión y mejora de las exis-tentes en el antiguo control DataGrid. Como conse-jo final, ten en cuenta que, cuantos más campos sealmacenen en la colección DataKeys, más sobrecarga-do estará el campo ViewState. Como puedes suponer,los contenidos de DataKeys son almacenados en la pro-piedad ViewState de la página, para no tener que recu-perarlos entre viajes al servidor.

Soy relativamente nuevo en ASP.NET 2.0 y noacabo de comprender exactamente cuál es el signifi-cado de esos símbolos $ que he visto en código fuen-te de ejemplos. En concreto, parece que está relacio-nado con las cadenas de conexión y los controlesDataSource. ¿Puede explicárnoslo?

Por suerte, el símbolo $ no significa costes ocul-tos de ninguna clase; ni tampoco que haya que pagarninguna clase de “royalties” por página. Es solamen-te el identificador de un nuevo tipo de expresiones entiempo de ejecución. En ASP.NET 2.0 existen 3 tiposde expresiones, de las cuales, las dos primeras estabansoportadas por ASP.NET 1.x:

1) Bloques clásicos de ASP: <% … %> y <%= … %>2) Enlaces a datos de ASP.NET 1.x <%# … %>3) Nuevos enlaces a datos ASP.NET 2.0 <%$ … %>

No son sinónimos, así que explicaremos las dife-rencias.

Los primeros existen por compatibilidad con ASPclásico. La línea de código interna se integra con lapágina y se ejecuta cuando ésta es interpretada. Lasexpresiones con el prefijo # son expresiones de enla-ces que solo son interpretadas después de una llama-da al método DataBind(). En realidad, no son expre-siones dinámicas, ya que son evaluadas solo dentro delcontexto de la propia llamada de enlace.

ASP.NET 2.0 suministra una infraestructura hechaa medida para expresiones dinámicas, basadas en unnuevo juego de componentes, los constructores deexpresiones (Expression Builders). Las expresiones diná-micas tienen una sintaxis similar a la del DataBinding,excepto que utilizan el prefijo $ en lugar de la almo-hadilla (#). Las expresiones dinámicas se evalúan cuan-do se compila la página. El contenido de la expresiónes extraído, transformado en código, e insertado en elcódigo asociado con la página. Existen unos construc-

tores de expresiones predeterminados, tal y como apa-recen en la tabla adjunta:

Para enlazar una propiedad de un control al valor deuna expresión de forma declarativa se sigue el esquema<%$ expresión %>. La sintaxis exacta es definida por elconstructor asociado a cada tipo de expresión. Sólo sepueden usar expresiones dinámicas para asignar un valora una propiedad de un control. No puedes incrustar elvalor devuelto en el cuerpo de una página.

DotNetNuke ha estado haciendo mucho ruido últi-mamente y existen un par de libros publicados sobre eltema. Nuestra compañía lo ha estado revisando comouna posible plataforma para una consola de administra-ción basada en Web. Con la venidera versión de ASP.NET2.0 Portal Framework, parece que muchas de las caracte-rísticas que poseía se encuentran en esta versión. ¿Creesque DotNetNuke desaparecerá cuando salga la nueva ver-sión de ASP.NET 2.0?

Creo que DotNetNuke es una forma sencilla, o–mejor aún– asequible, de construcción de aplicacio-nes Web ASP.NET para muchos desarrolladores queno conocen suficientemente la plataforma, o no tienentiempo de hacerlo. DotNetNuke suministra un modorápido de construir sitios Web de ciertos tipos. ElASP.NET Portal Framework (o sea, ASP.NET 2.0 WebParts) es una forma de construir fácilmente ciertos tipode páginas Web. Más en general, existen ciertas simi-litudes entre DotNetNuke y los kits de inicio deASP.NET. Sin embargo, los kits de inicio, se enfocanmás bien a aplicaciones verticales, mientras que la pla-taforma DotNetNuke es de tipo horizontal.

Una consola de administración es un tipo de aplica-ción Web relativamente simple, con pocas páginas y undiseño sencillo. ¿Podría hacerse con DotNetNuke? Porlo poco que conozco de la herramienta, creo que sí. ¿Esla mejor opción? Eso es difícil de decir. Necesitarías unalojamiento Web que lo soporte específicamente, y algu-nos conocimientos concretos. Probablemente no muchos,y nada que un buen equipo de desarrollo no pueda abor-dar, pero para el caso que propones, un tipo de aplica-ción así, podría ser enfocado más fácilmente mediantelos mecanismos tradicionales. DotNetNuke es estupendosi tienes que construir muchos sitios Web en muy pocotiempo, o si el equipo de desarrollo no tiene experienciaen aplicaciones Web. Por último, el producto estará dis-ponible con toda seguridad después de la aparición de lanueva versión de ASP.NET.

dotN

etM

anía

<<

53

dnm.laboratorio.net<<

Traducción por Marino Posadas

Syntax Description

AppSettings:XXX Devuelve el valor de la configuración especificada en lasección <appSettings> del fichero configuración

ConnectionStrings:XXX Devuelve el valor de la cadena especificada en la sección<connectionStrings>del fichero de configuración.

Resources:resourcefile, XXX Devuelve el valor del recurso global especificado en elfichero .RESX.

Page 54: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET ... · con VB.NET y C#. ¡Mi madre es un Singleton! 46-48 Siguiendo con el tema del último artículo, volvemos a tratar

Component Art Web UI 2.1Cuando se analizan las características de las aplicaciones Web siempre se ponecomo desventaja de las mismas que tienen un interfaz más pobre que las aplicacio-nes Windows.Pues bien, gracias a Component Art podemos llegar a conseguir uninterfaz de usuario para aplicaciones Web tan atractivo como el de una aplicaciónWindows.

son un conjunto de com-ponentes cuya utilidad principal es la mejora del inter-faz de usuario en aplicaciones Web. Estos componen-tes permiten al desarrollador de aplicaciones Webmejorar las capacidades de navegación a través de laspáginas Web, manteniendo la compatibilidad con losprincipales navegadores del mercado.

Así, mediante estos componentes, tendremos carac-terísticas tan poco comunes en las aplicaciones Web comodrag & drop, menús interactivos, scroll de contenidos, des-plazamiento y alineación de controles, entre otros.

Cabe destacar que aunque son componentes depago, podemos utilizar una versión de prueba duran-te 30 días y que si finalmente nos decidimos por com-prarlos además de la licencia de uso también nos pro-porcionan todo el código fuente de estos componen-tes, con las ventajas que esto supone. También inclu-ye numerosos ejemplos de cómo utilizar cada uno delos componentes, que ofrecen mucha funcionalidad yson bastante sencillos de programar.

La ultima versión de Component Art Web UI estáformada por los siguientes componentes:

MenuEste componente para crear menús se

basa en XML y CSS, de forma que podemospersonalizar los menús de nuestros desarro-

llos Web sin necesidad de volver a compilar.Tan solo modificando el XML que define nuestro

menú podemos modificar el contenido y modificandola hoja de estilos CSS podremos modificar su aspecto.

Pero, por supuesto, si queremos programar nues-tro menú disponemos de eventos de servidor, parapoder desarrollar las acciones que queremos que eje-cute cada una de las opciones de nuestro menú.

En cuanto a la personalización del menú, nos ofre-ce una gran variedad de posibilidades como menús

contextuales, teclas de acceso rápido, inserción de ico-nos en las opciones de menú, submenús anidados ynumerosas posibilidades de diseño.

Además, los menús que generamos son compatibles,como el resto de componentes, con los principales nave-gadores como Internet Explorer, Netscape, Mozilla,Safari y Konqueror, entre otros.

TreeViewEste componente merece la pena que le

dediquemos una especial atención, ya que ofre-ce unas posibilidades de interactuar con él que

no suelen ser habituales en un componente para Web.Si bien se trata de un componente clásico que nos

permite mostrar una lista de cosas en forma de árbol quese puede ir desplegando por nodos, las características deeste componente lo hacen especialmente atractivo paracrear un interfaz de usuario interactivo.

Este TreeView nos permite por ejemplo arrastrar ysoltar cualquiera de sus nodos para cambiarlo de locali-zación dentro del árbol. También nos permite cambiarel nombre de cualquiera de sus nodos y todo esto sintener que recurrir a recargar la página. Así como otras

Pedro Pozo

dnm.laboratorio.net

<< Component Art Web UI 2.1

Pedro Pozoes redactor de dotNetManía. Es

es consultor e-Bussines.Ingeniero Técnico Informático

de Sistemas y Webmaster del portal para desarrolladores

.NET Framework Clikear.com

Componente Menu

Page 55: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET ... · con VB.NET y C#. ¡Mi madre es un Singleton! 46-48 Siguiendo con el tema del último artículo, volvemos a tratar

dotN

etM

anía

<<

55

dnm.laboratorio.net<<

característicascomo teclas deacceso rápido,posibilidad deutilizar planti-llas, inclusión deiconos y di-ferentes efectospara expandir ycerrar losnodos.

La carga dedatos del árbol

es muy sencilla, pudiendo hacerlo a tra-vés de un enlace a una base de datos, a tra-vés de XML o simplemente programán-dolo a gusto del desarrollador.

NavBarCon este componente

podremos generar menús, alestilo de los menús desplega-

bles que ofrece Outlook. Disponemos devarias opciones y cuando seleccionamos

alguna de esasopciones se nosdespliega una lis-ta desplegableque puede ser unsencillo texto quepuede ir acom-pañado con ico-nos y diseñosmás complejos.

Cabe desta-car que la crea-ción del conteni-do de este com-ponente puedetener como ori-

gen una consulta a una base de datos, unfichero XML o una programación per-sonalizada.

TabStripSe trata del típico control

de pestañas que nos podemosencontrar en numerosas apli-

caciones Windows para clasificar con-tenidos de un mismo formulario, peropara aplicaciones Web.

Con este componente podremospersonalizar hasta el último detalle delas pestañas, pudiendo incluir gráficos,modificar tamaños y colores, colocán-

dolas en horizontal o vertical e inclusoañadirles scroll.

También nos proporcionan numero-sos ejemplos que nos permitirán utilizardiseños ya prefabricados, y la posibilidadde incluir cualquier componente dentrodel TabStrip para personalizarlos.

MultiPageEste componente sirve

para generar varias subpági-nas que están incluidas en

una únicapágina, yque pudenser mos-tradas encualquiermomentoactivándo-las desde lapágina quelas con-tiene.

Este componente es similar al con-trol multipágina que ya pudimos ver enlos IE WebControls. Cabe destacar quelos controles de este componente pue-den ser cargados y accedidos directa-mente desde la página Web sin necesi-dad de usar el método FindControl.

SiteMapEste componente nos per-

mite crear un mapa de nuestraWeb basándose en XML. Los

diseños que nos ofrece son muy variadosa través de plantillas predefinidas, aunquetambién se puede crear un diseño perso-nalizado con hojas de estilo CSS e iconos.

RotatorEste componente nos per-

mite crear una rotación de con-tenidos en una página Web sin

necesidad de recargar la página, ni de plug-ins. Tan solo utilizando HTML, Javascripty ASP.NET podemos obtener unos efec-tos realmente interesantes en los quepodemos ver rotar desde banners publi-citarios hasta contenidos con texto.

Muy útil cuando se quieren ponercontenidos que van rotando de forma queaprovechamos un pequeño espacio de

n u e s t r aWeb parap o d e rm o s t r a rvarios con-t e n i d o sque vancambiandoen interva-

los de tiempo predefinidos.Los diseños que nos permite crear son

muy variados y todos ellos fácilmente con-figurables a través de las propiedades delcomponente. En cuanto a los contenidosse pueden cargar a través de un enlace auna base de datos, mediante un XML omediante programación.

SnapEste componente permite

definir zonas donde poderposicionar nuestros controles,

incluyendo las opciones de movimien-to, arrastrar y soltar, alinearlos y cam-biar su tamaño, entre otras.

ConclusiónSi queremos

crear un interfazde usuario profe-

sional para nuestras aplicaciones Web quepermita al usuario tener un entorno simi-lar al de una aplicación Windows,Component Art Web UI nos ayudará engran medida en esta labor. Estos compo-nentes nos ofrecen la posibilidad de cre-ar una capa de presentación completa,interactiva y amigable para el usuario ymuy sencilla de crear y mantener para elprogramador.

Quizá se echa en falta una versiónlight gratuita, pero en este caso la cali-dad de estos componentes justifica suprecio.

Componente TreeView

Ficha técnicaNombre Component Art Web UI

Versión 2.1

Fabricante Component Art

Web http://www.componentart.com

Categoría Componentes

Precio A partir de 499$

Valoración

Componente NavBar

Componente MultiPage

Componente Rotator

Page 56: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET ... · con VB.NET y C#. ¡Mi madre es un Singleton! 46-48 Siguiendo con el tema del último artículo, volvemos a tratar

❑ Deseo suscribirme a dotNetManía por un año (11 números) por un precio de 60,00€ IVA incluido y recibir el CDVolumen 1 con los 11 primeros ejemplares en formato PDF de alta calidad de forma gratuita.

❑ Deseo que me envíen los números atrasados marcados por un precio de 6,00€ IVA incluido cada uno.

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

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

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

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

Firma y/o sello

a de de 20

DATOS DE ENVÍO

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

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

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

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

Puede enviar sus datos por Fax al 91 499 13 64, o por teléfono al 91 666 74 77,o por email a la dirección [email protected], o también puedeenviarlos por correo postal a la siguiente dirección:

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

Nº4 ❑ Nº5 ❑ Nº6 ❑ Nº 7 ❑ Nº9

❑ Nº11 ❑ Nº12 ❑ Nº13 ❑ Nº14

❑ Nº10

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

AGOTADO

Oferta válida sólo para España hasta el 30 de septiembre de 2005 o hasta agotar existencias

Aún está a tiempo

❑ Nº8

❑ Nº15 Nº16 Nº17

AGOTADO

AGOTADO

Page 57: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET ... · con VB.NET y C#. ¡Mi madre es un Singleton! 46-48 Siguiendo con el tema del último artículo, volvemos a tratar

dotN

etM

anía

<<

57

<<

Visual Studio HacksJames Avery

Editorial: O'Reilly ISBN: 0596008473Páginas: 478Publicado: Marzo, 2005Idioma: Inglés

Avery es colaborador habitual de MSDN Magazine y ASP Today, además de autor de variasobras para las editoriales Wrox y Microsoft Press.

Se trata de un libro sobre trucos y optimización de uso del IDE de Visual Studio. Aunque sólosu temática ya lo convierte en suficientemente interesante, es raro que cualquiera que utilice elIDE como herramienta habitual no encuentre un montón de cosas útiles, de esas que no mira-mos en los manuales y que nos hubieran ahorrado horas de trabajo. Recorre todo lo que es posi-ble hacer con el IDE, desde la organización de proyectos hasta las extensiones o add-ins, pasan-do por el editor, la depuración, personalización del entorno, trucos de optimización, e inclusoVisual Studio Tools for Office. Como curiosidad, en su sitio Web, pueden descargarse pequeñosfragmentos en formato PDF (ver http://www.oreilly.com/catalog/visualstudiohks)

Hackers de sitios WebJoel Scambray y Mike Schema

Editorial: McGraw-HillISBN: 8448133781Páginas: 412Publicado: Enero, 2003Idioma: Castellano

Aunque no es la temática habitual de desarrollo, no podemos por menos de recomendar estaobra, ahora que la seguridad está cobrando cada vez más importancia en la construcción de lasaplicaciones. Scambray, que ya había colaborado anteriormente en varias obras del mismo esti-lo, analiza esta vez la problemática de la construcción de aplicaciones Web seguras, desde el pun-to de vista del hacker que las ataca. Cuenta con la colaboración del asesor para seguridad MikeSchema, especialista en soluciones seguras para grandes corporaciones en Foundstone Inc.

La obra recorre muchos aspectos de seguridad práctica, tanto desde el punto de vista del servi-dor Web, como del cliente. Los mecanismos de autenticación, la autorización, ataques a la admi-nistración de estado de la sesión, validaciones, SQL-Injection, y muchos otros, concluyendo conel análisis de un par de casos reales y unas valiosas listas de comprobación de seguridad antes dela implantación.

dnm.biblioteca.net<<

dnm.biblioteca.net

Page 58: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET ... · con VB.NET y C#. ¡Mi madre es un Singleton! 46-48 Siguiendo con el tema del último artículo, volvemos a tratar

Google desarrolla un add-in gratuito para MicrosoftWord que permite la edición y publicación de blogs.El Add-in se intala (una vez descargado gratuitamente del sitiohttp://buzz.blogger.com/bloggerforword.html), fácilmente y una

vez activo, presenta un menú adi-cional dentro de Word, con opcio-nes de edición y publicación, guar-dado, control de borradores. Eso sí,requiere la creación de una cuentapersonalizada en Blogger y comopuede verse en la pantalla capturadadespués de su instalación, puede rea-lizarse una previsualización del códi-go HTML que se genera, previo asu publicación.

Remora USB file guard Interesante utilidad gratuita que rea-lizar copias de seguridad delos datos en USB con com-presión/descompresiónautomática, y varias op-ciones de sincronización. Se puede descargar dehttp://www.richskills.com/pro-ducts/6/freeversion.asp

Presentado por primera vez un dispositivo de pantalla en 3D

La empresa IO2 Technology (cuya Web estuvo colapsadadesde pocos minutos después de producirse el anuncio ofi-cial), ha presentado al público por primera vez un dispo-sitivo de pantalla en 3 dimensiones. Los principios en losque se basa su funcionamiento son los del holograma láserque proyecta imágenes o vídeo proveniente de TV, DVDu ordenadores. Permite a las aplicaciones interactivas quelo manejen utilizando los dedos, en lugar del ratón. Paramás datos, ver el sitio de IO2: http://www.io2technology.com/dojo/204/v.jsp?p=/home. La noticia es independiente delanuncio por parte de Japón de una iniciativa a nivel nacio-

nal para crearun sistema deTV Digitalque permitaver, tocar eincluso dispo-ner de la ca-pacidad de "oler" ambientes virtuales, en las que estánimplicados el propio gobierno japonés, algunas de las másrelevantes universidades niponas y compañías del volumende Matsushita y Sony (http://news.com.com/Japan+pro-ject+aims+to+create+3D+TV+by+2020/2100-1041_3-5839341.html?tag=nefd.top)

dotN

etM

anía

<<

58

no

tici

as.

no

tici

as

dnm.desvan<<

Marino Posadas

Un vistazo a la seguridad en ASP.NET 2.0: Esa es la pro-puesta del artículo que J.D. Meier, Alex Mackman, BlaineWastell, Prashant Bansode, Andy Wigley, KishoreGopalan firman para MDSN y que está accesible en el sitiohttp://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnpag2/html/PAGPractices0001.asp. Un extenso docu-mento que ha obtenido la mejores calificaciones de todossus lectores, y que está siendo recomendado por los sitiosmás populares.

Documentos y código en la Red Utilidades del mes

A Trustworthy Vision for Computing: El sitio Web oficialde Microsoft donde se explica la forma en que la com-pañía está siguiendo la iniciativa de Informática Fiable, ylas prácticas que se llevan a cabo y se recomiendan o exi-gen en todos sus desarrollos. Disponible enhttp://www.microsoft.com/mscorp/twc/overview.mspx

EssentialXML Quick Reference: Guía rápida en for-mato PDF de la, más extensa, obra de Don Box y AaronSkonnard, firmada por éste último y Martin Gudgin.Puede descargarse desde http://65.214.43.45/books/addi-sonwesley/EssentialXML/index.tss

The Server Side.NET: Unode los sitios que desde su apari-ción acapara más visitas, movi-

miento y noticias de actualidad sobre .NET. Disponible enhttp://65.214.43.45/index.tss.

Sitio Web de Rubén Vigón: Excelente sitio de este MVPde Visual Basic .NET con montones de artículos interesan-tes, recursos, código fuente, tutoriales, manuales y muchomás sobre .NET en general y VB.NET en particular.http://www.mvp-access.com/rubenvigon

Sitios recomendados

Page 59: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET ... · con VB.NET y C#. ¡Mi madre es un Singleton! 46-48 Siguiendo con el tema del último artículo, volvemos a tratar
Page 60: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET ... · con VB.NET y C#. ¡Mi madre es un Singleton! 46-48 Siguiendo con el tema del último artículo, volvemos a tratar