Vous êtes sur la page 1sur 129

DESARROLLO DE AGROMUTUA.

WEB CON LINQ

Alumno: Alejandro Medina Baeza Director: Vicente Pelechano Ferragud

TESINA DE MSTER DE INGENIERA DEL SW, MTODOS FORMALES Y SISTEMAS DE INFORMACIN


Universidad Politcnica de Valencia

NDICE
1. 2. Presentacin de la tesina Especificacin de Agromutua.Web 2.1. Introduccin 2.1.1. Propsito 2.1.2. mbito 2.1.3. Definiciones, acrnimos y abreviaturas 2.1.4. Referencias 2.1.5. Visin global 2.2. Descripcin general 2.2.1. Perspectiva del producto 2.2.2. Funciones del producto 2.2.3. Caractersticas del usuario 2.2.4. Restricciones generales 2.2.5. Supuestos y dependencias 2.3. Requisitos especficos 2.3.1. Requisitos de interfaces externos 2.3.2. Requisitos funcionales 2.3.3. Requisitos de eficiencia 2.3.4. Restricciones de diseo 2.3.5. Atributos Arquitectura y tecnologas 3.1. Arquitectura del proyecto 3.1.1. La interfaz 3.1.2. La capa de servicios o lgica de negocio 3.1.3. Persistencia 3.2. Tecnologas 3.2.1. Entorno de desarrollo: Visual Studio 2008 3.2.2. Servidor Web: IIS 3.2.3. Sistema Gestor de Base de Datos: SQL Server 2005 3.2.4. Herramientas para aumentar el rendimiento en el desarrollo 3.2.5. Lenguajes de programacin 3.2.5.1. JavaScript 3.2.5.1.1. AJAX 3.2.5.2. ASP.NET 3.2.5.3. C# 3.0 y VB.NET LINQ 4.1. Qu es LINQ? 4.1.1. LINQ como un conjunto de herramientas y extensiones del lenguaje 4.1.2. Orgenes y objetivos del proyecto LINQ 4.1.2.1. Los objetivos del proyecto LINQ 4.1.2.2. Un poco de historia 4.2. Evolucin en los lenguajes VB.NET y C# 4.2.1. El ejemplo de gua 4.2.2. Variables locales implcitamente tipadas 4.2.3. Inicializadores de objeto y coleccin 4.2.4. Expresiones Lambda

3.

4.

Pgina | 2

5.

6.

7.

8.

4.2.5. Mtodos de extensin 4.2.5.1. Crear un mtodo de extensin de ejemplo 4.2.6. Tipos annimos 4.3. Bloques de construccin LINQ 4.3.1. Secuencias en LINQ 4.3.1.1. La interfaz IEnumerable 4.3.1.2. Ejecucin diferida de consulta 4.3.2. Operacin de consulta y expresiones de consulta 4.3.3. Arboles de expresin 4.3.4. IQueryable, otra interfaz para realizar la ejecucin diferida 4.3.5. LINQ el marco de .NET, las DLL y espacios de nombres 4.4. LINQ To Objects 4.4.1. LINQ con colecciones de memoria 4.5. LINQ To SQL 4.5.1. Mapear LINQ to SQL 4.5.2. Interaccin de LINQ to SQL con la BD 4.5.3. Carga de datos en memoria 4.5.4. Actualizacin y borrado de datos 4.5.5. Ampliar la capa de negocio LINQ en la arquitectura multicapa 5.1. LINQ to SQL y la capa de acceso a datos 5.1.1. La arquitectura tradicional de 3 capas 5.1.2. La capa de acceso a datos y LINQ to SQL 5.1.2.1. Utilizar LINQ to SQL como capa de acceso a datos 5.1.2.2. Utilizar LINQ to SQL como capa de acceso a datos real 5.1.3. LINQ to XML y LINQ to Objects en la arquitectura Mejoras y futuros avances 6.1. Aspectos a mejorar en LINQ 6.1.1. Problemas comunes 6.1.2. El desajuste del paradigma 6.2. El futuro de LINQ 6.2.1. Visual Studio 2010 y el Framework .NET 4 6.2.2. Parallel LINQ (PLINQ) 6.2.2.1. Los mtodos y clases de Parallels Extensiones 6.2.2.2. Uso de PLINQ 6.2.3. ADO.NET Entity Framework 6.2.3.1. LINQ to Entities 6.2.3.2. Diferencias entre LINQ to SQL y LINQ to Entities Conclusiones 7.1. La experiencia propia con LINQ 7.2. Funcin realizada en el proyecto Agromutua.Web Bibliografa

Pgina | 3

AGRADECIMIENTOS
Quiero dar las gracias a Prodevelop SA por brindarme la posibilidad de desarrollar la tesina en la empresa y ampliar mis conocimientos profesionales. Lugar donde he encontrado a compaeros que me han realizado la estancia muy cmoda y agradable desde el primer da y que nunca han dudado en ayudarme en la medida de lo posible. Quiero agradecer tambin la indispensable ayuda del tutor de la tesina, Vicente Pelechano, l ha sido el que me ha guiado y el que ha administrado mis esfuerzos para llegar a conseguir escribirla y alcanzar los objetivos fijados. Y sobretodo quiero dar las gracias a mi familia, mis padres Manolo y Beln y a mi novia Sandra por estar siempre cerca de m, apoyndome, ayudndome en todo y dndome la oportunidad de ser lo que hoy soy. Gracias a todos.

Pgina | 4

1. PRESENTACIN DE LA TESINA
Durante el desarrollo de la tesina Desarrollo de Agromutua.Web con LINQ del Mster de Ingeniera del Software, Mtodos Formales y Sistemas de Informacin de la UPV se va a explicar lo que ha supuesto para los desarrolladores de lenguajes de Microsoft (VB, C#, ASP.Net, etc.) la aparicin del nuevo Framework 3.5 y en concreto la nueva caracterstica de tratamiento de datos: LINQ. Los datos, ya sean tablas en una base de datos, objetos en memoria o en formato XML siempre han sido una de las tareas ms complejas y costosas para los programadores, incluyendo los desarrolladores de .NET que han tenido que lidiar mucho tiempo con costosas interfaces ADO para la interaccin entre las aplicaciones y las bases de datos. Con LINQ se descubrir una forma de acceder y interaccionar con los datos sencilla y muy similar a la sintaxis conocida SQL, alcanzando una gran integracin entre lenguaje y datos. Aqu es donde encaja LINQ to Objects, LINQ to XML y LINQ to SQL, entre otros tipos LINQ. LINQ, abreviatura de Language Integrated Query se incluye ya por defecto en VS2008 (viene con el .NET Framework 3.5) y proporciona una interfaz de interaccin entre la programacin y los datos, de esta forma va a permitir interaccionar con la base de datos y otros almacenes de datos de una forma ms sencilla y menos laboriosa que antes, incluyendo consultas directamente en el cdigo y nuevas caractersticas. Consultas formadas por expresiones parecidas al SQL estndar (Select, From, etc.) y incluyendo nuevas palabras reservadas que siguiendo un conjunto de reglas permitirn realizar las consultas en el propio cdigo de la aplicacin. Con LINQ se deja de lado las tediosas y difciles tareas de mantenimiento que tardaban eternidades en resolverse y que solo contribuan a generar problemas en el futuro con cualquier cambio en la base de datos. As LINQ nos trae nuevas caractersticas del lenguaje VB.NET y C# aadiendo funcionalidad y reduciendo lneas de cdigo (LINQ to Objects), pudindose complementar y orientar a diferentes tipos de LINQ como en el que se centra ms la tesina que es que tiene que ver con la interaccin con la base de datos (LINQ to SQL). Mapeando de manera sencilla la base de datos se puede realizar consultas integradas en el cdigo y manipular las colecciones de datos. El objetivo que se ha perseguido con la elaboracin de este documento ser analizar, comparar y ensear el funcionamiento de LINQ, sus ventajas, sus puntos dbiles y las caractersticas que nos depara en su evolucin en el futuro basndonos en la experiencia que se ha brindado al poder trabajar en un proyecto empresarial como es el desarrollo de una aplicacin desarrollada por la empresa Prodevelop S.A. y de la cual sirve tanto de ejemplo, como de aprendizaje, Agromutua.Web. Una aplicacin web desarrollada en ASP.NET para la entidad aseguradora Agromutua S.A. y para la cual se gestionan los seguros de las plizas, documentos adjuntos y los datos derivados de todos ellos. El captulo 2 servir de especificacin de requisitos de la aplicacin que se desarrolla. De esta forma se mostrarn descripciones, requisitos y una visin global de lo que es Agromutua.Web. El siguiente captulo se analizar todos los aspectos tecnolgicos empleados, la arquitectura vieja y la nueva arquitectura con la aparicin de LINQ as como todas las tecnologas, lenguajes y herramientas que se emplean en la implementacin del programa. A partir del captulo 4 se entra de lleno en LINQ, el captulo 4 concretamente nos presenta LINQ. La definicin, el proceso que se ha llevado a cabo para llegar a LINQ y sus caractersticas, la evolucin en los lenguajes VB.NET y C#, los mtodos de extensin, los operadores y secuencias ms comunes. Acompaados de ejemplos de la base de datos de Agromutua.

Pgina | 5

Dentro del propio captulo 4, los puntos 4.4 y 4.5 presentan LINQ to Objects que servir de base y LINQ to SQL que es el tipo de LINQ ms importante dentro de esta tesina y hacia el que ms nfasis se ha puesto en explicar y hacer ejemplos. Es tan importante como para dedicarle el captulo siguiente, el capitulo 5 para comentar el debate existente por la aparicin de LINQ to SQL y su efecto en las arquitecturas de los programas. La fcil utilizacin de LINQ to SQL, puede llevar al programador a olvidar la existencia de la arquitectura multicapa y en concreto la existencia de una capa persistencia, en este captulo se expondrn las diferentes opciones que se pueden adoptar. El captulo 6, es un captulo de investigacin y muestra las novedades que aparecern o que son muy recientes y que todava no se han incorporado a Agromutua. Se explicar las caractersticas bsicas de PLINQ que nos proporcionar sacarle mayor rendimiento a las CPU con ms de un ncleo y lanzar consultas en paralelo. Y tambin se presentar el ADO.NET Entity Framework que soluciona algunos de los problemas de LINQ to SQL, todo ello ya disponible en lo que ser en nuevo entorno Visual Studio 2010. El ltimo captulo, es el captulo de las conclusiones y se detalla la experiencia propia con LINQ y el trabajo desarrollado dentro del proyecto.

Pgina | 6

2. ESPECIFICACIN DE AGROMUTUA.WEB
El captulo 2 va enfocado a la especificacin de requisitos del proyecto. Para la realizacin de la especificacin de requisitos de software (ERS) se ha seguido el estndar IEEE Std. 830-1998 con el que se persigue definir cules son los requerimientos y funcionalidades que debe tener Agromutua.Web.

2.1. INTRODUCCIN
A continuacin se describirn los requerimientos y las funcionalidades de Agromutua.Web.

2.1.1. PROPSITO
El propsito de esta ERS es definir cules son los requerimientos que debe tener Agromutua.Web para que realice su correcto funcionamiento para contratar plizas y redactar otros tipos de documentos de seguros agrcolas. La aplicacin ha sido encargada por Agromutua S.A. para llevar a cabo todo el control de las plizas, pagos, clculos, etc. a la empresa de desarrollo de aplicaciones software Prodevelop S.A.

2.1.2. MBITO
La aplicacin se conoce por el nombre de Agromutua.Web ya que es una versin posterior de otra aplicacin con la que se trabajaba antes denominada WinCamp y a diferencia de esta la nueva versin trabaja en un entorno web mientras que la antigua era de escritorio y programada en Visual Basic 6. La razn de que la nueva aplicacin sea web es dada la necesitad de centralizar los datos y trabajar con una base de datos comn entre usuarios y aseguradora, como se ver ms adelante en la ERS existen Pgina | 7

personas intermedias entre la entidad aseguradora y el asegurado que tienen que disponer de los datos actualizados en cualquier momento y en cualquier lugar para calcular y redactar correctamente los seguros con sus correctas variedades, cultivos, precios, subvenciones, etc. Agromutua.Web es una aplicacin web de gestin de seguros agrarios que permite a los mediadores de Agromutua contratar los seguros de los agricultores y realizar otros documentos adjuntos. Para realizar el clculo se necesitan datos de cultivos y aos anteriores que los proporciona la misma entidad que se encargar de validar una vez hechas las plizas, Agroseguro. En el grfico de a continuacin se muestra el funcionamiento bsico de la gestin de una pliza. Los encargados de hacerlas, los mediadores, colaboradores y tomadores remiten las plizas de los asegurados, los agricultores que aseguran sus parcelas, a Agromutua que se encarga de realizar los clculos y validaciones y as poderse remitir a Agroseguro para que la valide definitivamente y pueda abonarla el agricultor. El mbito que controla el programa incluye hasta el envo de las plizas de Agroseguro.

2.1.3. DEFINICIONES, ACRNIMOS Y ABREVIATURAS

Pgina | 8

Agroseguro: entidad encargada de validar las plizas Agente. Entidad a travs de la cual se realizan plizas. Las cooperativas hacen siempre plizas a travs de un agente, nunca directamente con la compaa de seguros. Es normal que una entidad (Uteco, p.e.) tenga a distintos usuarios realizando plizas con el mismo identificador de agente. Asegurado. Persona fsica o jurdica titular de la produccin y que en defecto del tomador, asume los derechos y obligaciones del contrato que firme (normalmente, la pliza). Asegurador. Persona jurdica que asume el riesgo pactado con el asegurado. Colectivo (documento de seguro colectivo). Ver Plizas asociadas a colectivo.

Condicionado. Conjunto de valores que se utilizan para realizar el clculo del valor de las plizas. Agroseguro lo enva anualmente, aunque existen ciertos casos puntuales en que llegan una vez est listo y se incorpora al condicionado del ao actual. Lnea de cultivo. Agrupacin lgica de cultivos con el objetivo de establecer condiciones en las plizas que se creen. Normalmente Agroseguro entrega anualmente (por plan) un conjunto de documentos de normativa, el condicionado y formularios tipo para cada lnea de cultivo. Ejemplos: lnea 4, la uva; lnea 43, pimiento; lnea 11, tomate. Plan. Ao natural sobre el que se trabaja (2006, 2007, etc.). Pliza. Documento donde se formaliza el contrato entre el tomador del seguro y el asegurador. En ella se establecen todas las condiciones que regulan el contrato. Una pliza es vlida si se ha firmado por ambas partes y se ha abonado el coste del seguro. Agromutua tiene capacidad de hacer plizas agrcolas y de ganado. Las plizas a su vez se subdividen en: o Plizas colectivas. Es una pliza a la que se subscriben un conjunto de asegurados y es administrada por uno o varios tomadores del seguro. Las plizas colectivas tienen un conjunto de condiciones generales y condiciones excepcionales. Ambos estn ligados a la lnea de cultivo. o Plizas asociadas a colectivo. Conjunto de plizas individuales que estn ligadas a una pliza colectiva y que por tanto se acogen a los trminos definidos en la pliza colectiva. o Plizas Individuales. Son plizas donde se establece una relacin contractual entre el tomador y un solo asegurado. Agromutua nunca realiza plizas individuales, siempre realiza asociadas al colectivo. Remesa. Documento de pago de una o varias plizas a Agroseguro. El pago siempre se realiza mediante una remesa, incluso aunque sea para pagar una nica pliza. Una pliza se da como pagada si existe su remesa correspondiente. Tomador. Persona fsica o jurdica que administra una pliza. Tiene responsabilidad legal sobre la misma. La funcin del tomador es proteger al usuario. Suelen ser entidades con un representante legal, que tambin se especifica. Usuario. Persona fsica que utiliza el programa de Agromutua para poder operar con entidad.

2.1.4. REFERENCIAS
Los siguientes documentos propiedad de Prodevelop S.A. se toman como referencias del presente proyecto: Especificacin funcional Agromutua.web. Definicin de las funcionalidades incluidas por Agromutua basado en las funcionalidades vigentes de WINCAMP. Manual de usuario de funcionalidades aplicacin WINCAMP. Oferta 2006-12020, Desarrollo de sistema Agromutua.web. Documento de glosario de trminos y abreviaturas a utilizar en el proyecto. Impresiones de Pantallas y Listados cedidos por Agromutua a Prodevelop.

Pgina | 9

2.1.5. VISIN GLOBAL


La misin del proyecto es definir un sistema de informacin que gestione la totalidad de la problemtica en la contratacin de Seguros Agrarios de Agromutua. La solucin pasa por un desarrollo en ASP .NET Framework 3.5 en el cual los usuarios finales podrn acceder remotamente desde sus oficinas y trabajar normalmente igual que lo estn haciendo hasta ahora. Actualmente Agromutua dispone de un sistema cliente-servidor Wincamp que incorpora toda la funcionalidad necesaria para el correcto funcionamiento del negocio de Agromutua desarrollado en Visual Basic 6.0, donde la aplicacin reside en cada una de las oficinas que trabaja con Agromutua, existiendo programas de sincronizacin de datos entre las oficinas y Agromutua. El nuevo sistema Agromutua.Web, viene a sustituir a Wimcamp, realizando la mayora de la funciones de Wincamp como quedar especificado en el punto de descripcin general del producto.

Pgina | 10

2.2. DESCRIPCIN GENERAL


A continuacin se dar a conocer una visin de las principales funcionalidades de Agromutua.Web

2.2.1. PERSPECTIVA DEL PRODUCTO


Agromutua.Web es una herramienta para realizar las gestiones necesarias para contratar plizas agrcolas, se trata de un programa de gestin nico para Agromutua. Existen otras entidades aseguradoras que disponen de programas que realizan la misma funcionalidad pero implementados por otras empresas y con diferentes tecnologas.

2.2.2. FUNCIONES DEL PRODUCTO


A continuacin se van a detallar a modo de esquema los aspectos de la gestin ms relevantes. En el apartado 2.3.2 se vern sus funciones y los datos necesarios. La distribucin de este punto de la especificacin ser de acuerdo al men superior que nos lleva a las tres grandes pantallas de la aplicacin: Contratacin, Listados, Administracin. Y se proporciona un prototipo de pantalla para ayudarse en la explicacin y observar la distribucin de los contenidos. Contratacin La contratacin es el inicio en Agromutua.Web para los usuarios de la aplicacin que contratan los seguros. Se caracteriza por servir de acceso directo a las principales funcionalidades del programa. En las dos columnas que se observan se distribuyen los accesos directos, en la parte izquierda los accesos directos a altas nuevas de documentos y los listados de estos, y en la parte derecha el acceso directo a los ltimos de los documentos realizados por el propio usuario.

Pgina | 11

Colectivo o Listado o Aadir/Actualizar/Borrar Solicitudes/Plizas o Clculo o Aadir/Actualizar/Borrar o Parcelas Aadir/Actualizar/Borrar parcelas o Realizar pago o Aadir/Actualizar/Borrar documentos adjuntos Siniestro Seguro Complementario Reduccin de capital Solicitud de modificacin Designacin de beneficiario Modificacin de cosecha Remesas o Listado o Aadir/Actualizar/Borrar Asegurado o Listado o Aadir/Actualizar/Borrar

Listados Los listados son estadsticas y agrupaciones de datos que proporcionan datos estadsticos de contratacin de plizas, cultivos, variedades, subvenciones, etc. Estos listados son conocidos como reports y son documentos impresos en PDF. Cada listado despliega una ventana emergente que configura los datos a mostrar.

Pgina | 12

o o o o o o o o o o o o o

Estadsticas Plizas por colaborador Relacin de colaboradores Etiquetas Parcelas por agente y colectivo Resumen total variedad/prima pagada Diferencias cargo tomador, transferencia Subvenciones CC.AA Importe de remesa Plizas con incidencias en C.A.V. Relacin de siniestros Produccin Importes de recibidos por colectivo

Administracin La administracin de la aplicacin ser llevada a cabo por las personas encargadas del mantenimiento en las oficinas de la entidad aseguradora de Agromutua SA. Estos usuarios con permisos especiales tendrn acceso a los datos de configuracin y los datos necesarios para realizar clculos de los seguros, as como otras tareas propias de la administracin como la exportacin/importacin de datos o el acceso a registro de usuarios de Agromutua (Mediadores, Tomadores y Colaboradores). El administrador de la aplicacin es el encargado del envo de las plizas y los documentos adjuntos a Agroseguro, que lo har desde una pantalla situada en este men.

Pgina | 13

Actores del seguro o Tomador Listado Aadir/Actualizar/Borrar o Mediador Listado Aadir/Actualizar/Borrar o Colaborador Listado Aadir/Actualizar/Borrar o Asegurado Listado Aadir/Actualizar/Borrar o Usuario Listado Aadir/Actualizar/Borrar Maestros o Lneas de seguro Listado Aadir/Actualizar/Borrar o Gestin de contadores Listado Aadir/Actualizar/Borrar o Cambio de contrasea o Envos a Agroseguro Registro de envo Envo manual de pliza y remesa Envo manual de siniestro Configurador del planificador o Exportacin de produccin Generar fichero de produccin Producciones aseguradas o Importacin de renovable o Comisiones

2.2.3. CARACTERSTICAS DEL USUARIO


Tendrn acceso a Agromutua.Web solo usuarios autorizados con su login y contrasea, proporcionados por Agromutua S.A.. En la aplicacin se identifican dos tipos de usuarios: administradores y agentes intermedios. Los agentes intermedios son usuarios con permisos de Agromutua S.A. para realizar plizas y clculos en la aplicacin, teniendo acceso a todas las funciones descritas en el men principal del punto 2.2.2. Los administradores dispondrn de control total de la aplicacin (contratacin y administracin del punto 2.2.2) y sern los encargados de mantener los datos y la consistencia de estos.

Pgina | 14

La utilizacin de Agromutua.Web no requiere ningn tipo de conocimiento avanzado de informtica para los usuarios normales, siendo nico requisito estar familiarizado con la navegacin por internet y la utilizacin del navegador web dando por supuesto que cualquier usuario conoce el propio negocio.

2.2.4. RESTRICCIONES GENERALES


La aplicacin trabaja sobre dos servidores interconectados, uno sirve de repositorio de aplicaciones y otro de repositorio de datos. Es importante disponer de un potente servidor de datos debido a que existen pantallas que necesitan de una carga rpida de datos puntuales existentes en tablas con un nmero enorme de registros en el menor tiempo posible, sobrecargando la red en ocasiones un nmero elevado de usuarios. Adems de un potente servidor se acompaa de tecnologas que hacen ganar tiempo de carga como Javascript y AJAX trabajando los datos en pequeas peticiones asncronas desde el cliente. La aplicacin se caracterizar por un gran nivel de seguridad de los datos, y se tendr muy en cuenta la visualizacin correcta por parte de los usuarios identificados. Por ltimo se hace necesario un usuario que tenga acceso a la gestin de todos los contenidos, este superusuario ser el administrador de Agromutua.Web y trabajara desde la sede de la mutua resolviendo los problemas surgidos durante la contratacin. En lo que respecta al navegador web, se dar soporte para trabajar con Internet Explorer 7 y Mozilla Firefox 2. El resto de navegadores quedan, en principio, excluidos de la propuesta, pese a que se entiende que la mayora de ellos podrn ejecutar la aplicacin en la medida en que se cian a los estndares establecidos en Internet. Se asume la configuracin por defecto de cada uno de ellos como plataforma estndar de desarrollo cliente. Esto implica, niveles de seguridad medios para internet, JavaScript habilitado, cookies habilitadas y restricciones por defecto en cuanto al uso de ventanas emergentes y control de descargas. Se intentar que la aplicacin sea, en la medida de lo posible, compatible con XHTML 1.0 Transitional y CSS de nivel 2, segn los estndares del W3C (http://www.w3.org/TR/xhtml1/, http://www.w3.org/TR/REC-CSS2/). En vistas a la escalabilidad de la aplicacin, la reduccin de trfico de datos y la mejora de la experiencia del usuario, el cliente deber tener Javascript habilitado y este seguir los estndares del ECMA referentes a ECMAScript. Los estndares propuestos se intentarn seguir siempre y cuando no resulten en una prdida de funcionalidad de la aplicacin. Se recomienda una resolucin mnima de 1024x768 para las pantallas cliente, entendiendo que es el mnimo para que muchos de los formularios definidos en el proceso de anlisis quepan en la pantalla para facilitar el trabajo. En la medida de lo posible se intentar que la aplicacin trabaje con resoluciones superiores a 1280x1024. Se establece esta ltima resolucin como lmite para las pruebas funcionales que se realizarn. Dado que casi la totalidad de tarjetas grficas del mercado lo permite, se disearn los diferentes formularios con una profundidad de color de 32bits.

Pgina | 15

2.2.5. SUPUESTOS Y DEPENDENCIAS


Existen las dependencias tecnolgicas que supone utilizar ASP.NET, requisito que el cliente pidi durante la elaboracin de la aplicacin, por eso al tratarse de una tecnologa Windows va ligada con un servidor Windows Server 2003 y una base de datos SQL Server 2005. Por otra parte, Agromutua.Web se trata de una migracin de tecnologa de escritorio a web con lo que esto supone un cambio a la hora de trabajar. La web tiene sus beneficios pero tambin inconvenientes, como la cache, los navegadores, las sesiones y otras caractersticas que supone que tanto el usuario como el administrador de Agromutua.Web deben tener en cuenta y adaptarse. Al ser web los datos estn centralizados y se recuperarn explcitamente para cada usuario identificado.

2.2.5.1 S ISTEMAS DE LOS QUE DEPENDE AGROMUTUA.WEB

El proyecto Agromutua.Web depende de los siguientes sistemas: Dbilmente del sistema informtico de Agroseguro en la recepcin de varios documentos. Del sistema WinCamp en lo que se refiere a la integracin de datos: WinCamp transmitir informacin a Agromutua.Web

2.2.5.2 S ISTEMAS QUE DEPENDEN DE AGROMUTUA.WEB

Los siguientes sistemas o proyectos dependen de Wincamp: Agromutua.Web deber generar informacin en Access para los usuarios finales que deseen integrar sus sistemas informticos propios con la informacin centralizada en Agromutua.

Pgina | 16

2.3. REQUISITOS ESPECFICOS


A continuacin se describirn detalladamente los requisitos de la aplicacin Agromutua.Web, basndonos en el estndar 830-1998, se ha elegido hacer una descripcin de la organizacin de este punto por modo de funcionamiento, en el que se describe el modo de ejecucin u operacin del sistema.

2.3.1. REQUISITOS DE INTERFACES EXTERNOS

2.3.1.1. I NTERFACES DE USUARIO

La interfaz de la aplicacin estar basada en el modelo bsqueda-listado-detalle e ir acompaada de dos componentes propios de Prodevelop SA. De tal forma se que se dispondr de un men principal de acceso a los contenidos generales:

En la parte derecha de la pantalla principal se observan los enlaces directos a las ltimas acciones que ha realizado el usuario y en la parte izquierda se muestra el men de navegacin dentro de la aplicacin, accediendo se muestra el listado que permite el filtrado y su posterior acceso al detalle del documento. Tambin se tiene la opcin directa de crear un nuevo documento.

Pgina | 17

Modelo de Bsqueda-Listado-Detalle

1.

LISTADO 3. DETALLE

2. BSQUEDA

Otros aspectos importantes de la interfaz son dos de los componentes desarrollados ntegramente para Agromutua.Web y que el usuario deber familiarizarse con ellos. Estos componentes son las Lupas y los Trabajar Con. Lupas Las Lupas son unos iconos situados al lado de cajas de textos que despliegan una ventana emergente para obtener la informacin que se busque en esta ventana. Junto con el valor que se incluir en la caja de texto viene la descripcin que se situara en la otra parte de la Lupa. Uno de los aspectos ms interesantes para este usuario es que se pueden vincular varias Lupas, muy til en determinados casos como en este ejemplo donde estn vinculados Provincia, Comarca y Municipio.

Pgina | 18

Trabajar Con Los Trabajar Con son otro componente presente en las bsquedas de los listados, que en su conjunto permiten filtrar, ordenar y exportar los datos a partir de una vista previamente preparada en la base de datos.

Pgina | 19

2.3.1.2. I NTERFACES H ARDWARE

Esta arquitectura estar formada por dos servidores: una donde se ejecutarn conjuntamente el Servidor Web y el Servidor de Aplicaciones, conforme a las recomendaciones de Microsoft y otra que ejecutar el Servidor de Base de Datos. Nombre
Servidor de Base de datos

Requisitos
Mnimo

Procesador
Dos procesadores de ncleo doble Intel Xeon 5120 a 1.86 GHz con FSB a 1066 Mhz. Intel Xeon 5130 a 2.0 GHz con FSB a 1333 Mhz.

Memoria
4 GB con FSB a 533 MHz, ampliable a 32 GB.

Conexin
Dos adaptadores de puerto Intel PRO 1GB.

Velocidad
4Mb

Almacenamiento
4 discos SAS de 146 GB a 10.000 rpm en configuracin RAID-5, expandible a 6 discos en total

Servidor de aplicaciones

Mnimo

4 GB con FSB a 667 MHz, ampliable a 32 GB.

Dos adaptadores de puerto Intel PRO 1 GB

4Mb

3 discos SAS de 73 GB a 15.000 rpm en configuracin RAID-5, expandible hasta 6 discos en total

Esta segunda aproximacin implementa una arquitectura ptima en cuanto a disponibilidad orientada al servicio, alto rendimiento y suficientemente escalable en cuanto a capacidad de proceso, mediante el uso de un clster de servidores (Server Clster). Esta arquitectura estar formada por cinco servidores: dos para ejecutar el Servidor Web y el Servidor de Aplicaciones en un clster de dos nodos, dos para ejecutar el Servidor de Aplicaciones, tambin en un clster de dos nodos y uno para mantener el disco de Quorum para los dos clster de servidor. Las dos mquinas de ambas configuraciones deben ser exactamente iguales para evitar cualquier problema de compatibilidad, mxime implementando esta arquitectura para obtener alta disponibilidad.

Nombre
Servidor de Base de datos

Requisitos
Optima

Procesador
Dos procesadores de ncleo cudruple Intel Xeon E5320 a 1.86 GHz con FSB a 1066 MHz Dos procesadores de ncleo cudruple Intel Xeon E5335 a 2.0 GHz con FSB a 1333 Mhz.

Memoria
4 GB a 533 MHz ampliable a 32 GB.

Conexin
Cuatro adaptadores de puerto Intel PRO 1 GB.

Velocidad
12Mb

Almacenamiento
4 discos SAS de 146 GB a 10.000 rpm en configuracin RAID-5 expandible a 6 discos en total

Servidor de aplicaciones

Optima

4 GB con FSB a 667 MHz, ampliable a 32 GB en total

Cuatro adaptadores de puerto Intel PRO 1 GB.

12Mb

3 discos SAS de 73 GB a 15.000 rpm en configuracin RAI-5, expandible hasta 6 discos en total

Pgina | 20

2.3.1.3. I NTERFACES S OFTWARE

S.O. Servidor Web Framework de trabajo

Windows 2003 Server R2 x32 Enterprise IIS 6.0 Microsoft .Net Framework 2.0 o superior

2.3.1.4. I NTERFACES DE C OMUNICACIONES

Agromutua.Web es una aplicacin web de gestin que se ejecuta sobre el protocolo HTTP. HTTP define la sintaxis y la semntica que utilizan los elementos software de la arquitectura web (clientes, servidores, proxies) para comunicarse. Es un protocolo orientado a transacciones y sigue el esquema peticin-respuesta entre un cliente y un servidor. A la informacin transmitida se la llama recurso y se la identifica mediante un URL. Los recursos pueden ser archivos, el resultado de la ejecucin de un programa, una consulta a una base de datos, la traduccin automtica de un documento, etc. HTTP es un protocolo sin estado, es decir, que no guarda ninguna informacin sobre conexiones anteriores.

2.3.2. REQUISITOS FUNCIONALES


A continuacin se describir los requisitos funcionales ms importantes de Agromutua.Web, se dividirn en dos modos: usuario y administrador. El usuario ser la persona encargada de utilizar la aplicacin en las distintas oficinas de contratacin y su trabajo ser el de contratar seguros y documentos adjuntos. Los administradores se encargan de mantener los datos correctos de la aplicacin para realizar las plizas y de programar envos y recepciones de datos con Agroseguro, as como ayudar y resolver problemas con la contratacin de seguros que realizan los usuarios. Para acompaar las descripciones de las funcionalidades del producto se incorpora a las descripciones de los requisitos una captura del prototipo de la aplicacin que permite la visualizacin de la entrada de los datos. En principio el Estndar IEEE-830 no incluye capturas de pantalla ni prototipos de la aplicacin, la decisin de la incorporacin de esta caracterstica extra dentro de la especificacin de Agromutua.Web se ha decido proporcionar para facilitar la comprensin y el uso de la aplicacin, es importante destacar que en estas capturas se hace uso de los componentes descritos en el punto 2.3.1.1.

Pgina | 21

M ODO USUARIO

En el modo usuario se proporcionan las funcionalidades que todo usuario tendr su disposicin una vez autentificado. Para poder disponer de un usuario con contrasea previamente ha debido ser dado de alta por los administradores de Agromutua. Veamos las funcionalidades ms importantes de este modo junto con las pantallas necesarias.

Aadir pliza Entrada Proceso

Salidas

Colaborador, colectivo, asegurado, fecha contratacin, cdigo de agrupacin de pagos, observaciones. Comprobar: que ningn campo sea vacio. que la fecha tenga formato correcto. que colectivo, asegurado y colaborador estn relacionados. Obtener modulacin y subvenciones adicionales de asegurado. Recuperar datos de cultivos y variedades. Inicializar el estado de la pliza a Incompleta Crear poliza Confirmacin que la operacin se ha realizado con xito. Mostrar el alta de parcelas.

Pgina | 22

Aadir parcelas a la pliza Entrada Provincia, Comarca, Municipio, Cultivo, Variedad, Opcin, Zona, Polgono, Parcela, Subparcela, Paraje, Superficie, Produccin, Precio, Prima, Varios Proceso Los campos Provincia, Comarca, Municipio, Cultivo, Variedad, Opcin, Zona, Polgono, Parcela, Superficie, Produccin, Precio y Prima son obligatorios. Comprobar: el municipio sea de la comarca y la provincia seleccionada. que el municipio pertenezca a la comarca. que la variedad pertenezca al cultivo. que la opcin sea vlida. que el precio este en su intervalo mximo y mnimo. Recuperar de la pliza la lnea y el plan. Obtener posibles variedades y cultivos. Aadir la parcela a la pliza seleccionada por su campo de identidad Crear parcela Salidas Confirmacin que la operacin se ha realizado con xito.

Pgina | 23

Clculo de la pliza Entrada Proceso

Salidas

Lista de parcelas Comprobar: que las parcelas estn todas en estado Aceptado que la pliza este en el periodo de contratacin si existen impuestos, descuentos, subvenciones para la pliza y aplicarlos. Obtener del objeto pliza los datos del asegurado: modulacin, subvenciones adicionales Obtener de la pliza la lnea y el plan. Obtener de cada parcela de la pliza la variedad y el cultivo. Realizar el clculo primero del la prima comercial, de los impuestos y las subvenciones. Calcular el Coste del seguro: Coste Total = Coste Neto (Subvencin Enesa + Subvencin CCAA) Cambiar el estado de la pliza a Calculada Guardar los datos del clculo individualmente en cada parcela y los totales en la pliza. Confirmacin que la operacin se ha realizado con xito. Mostrar los datos totales del clculo de la pliza. Mostrar el nuevo estado.

Pgina | 24

Realizar pago de la pliza Entrada Banco origen, Banco destino, Importe, Fecha pago. Proceso Todos los campos son obligatorios. Actualizar la pliza con el importe pagado. Cambiar el estado de la pliza a Enviable. Registrar el pago. Salidas Confirmacin que la operacin se ha realizado con xito. Mostrar el nuevo estado.

Listados Entrada Proceso Salidas

Tipo de listado Determinar el listado mediante un filtro (campos opcionales) y una vista. Listado

Pgina | 25

Crear remesa Entrada Proceso

Salidas

Colectivo, Colaborador, Banco Ordenante, Banco Destino, Fecha pago, Importe de transferencia, listado de Plizas a remesar, clave de pago. Comprobar que se ha realizado correctamente el pago Obtener la diferencia, si existe. Comprobar que todas las plizas pertenecen al mismo colaborador y colectivo. Agrupar por clave de pago. Cambiar estado de pliza a Remesada. Crear el nuevo registro. Actualizar la pliza y hacer referencia en esta a la remesa que pertenece. Confirmacin que la operacin se ha realizado con xito. Mostrar el nuevo estado. Mostrar la diferencia, si existe.

Pgina | 26

Aadir asegurado Entrada

Proceso

Salidas

NIF, 1 Apellido, 2 Apellido, Nombre, Calle, Numero, Provincia, Municipio, Localidad, Telfono, E-mail, Mvil, Seguridad Social, Tipo SS, Colaborador. Opcionalmente: Banco, Nmero de agencia, Provincia del Banco, Localidad del Banco, Calle y CP del Banco, Nmero de cuenta. Comprobar: si el municipio pertenece a la provincia. campos obligatorios Obtener identificador de Colaborador del que pertenece. Enviar un mail (si tiene) al asegurado. Crear asegurado Confirmacin que la operacin se ha realizado con xito.

Pgina | 27

Aadir colectivo Entrada

Proceso

Salidas

Plan, Lnea, Fecha apertura, Fecha de cierre, Aceptado, Ventanilla, Tomador, Mediador, Lista de colaboradores, Datos bancarios (banco, provincia, nmero de cuenta) Validar que la Lnea est dada de alta y es correcta. Comprobar Fecha Apertura < Fecha Cierre Comprobar que Lista de Colaboradores > 0 Obtener identificadores de Tomador y Mediador. Obtener identificadores de cada Colaborador. Crear colectivo Confirmacin que la operacin se ha realizado con xito.

Pgina | 28

Crear seguro complementario de una pliza Entrada Fecha emisin, Listado de parcelas con aumentos de produccin Proceso Comprobar: que la lnea tiene complementario. que las parcelas tienen aumento. Produccin < Produccin + Aumento que existen tarifas, impuestos y subvenciones para la lnea complementaria. Realizar el clculo de las parcelas con aumento (Aumento > 0). Crear seguro complementario Salida Confirmacin que la operacin se ha realizado con xito.

Pgina | 29

Crear siniestro de una pliza Entrada Numero de pliza, Fecha de siniestro, Causa, Observaciones, Datos de contacto: Nombre, Calle, Provincia, Municipio, CP, Telfono, Fecha firma. Lista de parcelas siniestradas con la fecha de recoleccin. Proceso Comprobar: que existen parcelas con siniestro. que la fecha de recoleccin es posterior al documento de siniestro. los datos de contacto son obligatorios. Se ha seleccionado una causa y una fecha Fecha Recoleccin < Fecha Firma Crear siniestro y parcelas siniestradas Salida Confirmacin que la operacin se ha realizado con xito.

Pgina | 30

M ODO ADMINISTRADOR

El administrador es el superusuario de la aplicacin y tendr acceso tanto a la gestin de todo lo relacionado con datos y configuraciones como a la modificacin y rectificacin de datos introducidos por todos los usuarios normales. Estas son las funcionalidades que puede realizar:

Crear usuario Entrada

Proceso

Salidas

Login, Password, Nombre, E-mail, Telefono, Localidad, Perfil, Activo, Permitir agrupacin de pagos, Preferencias de: remesa, siniestro, reduccin de capital, modificacin de cosecha y solicitud de modificacin. Lista de Tomadores, listas de Mediadores, lista de Colaboradores Comprobar: Debe haber al menos 1 Colaborador Debe haber al menos 1 Mediador Debe haber al menos 1 Tomador Obtener identificadores de la lista de Tomadores, Mediadores y Tomadores. Enviar mail, si existe. Crear usuario Confirmacin que la operacin se ha realizado con xito.

Pgina | 31

Crear lnea de seguro Entrada Plan, Lnea, Descripcin, Fecha alta, Papel, Varias plizas, lnea renovable, Complementario (si existe): Plan, Lnea. Proceso Comprobar: Validar campos obligatorios: Lnea, Plan Si se ha marcado complementaria, el plan y la lnea complementaria tienen que estar completados. Crear lnea de seguro Salidas Confirmacin que la operacin se ha realizado con xito.

Pgina | 32

Envo manual de pliza y remesa Entrada Lista de remesas seleccionadas. Proceso Comprobar: que las lneas y plan de la remesas son las mismas. que tienen el mismo tipo. Preparar la conexin con el FTP de Agroseguro. Generar archivos txt de acuerdo a la norma. Empaquetar los archivos Transmitir los archivos. Cambiar el estado de la remesa a Enviada Cambiar estado remesa como enviada. Salidas Confirmacin que la operacin se ha realizado con xito. Mostrar el nuevo estado de la remesa.

Pgina | 33

Aadir mediador Entrada

Proceso

Salidas

Cdigo, 1 apellido, 2 apellido, nombre, NIF, Provincia, Municipio, Telfono, Calle, numero, CP, email, tipo mediador, sello, firma, membrete, datos bancarios Validar campos obligatorios: NIF, apellidos, cdigo, provincia y municipio Si tiene sello, membrete o firma, se debe comprobar que existe un archivo vlido. Si se ha incluido un nmero de cuenta, debe ser correcto. Validar que no existe ya el cdigo. Crear mediador Confirmacin que la operacin se ha realizado con xito.

Pgina | 34

Aadir colaborador Entrada

Proceso

Salidas

Cdigo, 1 apellido, 2 apellido, nombre, NIF, Provincia, Municipio, Telfono, Calle, numero, CP, email, tipo mediador, sello, firma, membrete, datos bancarios, lista de mediadores Validar campos obligatorios: NIF, apellidos, cdigo, provincia y municipio Debe tener al menos un mediador en la lista. Mediadores > 0 Si se ha incluido un nmero de cuenta, debe ser correcto. Validar que no existe el cdigo en base de datos. Crear colaborador Confirmacin que la operacin se ha realizado con xito.

Pgina | 35

Generar fichero de produccin Entrada Lista de solicitudes Proceso Validar que los registros sean correctos. Generar fichero .mdb y incluirlo en un directorio temporal. Recorrer los registros e ir aadindolos al archivo .mdb. Salidas Fichero .mbd

Pgina | 36

2.3.3. REQUISITOS DE EFICIENCIA


Uno de los aspectos a tener en cuenta en la aplicacin es la eficiencia. Los usuarios deben trabajar fluidamente desde sus estaciones de trabajo. Para ello se recomienda a todos los usuarios que vayan a utilizar Agromutua.Web una conexin de al menos 1 Mb de subida y de 500Kb de bajada, o lo que es lo mismo cualquier conexin convencional de ADSL del mercado. Las estadsticas indican que la eficiencia con las interfaces hardware disponibles es optima, an teniendo contratada la opcin mnima recomendada en esta ERS (punto 2.3.1.2). Los datos que se muestran en la grfica de a continuacin muestran las visitas durante un periodo que va de 1 de Junio del 2009 al 30 de Junio del 2009. Las conclusiones que se pueden obtener son que el nivel de contratacin es constante y que oscila entre las 100 y 200 visitas diarias. Durante este mes la mutua indica que la contratacin realizada en web es del 30%. Obsrvese en el dato que apunta el cursor el da 2 de Junio se recibieron 118 visitas.

Los datos proporcionados por el proveedor de la conexin referentes a ese da muestran claramente que es eficiente el ancho de banda contratado y que est preparado para disponer de un carga de usuarios superior 100% de la contratacin estimada por la mutua.

Pgina | 37

2.3.4. RESTRICCIONES DE DISEO


En lo que respecta al navegador web, se dar soporte para trabajar con Internet Explorer 7 y Mozilla Firefox 2. El resto de navegadores quedan, en principio, excluidos de la propuesta, pese a que se entiende que la mayora de ellos podrn ejecutar la aplicacin en la medida en que se cian a los estndares establecidos en Internet. Se asume la configuracin por defecto de cada uno de ellos como plataforma estndar de desarrollo cliente. Esto implica, niveles de seguridad medios para internet, JavaScript habilitado, cookies habilitadas y restricciones por defecto en cuanto al uso de ventanas emergentes y control de descargas. Se intentar que la aplicacin sea, en la medida de lo posible, compatible con XHTML 1.0 Transitional y CSS de nivel 2, segn los estndares del W3C (http://www.w3.org/TR/xhtml1/, http://www.w3.org/TR/REC-CSS2/).

2.3.5. ATRIBUTOS
El proyecto AGROMUTUA.WEB, adems de los anteriores requerimientos enunciados, deber cumplir los siguientes requerimientos de carcter no funcional y considerados como atributos de la aplicacin. Se considerar atributo todo aquello que sea una caracterstica del proyecto y no que no se pueda plasmar en cdigo y quede como norma para los desarrolladores.

Pgina | 38

1.

Las nuevas tablas de datos que se necesiten se crearn sobre SQL SERVER 2005, la mayora de estas sern heredadas de la base de datos antigua de WINCAMP pero se pueden crear nuevas para apoyo o para mejorar las anteriores. Igual sucede con las relaciones entre ellas. 2. La arquitectura de aplicaciones .NET a utilizar en el proyecto ser una arquitectura en tres capas. 3. Se restringir la utilizacin del sistema y de acceso a los datos e informacin mediante mecanismos que permitan la identificacin, la autenticacin, la gestin de derechos de acceso y, en su caso, la gestin de privilegios. Para ello se crearn los debidos campos en la base de datos al realizar clculos o operaciones que lleven un riesgo para la mutua. De la misma forma se recoger un log en el servidor con los procesos que se realizan. 4. El sistema deber mantener un registro de los inicios y cierre de sesiones de cada usuario, as como las actualizaciones de datos que se han realizado. 5. Se agilizar la entrada de datos con valores por defecto para cada atributo segn se establezca en las reuniones con los usuarios finales. 6. El sistema permitir, mediante dilogos o prefiltros, fijar criterios de filtrado y ordenacin de la informacin, para su explotacin a formatos Microsoft Excel. Se llamarn Trabajar Con o TC y estn explicados en el punto anterior. 7. En lo que respecta al navegador web, se dar soporte para trabajar con Internet Explorer 7 y Mozilla Firefox 2. El resto de navegadores quedan, en principio, excluidos de la propuesta, pese a que se entiende que la mayora de ellos podrn ejecutar la aplicacin en la medida en que se cian a los estndares establecidos en Internet. 8. Se asume la configuracin por defecto de cada uno de ellos como plataforma estndar de desarrollo cliente. Esto implica, niveles de seguridad medios para internet, javascript habilitado, cookies habilitadas y restricciones por defecto en cuanto al uso de ventanas emergentes y control de descargas. Se intentar que la aplicacin sea, en la medida de lo posible, compatible con XHTML 1.0 Transitional y CSS de nivel 2, segn los estndares del W3C (http://www.w3.org/TR/xhtml1/, http://www.w3.org/TR/REC-CSS2/). 9. En vistas a la escalabilidad de la aplicacin, la reduccin de trfico de datos y la mejora de la experiencia del usuario, el cliente deber tener Javascript habilitado y este seguir los estndares del ECMA referentes a ECMAScript (ECMA-262). Los estndares propuestos se intentarn seguir siempre y cuando no resulten en una prdida de funcionalidad de la aplicacin. 10. Sistemas Operativos Cliente: Se acepta cualquier sistema operativo cliente que pueda ejecutar alguno de los navegadores propuestos (IE7, Firefox2) y que cumpla con los requisitos de fuentes, visibilidad, funcionalidad, etc. especificados por la aplicacin. Las pruebas se realizarn sobre Windows XP y Windows Vista. 11. Soporte Hardware Cliente: Se establecen los mnimos equivalentes a la ejecucin de cualquiera de los dos navegadores propuestos. 12. Se recomienda una resolucin mnima de 1024x768 para las pantallas cliente, entendiendo que es el mnimo para que muchos de los formularios definidos en el proceso de anlisis quepan en la pantalla para facilitar el trabajo. En la medida de lo posible se intentar que la aplicacin trabaje con resoluciones superiores a 1280x1024. Se establece esta ltima resolucin como lmite para las pruebas funcionales que se realizarn. Dado que casi la totalidad de tarjetas grficas del mercado lo permite, se disearn los diferentes formularios con una profundidad de color de 32bits.

Pgina | 39

3. ARQUITECTURA Y TECNOLOGAS
En el capitulo anterior se ha presentado el negocio en la aplicacin Agromutua.Web, en el actual se va a presentar la arquitectura utilizada y las tecnologas empleadas para construirla y poder poner en prctica las especificaciones del negocio. Como en todos los proyectos a largo plazo es lgico que durante la fase de desarrollo aparezcan nuevas tecnologas o evolucione la actual que lejos de dejarlas de lado se han ido incorporando para poder beneficiarse de sus ventajas, como es el caso de LINQ. Este captulo servir de recorrido por las capas de Agromutua.Web, analizando cada una y viendo como se ha construido la arquitectura y las tecnologas empleadas para implementarla, desde la interfaz utilizando JavaScript para realizar peticiones AJAX hasta la utilizacin de C# y VB.NET para controlar la lgica dentro del servidor.

3.1. ARQUITECTURA DEL PROYECTO


Agromutua.Web es un proyecto con ms de dos aos de vida, durante este periodo las tecnologas han evolucionado y se han tenido que ir incluyendo tanto en l proyecto a nivel de interfaz como en su arquitectura, el cambio ms importante viene dado sobre todo por la aparicin del Framework 3.5 de .NET y la aparicin de LINQ como una de las caractersticas ms destacadas. La aplicacin usa una arquitectura multicapa convencional dividida en tres niveles bien diferenciados como interfaz, negocio y persistencia. Este modelo de arquitectura consigue el propsito de la separacin de contenidos y crear una dependencia entre las capas sin mezclar funcionalidad. Con la aparicin de LINQ la capa de persistencia se solap con la de negocio apareciendo un mapeado completo de la base de datos y dejando de lado la tediosa programacin que supona la interaccin con objetos ADO.NET. A nivel de arquitectura se podra debatir si la inclusin de LINQ sera o no otra capa, en el captulo 5 de esta tesina se profundizar en este aspecto, de momento en la explicacin de la arquitectura se presentar como un elemento intermedio entre la capa de persistencia y la de negocio. La migracin al Framework 3.5 y la aparicin de LINQ supusieron un cambio en la arquitectura y en la forma de pensar del programador, permitiendo acceder rpidamente a la base de datos para obtener los datos, pero por otro lado la convivencia de dos partes de acceso a datos muy diferentes. Mientras LINQ se disemina por todo el proyecto (an teniendo la aparicin de una capa de persistencia paralela) el acceso a datos con ADO.NET se concentra claramente en la capa de persistencia. Dicho de otra forma, el acceso sencillo a datos que nos proporciona LINQ permite abusar de l en cualquier parte, ya que en consultas individuales y no comunes a otras es mucho ms rpido incluir un fragmento LINQ que no realizar todo el recorrido por todas las capas, escribiendo cdigo que muchas veces se utiliza apenas.

Pgina | 40

De manera grfica se muestran unas imgenes de la arquitectura con la que se empez y en el punto en el que est actualmente con la aparicin de LINQ:

UI

UI

SERVICIOS

SERVICIOS

PROCESO

ENTIDADES

PROCESO

ENTIDADES

PERSISTENCIA

DBML (LINQ to SQL) + Clase Parciales

PERSISTENCIA

BD

BD BD Figura 2, Arquitectura antes Figura 3, Arquitectura actual

La figura 2 muestra la primera arquitectura, mientras que la figura 3 muestra la nueva arquitectura. Aunque realmente es la misma, la arquitectura de 3 capas (Interfaz, Servicios y Persistencia) la nueva arquitectura ha pasado a tener una capa extra intermedia entre persistencia y servicios que incluye los DBML generados por el mapeo de la base de datos para la utilizacin de LINQ to SQL, estos DBML que veremos ms adelante no son otra cosa que las tablas de la base de datos debidamente mapeadas, y a las cuales les aadimos clases parciales para hacer ms rica esta capa, estas clases parciales nos proporcionan validaciones y funcionalidad extra. El mapeo de la base de datos permite ahorrarse adems de tiempo, muchas comprobaciones a nivel de tipos de datos y escritura de consultas. Como se ver en el captulo 4, LINQ to SQL ayuda sobre todo a realizar tareas de programacin e interaccin con los datos de una forma ms rpida y sencilla. Pgina | 41

3.1.1. LA INTERFAZ
La interfaz de Agromutua.Web se encarga de mostrar al usuario la informacin comunicndole la informacin y capturando la informacin introducida por el usuario mediante formularios. Basada en el patrn de listado-detalle, la usabilidad que se percibe al trabajar con la aplicacin es alta debido al nivel de detalle y la distribucin de los contenidos. Vase la pantalla de inicio:

Pgina | 42

A continuacin un ejemplo de listado-detalle:

La interfaz es la capa situada en la parte superior de la arquitectura, teniendo por debajo la capa de lgica que contiene las entidades y el negocio de la aplicacin y que va a ser la encargada de suministrar la informacin y tratar la informacin introducida en formularios o producida por el usuario al interactuar con la aplicacin.

3.1.2. LA CAPA DE SERVICIOS O LGICA DE NEGOCIO


La capa de servicios es la encargada de toda la lgica del proyecto y de ella depende en gran medida el correcto funcionamiento de la aplicacin ya que el negocio depende de ella. Si se observa el dibujo de la arquitectura se ve que esta capa est representada en dos subcapas, que en realidad no es otra cosa que la capa de Entidades que aglutina todas las clases con constructores, destructores, etc. y la subcapa de Proceso que incluye todos los mtodos y funcionalidades. Por tanto los objetos que navegan por el proyecto entre capas van a depender de la estructura definida en la capa de Entidades. Mientras que las peticiones de usuario y los datos agregados que dependan de reglas de validacin se procesarn en la parte de Proceso. Dicha capa intermedia va a permitir la transferencia de datos entre interfaz y persistencia, y es aqu donde LINQ y ms concretamente LINQ to SQL va a ser clave en la nueva arquitectura. Para hacer funcionar LINQ to SQL se mapean las tablas de la base de datos en objetos (vase punto 4.5.1), dentro de lo que es el DBML, al mapear se consigue que se puedan crear objetos y colecciones que representen los datos de la base de datos integrados dentro del cdigo funcional. Una de las caractersticas de LINQ to SQL y del mapeo que realiza es que cuando genera las clases, estas clases estn definidas de forma parcial, lo que permite aadir ms fragmentos de la misma clase en diversos archivos, por ejemplo para realizar validaciones que no realiza el propio LINQ y que sean del negocio. Esta caractersticas va a permitir ahorrar muchas horas al programador, cuando se hablaba de la arquitectura original de Agromutua.Web las subcapas de Entidades y Proceso haba que programarlas y ms complicado an, mantenerlas. Ahora con LINQ to SQL tanto el mantenimiento como coste en horas de trabajo disminuye significativamente.

Pgina | 43

El nico inconveniente que surge con la aparicin de LINQ to SQL en el proyecto es la tentacin de hacer consultas a la base de datos en la capa de interfaz, que de hecho se realiza en este proyecto apareciendo consultas diseminadas por archivos de la interfaz. Pero esto aunque parezca que deja de lado la arquitectura, cumplirlo a rajatabla sera adems de laborioso, en ocasiones intil, ya que en ocasiones las consultas son nicas o muy concretas hacindose factible sobre todo para el programador saltarse el concepto de la arquitectura.

3.1.3 PERSISTENCIA
La capa de nivel inferior y la capa encargada de transmitir y estar en continuo contacto con la base de datos. La capa de Persistencia se va a encargar de guardar, obtener y actualizar los registros de la base de datos. Cuando se trabaja con LINQ to SQL, la capa va a ser autoimplementada y posiblemente lo ms interesante ser que no se va a tener que hacer un esfuerzo en la comprobacin del tipo de datos que viene y va hacia la base de datos ya que LINQ to SQL a nivel de persistencia lo controlar, una tarea bastante complicada en la arquitectura anterior con ADO.NET. En la nueva arquitectura el mantenimiento de esta capa se reducir a la actualizacin del mapeo de la base de datos, y la generacin de un DBML actualizado.

3.2 TECNOLOGAS
En Agromutua.Web el uso de una tecnologa u otra no fue una decisin de la empresa sino del cliente. Se trabaja con un entorno de Visual Studio 2008 y el Microsoft Framework 3.5 (que incluye LINQ), por tanto al ser un proyecto web utiliza ASP.NET, C# y VB.NET. Al ser un aplicacin muy cargada de datos y cabe la posibilidad de que en determinadas ocasiones sean muchos los usuarios conectados se vio necesario la utilizacin de mucho JavaScript y AJAX (el sp1 de Visual Studio proporciona un gran soporte para AJAX) para no sobrecargar el servidor y realizar algunas tareas en el cliente (navegador). La base de datos a la que se conecta es SQL Server 2005 y como se ver ms adelante se utilizan diferentes versiones dependiendo del puesto de trabajo.

3.2.1 ENTORNO DE DESARROLLO: VISUAL STUDIO 2008


Microsoft Visual Studio es un entorno de desarrollo integrado (IDE) para sistemas operativos Windows. Soporta varios lenguajes de programacin tales como Visual C++, Visual C#, Visual J#, ASP.NET y Visual Basic .NET, aunque actualmente se han desarrollado las extensiones necesarias para muchos otros. Este potente IDE permite a los desarrolladores crear aplicaciones, sitios y aplicaciones web, as como servicios web en cualquier entorno que soporte la plataforma .NET. As se pueden crear aplicaciones que se intercomuniquen entre estaciones de trabajo, pginas web y dispositivos mviles. Visual Studio 2008 ofrece herramientas de desarrollo avanzadas, funciones de depuracin de cdigo, funciones para bases de datos y funciones innovadoras que permiten crear rpidamente aplicaciones para distintas plataformas. En la versin 2008 incluye mejoras en los diseadores visuales para un Pgina | 44

desarrollo ms rpido con .NET Framework 3.5, mejoras sustanciales en las herramientas de desarrollo Web y mejoras de programacin que aceleran el desarrollo a partir de todo tipo de datos.

Visual Studio 2008 ofrece todo el soporte requerido para frameworks y herramientas, necesario para crear aplicaciones AJAX para Web, completas y expresivas. Frameworks que permiten construir fcilmente aplicaciones Web concentradas en los clientes, que se integran con cualquier proveedor de datos de back-end, que se ejecutan dentro de cualquier explorador moderno, y que tienen acceso total a los servicios de aplicaciones ASP.NET y de la plataforma Microsoft. Para que los desarrolladores puedan crear rpidamente software moderno, Visual Studio 2008 ofrece funciones de programacin y de datos mejoradas, como LINQ (Language Integrated Query), que facilita el armado de soluciones capaces de analizar informacin y de actuar en consecuencia. Visual Studio 2008 tambin brinda la posibilidad de trabajar con distintas versiones de .NET Framework desde el mismo entorno de desarrollo. Por lo tanto, se podrn construir aplicaciones que apunten a .NET Framework 2.0, 3.0 o 3.5, y as podrn admitir una amplia variedad de proyectos en un mismo entorno. Las nuevas herramientas aceleran la creacin de aplicaciones conectadas con las ltimas plataformas, incluidas la Web, Windows Vista, Office 2007, SQL Server 2008 y Windows Server 2008. Para la Web, ASP.NET AJAX y otras nuevas tecnologas permiten que los desarrolladores creen rpidamente una nueva generacin de experiencias ms eficientes, interactivas y personalizadas. Proporciona herramientas mejoradas que ayudan a mejorar la colaboracin entre equipos de desarrollo, incluyendo herramientas que colaboran con la integracin entre profesionales especializados en bases de datos y diseadores grficos. Pgina | 45

.NET Framework permite la construccin rpida de aplicaciones ofreciendo componentes (software prefabricado) que resuelve las tareas de programacin ms frecuentes. Juntos, Visual Studio y .NET Framework reducen la necesidad de cdigo en comn, disminuyendo los tiempos de desarrollo.

Con la llegada del .NET Framework 3.5 las mejoras fueron aplicadas a reas fundamentales como la biblioteca bsica de clases, Windows Workflow Foundation, Windows Communication Foundation, Windows Presentation Foundation y Windows CardSpace. [10]

3.2.2. SERVIDOR WEB: INTERNET INFORMATION SERVER (IIS)


IIS proporciona una serie de servicios para los servidores que funcionan con Windows. Originalmente era parte del Option Pack para Windows NT. Luego fue integrado en otros sistemas operativos de Microsoft destinados a ofrecer servicios, como Windows 2000 o Windows Server 2003. Los servicios que ofrece son: FTP, SMTP, NNTP y HTTP/HTTPS. Los servicios de Internet Information Services (IIS) proporcionan las herramientas y funciones necesarias para administrar de forma sencilla un servidor Web seguro, gestionando las tareas para la administracin de sites y el acceso a mquinas. El servidor web se basa en varios mdulos que le dan capacidad para procesar distintos tipos de pginas, por ejemplo Microsoft incluye los de Active Server Pages (ASP) y ASP.NET. Tambin pueden ser incluidos los de otros fabricantes, como PHP o Perl.

3.2.3. SISTEMA GESTOR DE BASE DE DATOS: SQL SERVER 2005


Para la gestin de la base de datos se ha utilizado Microsoft SQL Server 2005, un sistema de gestin de bases de datos relacionales (SGBD) basado en el lenguaje Transact-SQL. SQLServer conocido inicialmente como proyecto Yukon no es una actualizacin de su predecesor 2003, sino que Microsoft ha mejorado todos sus aspectos ms importantes siendo un producto muy superior y distinto a versiones anteriores. Por tanto hablamos que la versin 2005 es mucho ms integrada, ms flexible y ampliable que otros productos de bases de datos relacionales. Existen cinco versiones de SQLServer 2005: Microsoft SQL Server 2005 Enterprise Edition Microsoft SQL Server 2005 Standard Edition Microsoft SQL Server 2005 Workgroup Edition Microsoft SQL Server 2005 Developer Edition Microsoft SQL Server 2005 Express Edition

En el desarrollo de Agromutua.Web se han utilizado dos versiones, Microsoft SQL Server 2005 Enterprise Edition para gestionar la base de datos del servidor de la aplicacin y la edicin reducida de Microsoft SQL Server 2005 Express Edition disponible para su descarga en la web de SQL Server para el desarrollo de la aplicacin en las maquinas de los programadores. Pgina | 46

Microsoft SQL Server 2005 Enterprise Edition se presenta en las variedades de 32 y 64 bits, utilizando Agromutua.Web la primera. Se trata de la edicin ideal cuando se necesita que el SGBD se pueda ampliar a un tamao ilimitado al tiempo que ofrece procesamiento transaccional en lnea (OLTP, Online Transaccion Processing) de nivel empresarial, anlisis de datos muy complejos, sistemas de almacenamiento de datos y sitios Web. Esta versin viene con todos los accesorios y est perfectamente equipado para proporcionar capacidades exhaustivas analticas y de inteligencia empresarial. Incluye funcionalidades de alta disponibilidad como creacin de reflejos de las bases de datos y de clsteres por conmutacin de errores. Microsoft SQL Server 2005 Express Edition es una base de datos gratuita disponible solo en 32 bits y se caracteriza por su sencillez a la hora de manejarla. Prescinde de muchas de las funciones de las dems ediciones, como Management Studio, Notification Services, Analysis Service, Integration Services y el Generador de informes, por nombrar unas cuantas. SQL Server Express puede funcionar como base de datos cliente o como base de datos de servidor bsica. Se trata de una buena eleccin cuando no se realizan tareas avanzadas y solo se requiere para disponer locamente de la base de datos. Uno de los aspectos clave incorporados a SQL Server 2005 es el alto grado de integracin entre los aspectos de la programacin y de la administracin. Ejemplo de esto es la total remodelacin de SQL Server Management Studio [3]

Pgina | 47

Actualmente existe una versin superior en el mercado, SQL Server 2008 con nuevas caractersticas muy interesantes como la utilizacin del Intellisense de Microsoft en las consultas.

3.2.4. HERRAMIENTAS PARA AUMENTAR EL RENDIMIENTO EN EL DESARROLLO


Firebug es una extensin de Firefox creada y diseada especialmente para desarrolladores y programadores web. Es un paquete de utilidades con el que se puede analizar (revisar velocidad de carga, estructura DOM), editar, monitorizar y depurar el cdigo fuente, CSS, HTML y JavaScript de una pgina web de manera instantnea e inline.

Firebug no es un simple inspector como DOM Inspector, adems edita y permite guardar los cambios. Su atractiva e intuitiva interfaz, con solapas especficas para el anlisis de cada tipo de elemento (consola, HTML, CSS, Script, DOM y red), permite al usuario un manejo fcil y rpido. Esta herramienta est encapsulada en forma de plug-in o complemento de Mozilla, es Open Source y de distribucin gratuita.

3.2.5. LENGUAJES DE PROGRAMACIN


Como se ha mencionado en la introduccin de este punto, se han utilizado varios lenguajes de programacin diferentes. La utilizacin de estos lenguajes va normalmente ligada a la capa donde se utiliza. De esta forma la interfaz requiere ASP.NET para utilizar sus controles principalmente y JavaScript conjuntamente con AJAX para no sobrecargar el servidor de peticiones. La capa de negocio por su parte utiliza lenguajes ms robustos como C# y VB.NET conjuntamente para implementar la lgica y la persistencia de la aplicacin. Cuando se presentan estos lenguajes, se presentan como los lenguajes utilizados para los programadores de la aplicacin, internamente Visual Studio y las tecnologas de Microsoft hacen utilizar XML, lenguajes intermedios, etc.

Pgina | 48

3.2.5.1. J AVA S CRIPT

JavaScript es bsicamente un lenguaje de programacin de creacin de secuencias de comandos en lado del cliente que se utiliza en navegadores WEB y con la propia ventana del navegador. JavaScript se basa someramente en Java, un lenguaje de programacin orientado a objetos que se utiliza en la Web a travs de subprogramas incrustados. Aunque Javascript cuenta con una sintaxis y metodologa de programacin similares, no es una versin ligera de Java, sino un lenguaje propio, que habita en navegadores Web de todo el mundo y que permite una interaccin mejorada del usuario con sitios y aplicaciones Web. JavaScript naci y creci vinculado a la web pero sus inicios fueron un poco caticos ya que en pleno auge de las tecnologas web muchas organizaciones y empresas lanzaban sus propias versiones como CEnvi de ScriptEase , JScript de Microsoft y JavaScript de Netscape Navigator. Fue en 1997 cuando un comit compuesto por las principales empresas interesadas en el futuro de los lenguajes de secuencias de comandos, se reunieron para elaborar el ECMA-262, un estndar que defina un nuevo lenguaje de secuencias denominado ECMAScript. Al ao siguiente la ISO/IEC tambin adopto como estndar ISO/IEC-16262, desde entonces los navegadores han adoptada el ECMAScript como base de implementacin del JavaScript. Una implementacin completa de JavaScript est compuesta por tres partes: El ncleo (ECMASScript) El Modelo de objetos de documento (DOM) El Modelo de objetos de navegador (BOM)

JavaScript ECMAScript DOM BOM

ECMAS por tanto puede ofrecer funciones de creacin de secuencias de comandos para distintos entornos anfitriones y, por tanto, se especifica el lenguaje de secuencias de comandos bsico, desvinculado de cualquier entorno anfitrin concreto. Por otra parte el Modelo de objetos de documento (DOM) es una interfaz de programacin de aplicaciones (API) para HTML y XML. El DOM confecciona una pgina completa en forma de documento compuesto por una serie de nodos jerrquicos. Cada parte de una pgina HTML o XML parte de un nodo.

Pgina | 49

Mientras el Modelo de objetos del navegador (BOM) describe mtodos e interfaces para interactuar con el navegador. Lo que convierte al BOM en algo exclusivo y en ocasiones problemtico, es que es la nica parte de una implementacin JavaScript que carece de estndar. En Agromutua.Web a la hora de programar en JavaScript se ha intentado estandarizar lo mximo posible el cdigo de manera de hacerlo funcionar en todos los navegadores posibles. An as se ha puesto mayor empeo a que funcionara todo correctamente en Mozilla Firefox, el predecesor de Netscape Navigator. La razn de la utilizacin en el proyecto de cdigo en JavaScript viene dada para liberar de procesos, sobretodo de comprobaciones del lado del servidor, reduciendo la carga. As con JavaScript se han implementado muchas de las pantallas y procesos que el usuario puede realizar en la aplicacin y que gracias a esta tecnologa se pueden realizar desde el navegador sin realizar (en ocasiones) peticiones al servidor. [5] Para ello, se ha requerido de un potente framework JavaScript como es la Yahoo User Interface (YUI) que proporciona un marco de trabajo muy interesante para los desarrolladores y que comprende muchos componentes personalizables y extremadamente utiles en tareas web. Yahoo User Interface(YUI), una serie de bibliotecas escritas en JavaScript, para la construccin de aplicaciones interactivas (RIA). Liberadas bajo licencia BSD por parte de la compaa Yahoo. Dichas bibliotecas son utilizadas para el desarrollo web

Pgina | 50

especficamente para ser usadas como la programacin de aplicaciones de escritorio, con componentes vistosos y personalizables y con una amplia implementacin con AJAX. La biblioteca est completamente documentada en su pgina web (http://developer.yahoo.com/yui/) y se compone de seis componentes: Ncleo YUI, utilidades, controles UI, componentes CSS, herramientas de desarrollo y de construccin. Algunos de estos componentes de YUI estn orientados para hacer peticiones AJAX, vase en el siguiente punto como funciona AJAX.

3.2.5.1.1 AJAX

El nombre es un acrnimo (AJAX, Asynchronous JavaScript + XML), por tanto no es un lenguaje de programacin, ni siquiera realmente AJAX es una tecnologa, sino varias cada una de ellas se ha afianzado en el desarrollo web y que se unen en nuevas y potentes formas. Las tecnologas que AJAX incorpora son: Presentacin basada en estndares utilizando XHTML y CSS Muestra de resultados e interacciones y dinmicas gracias al DOM El intercambio y manipulacin de datos utilizando XML y XSLT Recuperacin asncrona de datos mediante el objeto XMLHttpRequest Y JavaScript unindolo todo

El modelo clsico de aplicaciones web funciona realizando peticiones web HTTP al servidor web, este las procesas y devuelve otra pgina web diferente al cliente. Una aplicacin con AJAX elimina de la interaccin en la Web la situacin de arrancar-parar-arrancar-parar introduciendo un intercambio entre el usuario y el servidor [6]

Pgina | 51

Resumen detallado del grfico: 1. 2. 3. 4. 5. 6. Se realiza una accin Se invoca el objeto XMLHttpRequest y se inicia el proceso de peticin al servidor. Se ejecuta la peticin asncrona mediante el objeto recin creado El servidor procesa los datos recibidos, les da formato y devuelve un XML con toda la informacin resultante. El objeto XMLHttpRequest interpreta el XML y reparte la informacin donde corresponde La parte de la pgina que iba a ser actualizada con la informacin que el objeto XMLHttpRequest contea esta lista, ha sido escrita y forma el objeto DOM con los nuevos datos.

Cuando se emplea AJAX en partes de la aplicacin se obtienen beneficios mejorando la UI de la web, parecindose incluso a la de una aplicacin de escritorio. El trfico de datos con el servidor se reduce considerablemente y de manera dinmica se consigue solo refrescar una parte la web sin necesidad de recargarla entera. Tambin es una tecnologa independiente de la plataforma donde se ejecute ya que utiliza las tecnologas anteriormente mencionadas: JavaScript y XML Pgina | 52

Lgicamente como se indica anteriormente cuando se realizan las peticiones AJAX no es necesario implementar cada vez toda la peticin de inicio a fin, utilizando por ejemplo frameworks de trabajo como se explica en el punto anterior de JavaScript, la utilizacin de la YUI proporciona unas API muy cmodas de utilizar, tal y como se hace el Agromutua.Web. De esta forma se interacta con el servidor serializando y deserializando las peticiones en formatos que son cmodos de utilizar como JSON u otros. [8]

3.2.5.2. ASP.NET

ASP.NET es un conjunto de tecnologas de desarrollo Web producidas por Microsoft, que se usa para construir sitios web dinmicos, aplicaciones Web y aplicaciones Web basadas en XML. ASP.NET forma parte del entorno de trabajo .NET y permite a los desarrolladores construir aplicaciones en mltiples lenguajes como VB.NET, C# y JScript. [9] [6] La evolucin del lenguaje ASP.NET desde que apareci hasta la actualidad se ha ido adaptando a los cambios y las necesidades de la web. Cuando surgi ASP 1.0 y 1.1 la plataforma .NET de Microsoft introdujo una forma completamente nueva de programar. Los desarrolladores de Microsoft se interesan principalmente por los hilos y por la memoria. Este modelo afecta a todas las reas de desarrollo, incluyendo al desarrollo Web, depositando una carga pesada sobre los programadores. ASP.NET introdujo servicios de tiempo de ejecucin y bibliotecas correctamente diseadas para mejorar significativamente el desarrollo web. En cierto modo, el ASP clsico era algo pegado de la arquitectura IIS/ISAPI sin ningn concepto orgnico de cmo las primeras decisiones diseadas podran afectar posteriormente a los desarrolladores. Entre las funciones que se incluan en ASP.NET 1.0 y 1.1 estn: Una plataforma orientada a objetos para la definicin de aplicaciones Separacin de las declaraciones de la interfaz del usuario (HTML) y la lgica de la aplicacin Cdigo compilado para ejecutar la lgica de la aplicacin Administracin configurable del estado de la sesin Copia cach de datos integrada Copia cach de contenido integrada Una arquitectura bien definida de la componentizacin de la interfaz del usuario Componentes de alto nivel para administrar el formato de datos (grids, tablas formateadas, etc.) Rastreo y diagnostico del programa integrado Validacin de la entrada de usuario integrada Un mecanismo de autentificacin fcil de utilizar Integracin slida con ADO.NET (base de datos predecesora de .NET) Excelente soporte para Web Services Elimina la dependencia de Component Object Model Segmentacin extensible con muchos lugares en los que se puede interceptar una peticin

Con la aparicin de ASP.NET 2.0 que se basaba en las versiones 1.0 y 1.1 proporcionando algunas caractersticas nuevas adems de las ya existentes, algunas de las importantes eran: Plantillas y diseos

Pgina | 53

Enlaces de datos actual Soporte para navegacin y mapa del servidor Habilita el patrn de modelo Nuevas funciones de cach Controles web Controles de personalizacin Configuracin programable Herramientas de administracin Nuevo modelo de compilacin

Con todas estas nuevas caractersticas ASP.NET 2.0 se hacia una plataforma para crear sitios Web muy potente. Con la aparicin de ASP.NET 3.5 se introduccin soporte para AJAX AJAX, soporte para Windows Communication Fundation (WCF) y un gran avance en el tratamiento de las bases de datos relacionales con LINQ (en el captulo 4 se describen las novedades en el lenguaje) y el ADO.NET Entity Framework, Framework adems de un incremento significativo de soporte de AS ASP.NET P.NET dentro de Visual Studio. En las siguientes imgenes se aprecia de forma grafica las caractersticas que se han ido aadiendo en los diferentes .NET Frameworks y que representan mejoras a la vez en ASP.NET ASP.NET:

.NET Framework 2.0

.NET Framework 3.0

.NET Framework 3.5

WinForms ASP.NET ADO.NET

WCF WPF WWF

LINQ ADO .NET Entity Framework

BCL

CardSpace SP1

Framework 2.0

CLR (Common Language Runtime)

Framework 2.0

Framework 3.0

Pgina | 54

3.2.5.3. C# 3.0 Y VB.NET 9.0

C# es un lenguaje de programacin orientado a objetos desarrollado por Microsoft para convertirse en parte clave de su plataforma de desarrollo de software .NET .NET. . Al ser orientado a objetos, C# se compone de una coleccin de clases que pueden interactuar entre s. [6] Este lenguaje se basa en el lenguaje C++, pero no hay duda que est influido por otro lenguaje de Microsoft, Visual Basic. Una de las principales ventajas de C# es que su sintaxis es similar s a la de otros lenguajes de programacin populares, principalmente C++, Visual Basic, Java y Delphi. VB.NET al igual que C# es otro lenguaje desarrollado por Microsoft, pero con muchos ms aos de experiencia y con muchas ms versiones. [7] Respecto a cmo funciona Microsof Microsoft .NET Framework por dentro, , es decir su compilador se explicar brevemente mediante la figura de a continuacin:

CLI Common Intermediate Language Cdigo Compilador CLR (Common Language Runtime)

Si compilamos la aplicacin con VB.NET 9.0 lo hara el compilador de VB.NET 9.0 e igual si se hace con C# 3.0, lo novedoso es que el compilador de cada lenguaje compilara el cdigo a un lenguaje leng intermedio denominado CIL (Common Intermediate Language). Por otro lado ese lenguaje intermedio ser ejecutado por el CLR, encargado de compilar la ltima instancia. Tanto C# como VB.NET estn diseados para aprovechar el CLR (Common Language Runtime) sobre el cual se basan todos los programas de .NET. Todas las aplicaciones escritas en C# y VB.NET requieren CLR para ejecutarse. Algunas caractersticas del CLR: Cdigo gestionado: cdigo gestionado por aplicaciones Visual Studio y ejecutado por la plataforma .NET Framework Instalacin fcil/automtica de la aplicacin: Esto se puede realizar utilizando la cach ca de ensamblados global. Gestin de memoria: CLR ofrece a los programadores una forma sencilla aunque eficaz de gestionar la memoria. Recoleccin automtica de basura: La plataforma .NET libera automticamente memoria cuando los objetos dejan de ser necesarios. Niveles excelentes de seguridad durante la ejecucin: La plataforma .NET Framework incluye un modelo integrado de seguridad que proporciona permiso a recursos basndose en la evidencia encontrada en ensamblajes.

Lo que se ha explicado da entender la utilizacin en Agromutua.Web de proyectos en ambos lenguajes y su convivencia sin ningn tipo de problema. Pgina | 55

4. LINQ
Podemos decir que el software es sencillo, ya que se reduce en dos cosas: cdigo y datos. Eso s, escribir software ya no es tan sencillo y una de las actividades ms complicadas y que ms veces se repite es escribir cdigo que trate con datos. Existen gran cantidad de lenguajes de programacin y todos ellos incluyen el tratamiento de los datos ya sean ficheros de datos, XMLs o tablas de una base de datos. Partiendo de la idea del tratamiento de los datos se explicar en este apartado de la tesina que se espera de las novedades del Framework 3.5 de .NET en lo que a datos y en concreto a LINQ se refiere, y se ver cmo se consigue una gran integracin entre lenguaje y datos con LINQ to Objects, LINQ to SQL y LINQ to XML.

4.1 QU ES LINQ?
Cuando se escribe una aplicacin en .NET llega un momento en que necesitamos hacer persistir objetos a una base de datos, hacer una consulta en la base de datos y cargar los resultados en objetos. El problema en muchos casos es el vaco que existe entre el lenguaje de programacin y la base de datos. Tras muchos intentos de proporcionar bases de datos orientadas a objetos que estaran ms cerca de plataformas orientadas a objetos y lenguajes de programacin como C# o VB.NET, an siguen siendo dominantes las bases de datos relacionales y tienen que enfrentarse a accesos a datos y persistencia en todos sus programas. La motivacin de Microsoft a la hora de crear LINQ fue abordar las dificultades conceptuales y tcnicas encontradas cuando se utilizan bases de datos como lenguajes de programacin .NET y de esta manera LINQ proporciona una solucin para el problema del mapeado relacional de objetos as como simplificar la interaccin entre objetos y fuentes de datos. LINQ con el tiempo evoluciono y se convirti en un conjunto de herramientas de consulta integradas en el lenguaje de aplicacin general. Este conjunto de herramientas se pueden utilizar para acceder a datos que estn en memoria (LINQ to Objects), bases de datos (LINQ to SQL) , documentos XML (LINQ to XML) , un sistema de archivo o cualquier otra fuente. Por tanto LINQ unifica el acceso a datos, cualquiera que sea la fuente de datos y permite mezclar diferentes tipos de fuentes y realizar consultas de forma similar a estas fuentes. LINQ integra consultas directamente en lenguajes .NET como C# o VB.NET a travs de un conjunto de extensiones a estos lenguajes: LINQ significa Language INtegrated Query, Consulta integrada en los lenguajes.

Pgina | 56

Esto supone una gran ventaja para los desarrolladores ya que antes que existiera LINQ tenan que mezclar diferentes lenguajes como SQL, XML o XPath junto con varias tecnologas y APIs como ADO.NET o System.Xml en cada aplicacin. LINQ tiene unos aspectos claves que como la sintaxis que se utiliza de consulta permite acceder a cualquier tipo de dato y adems vamos a trabajar en un mundo altamente tipado. Por tanto esta tecnologa es un paso hacia un modelo de programacin ms declarativo.

4.1.1 LINQ COMO UN CONJUNTO DE HERRAMIENTAS Y EXTENSIONES DE LENGUAJE


Los tres proveedores principales de datos de LINQ y que explicaremos con ms detenimiento ms delante de la tesina (LINQ to Objects, LINQ to SQL y LINQ to XML) no son los nicos y LINQ est abierto a nuevas fuentes de datos. LINQ est formado por una base comn de operadores de consulta, expresiones de consulta y rboles de expresin que permiten que el uso de herramientas LINQ sea totalmente extensible. Es as que se pueden crear otras variantes de LINQ para proporcionar diversas formas de fuentes de datos. Y los vendedores de software lo estn aprovechando y estn lanzando implementaciones de LINQ (ejemplo LINQ to Amazon). Es el propio Microsoft el que tambin ha lanzado LINQ to Dataset y LINQ to Entities para dar soporte al nuevo ADO.NET Entity. La figura muestra cmo podemos representar los bloques de construccin LINQ y el conjunto de herramientas.

Pgina | 57

Lenguajes de Programacin: VB.NET, C# 3.0, etc.

Bloques de construccin LINQ

Operadores estndar de consulta

Expresiones de consulta rboles de expresin

Proveedores LINQ

LINQ to Objects

LINQ to XML

LINQ to SQL

LINQ to DataSet

LINQ to Entities

Fuentes de datos

Los proveedores de LINQ no son herramientas independientes, esto es posible ya que el marco de trabajo de LINQ se presenta como un conjunto de extensiones de lenguaje. El conjunto de extensiones de lenguaje que vienen con LINQ permiten formular consultas sobre varios tipos de almacenamiento de datos en los lenguajes de programacin, con esto se gana en integracin. La idea principal de LINQ es por tanto, que con C# por ejemplo nos va permitir acceder a datos y no ser necesario para el programador conocer otro lenguaje como SQL o otras API para realizar peticiones de datos.

4.1.2 ORGENES Y OBJETIVOS DEL PROYECTO LINQ


Es importante saber las metas que Microsoft tena cuando se propuso conseguir el proyecto LINQ. A continuacin se revisan los objetivos uno por uno y su motivacin. Tambin se trataran las relaciones que tiene LINQ con otros proyectos Microsoft como C, ObjectSpaces, WinFS o el soporte para XQuery en el marco de trabajo .NET.

Pgina | 58

4.1.2.1 L OS OBJETIVOS DEL PROYECTO LINQ

La tabla que se muestra a continuacin revisa los objetivos que estableci Microsoft para el proyecto LINQ para proporcionar una idea clara de lo que ofrece esta tecnologa.

Objetivo
Integrar objetos, datos relacionales y XML

Motivacin
Sintaxis de consulta unificada entre fuentes de datos para evitar diferentes lenguajes para diferentes fuentes de datos. Modelo sencillo para procesar todos los tipos de datos con independencia de la fuente o de la representacin en memoria.

Potencia como la de SQL y XQuery en C# y VB Modelo extensible para lenguajes

Integrar posibilidades de consulta en el propio lenguaje de programacin. Permitir implementacin programacin. para otros lenguajes de

Modelo extensible para mltiples fuentes de datos

Ser capaz de acceder a otras fuentes de datos adems de las bases de datos relacionales y XML. Acceder a que otros marcos de trabajo permitan el soporte LINQ para sus propias necesidades.

Verificacin de tipos seguros

Comprobacin del tipo en tiempo de compilacin para evitar problemas que se haban descubierto previamente slo en tiempo de ejecucin. El compilador capturar los errores en sus consultas.

Soporte ampliado para IntelliSense

Ayudar a los desarrolladores cuando escriben consultas para mejorar su productividad y ayudarles a trabajar con la nueva sintaxis. El editor le guiar cuando escribe consultas.

Soporte del depurador

Permitir que los desarrolladores depuren consultas LINQ paso a paso y con informacin de depuracin. Reutilizar las caractersticas que se han implementado en las versiones anteriores de los lenguajes. Evitar que se requiera un nuevo tiempo de ejecucin y crear innecesarios problemas de desarrollo. Ser capaz de utilizar las colecciones estndar y genricas, vinculacin de datos, controles de formularios Windows, etc.

Construido sobre la base de C# 1.0 y 2.0, VB .NET 7.0 y 8.0 Ejecutar sobre .NET 2.0 CLR

Mantener compatibilidad inversa 100%

Pgina | 59

La caracterstica ms importante de LINQ es sin duda la posibilidad de tratar con varios tipos de datos y fuentes, presentada en la tabla. Otra caracterstica esencial de LINQ es que est fuertemente tipado, que significa: Comprobacin en tiempo de compilacin para todas las consultas. IntelliSense con Visual Studio cuando escribimos consultas

NOTA Microsoft IntelliSense es la aplicacin de autocompletar, mejor conocido por su utilizacin en Microsoft Visual Studio entorno de desarrollo integrado. Adems de completar el smbolo de los nombres que el programador est escribiendo, IntelliSense sirve como documentacin y desambiguacin de los nombres de variables, funciones y mtodos de utilizacin de metadatos basados en la reflexin.

4.1.2.2 U N POCO DE HISTORIA

LINQ es el resultado de un largo proceso de investigacin por parte de Microsoft. Varios son los proyectos que han evolucionado sus lenguajes de programacin y mtodos de acceso a datos y que han derivado en LINQ to Objects, LINQ to XML (antes conocido como XLinq) y Linq to SQL (antes conocido como DLinq)

C
C fue un proyecto del Microsoft Research que ampliaba el lenguaje C# bsicamente en: Una extensin de flujo de control para concurrencia asncrona de rea ancha (antes conocido como Polyphonic C#) Una extensin de tipo de datos para XML y manipulacin de base de datos (antes conocido como Xen y como X#)

C se concibi para experimentar consultas integradas, mezclando C# y otros lenguajes como SQL o XQuery. La experiencia tras el lanzamiento de C y tratamiento de los datos supuso una serie de extensiones de C a .NET y el lenguaje C# y sus consultas al estilo SQL y el contenido XML fueron los primeros pasos. C incorporo el tipo de dato anlogo en el Framework 2.0 System.Collections.Generic.IEnumerable<T> , y entre otras cosas defini constructores para registros tipados que son similares a los tipos annimos que tenemos en C# 3.0 y VB .NET 9.0

O BJECT S PACES
ObjectSpaces fue el primer intento de Microsoft en el mapeado relacional de objeto, se trataba de una API de acceso a datos que permita que los datos fueran tratados como objetos, independientemente del almacn de datos. En 2004 ObjectSpaces dependa de WinFS (proyecto para un sistema de archivo relacional para Windows cancelado en 2006) Una vez que WinFS no se convertira en la primera versin de Windows Vista el mundo se dio cuenta que ObjectSpaces no vera la luz.

Pgina | 60

XQ UERY
De forma similar a ObjectSpaces y ms o menos al mismo tiempo Microsoft comenz a trabajar en el procesador XQuery. Se incluyo una beta en el Framework 2.0 pero al final no se decido pasar al lado del cliente en la versin final, solo SQLServer 2005 incluye en el cliente XQuery y ahora que se ha terminado el estndar XQuery se est considerando incluirlo en .NET. El problema principal con XQuery es que se trata de un lenguaje adicional que tendramos que aprender para tratar con XML Todos estos proyectos fallidos, aparcados o de pruebas tuvieron respuesta en el PDC de 2005 cuando se anuncio en proyecto LINQ. LINQ fue diseado por Anders Heljsberg y otros de Microsoft para abordar el desajuste de impedancia entre lenguajes de programacin como C# y VB .NET. Los proyectos anteriores solo sirvieron para beneficiarse de los trabajos de investigacin y as conseguir hacer consultas sobre cualquier cosa.

4.2 EVOLUCIN EN LOS LENGUAJES VB.NET Y C#


En este apartado se ver las nuevas extensiones de lenguaje que traen de la mano C# 3.0 y VB.NET 9.0. Estas caractersticas son principios bsicos de LINQ y es importante que antes de usar LINQ el programador las conozca, pero son parte integral de los lenguajes C# y VB.NET y se pueden utilizar por separado. Las principales extensiones de lenguaje son: Variables locales implcitamente tipadas Inicializadores de objeto y coleccin Expresiones lambda Mtodos de extensin Tipos annimos

Otras extensiones de lenguaje, que son importantes tenerlas en cuenta, pero no necesarias para trabajar con LINQ son por ejemplo las propiedades auto implementadas exclusiva para C#. VB.NET 9.0 presenta caractersticas de lenguaje, pero no estn relacionadas con LINQ como el operador If como ternario estilo al ? : de C# y como sustituto del IIf. Otras mejoras incluyen delegados relajados e inferencia mejorada de tipos genricos. Estas y otras no se entrarn a explicar por no estar relacionadas con LINQ. En los siguientes puntos se explicarn las extensiones principales y el uso que hace LINQ de ellas y que permite que las consultas se mezclen en los lenguajes de programacin.

4.2.1 EL EJEMPLO DE GUA


Como se ha indicado en el punto anterior las nuevas extensiones del lenguaje van a suponer un cambio a la hora de programar. Para demostrar y explicar con ms claridad las principales extensiones de lenguaje, las cuales sern detalladas en los siguientes puntos, tendremos un ejemplo que servir para entender y observarlas. Pgina | 61

Aprovechando el tema de la tesina y basndonos en que la realizacin de esta ha servido para explicar LINQ, el ejemplo de gua que se ha decido utilizar tendr que ver con el negocio de Agromutua (ver punto 1 de la tesina). Dentro de todas las tablas del proyecto se ha seleccionado la de Condicionado.Cultivo por la sencillez de esta para los ejemplos, filtrar, ordenar y ver demostraciones.

Como se explica en el apartado 1, todas las plizas que realiza Agromutua referentes a agricultura tienen un cultivo. Cuando incluimos dicho cultivo vendr marcado por 3 campos claves, que traducidos a la base de datos sern la clave primaria de la tabla.

Estos campos sern: Plan: indica el ao Lnea: engloban a una serie de cultivos (ej. Lnea 11 es de Tomate, y puede ser Tomate Fresco, Tomate Pelado o Tomate Concentrado ) Cultivo: el identificador del cultivo (Tomate Fresco es 1, Tomate Pelado es 2 y Tomate Concentrado es 3 )

El campo Descripcin es el que pone nombre al Cultivo y nos servir como referente a los nombres de los cultivos. Con el resto de campos no trabajaremos en los ejemplos por lo que podemos obviarlos.

Veamos un ejemplo:

Pgina | 62

En el siguiente ejemplo estamos utilizando LINQ to SQL. Se ha mapeado la tabla y se ha creado el DataContext (ver punto 2.5, Linq to SQL) y despus hemos realizado una consulta LINQ para obtener los resultados cuyo plan sea igual al 2009. Como la tabla tiene ms de 150 registros en el foreach se ha incluido un take(10) para obtener los primeros 10 resultados de la consulta. El resultado es el siguiente:

Como hemos visto ya tenemos un ejemplo de gua para nuevas demostraciones en las extensiones del lenguaje.

4.2.2 VARIABLES LOCALES IMPLCITAMENTE TIPADAS


C# 3.0 ofrece una caracterstica que permite declarar una variable local sin tener que especificar su tipo, para ello se utiliza la palabra clave var (Dim en VB.NET).

Pgina | 63

Fijemos en el ejemplo. Si queremos que el ao, que tiene que ser Integer sea 2009, lo podemos declarar as, de tal forma que implcitamente se tipa la variable ao, esto sucede ya que el compilador infiere el tipo de esta variable desde la expresin utilizada para inicializarla.

En la parte superior se demuestra que el compilador se va a quejar cuando una variable implcitamente tipada a Integer la pasamos a String. Podemos observar que la sintaxis que utilizamos para declarar las variables locales implcitamente tipadas es la misma que cuando declaramos una variable tipada de la forma tradicional. Vemos un fragmento de cdigo equivalente:

En el ejemplo que utilizbamos al principio (punto 2.2.1) vemos como utilizamos las variables implcitamente tipadas en la descripcin del ao, pero tambin para realizar la consulta LINQ, que implcitamente se tipa a IQueryable (veremos esta coleccin ms adelante) as como en el bucle foreach donde es importante tenerlo en cuenta ya que los elemento que recorre no sabe de qu tipo de datos se trata.

Pgina | 64

Por tanto la posibilidad de trabajar con las palabras clave var y Dim pueden ayudarnos a escribir fragmentos de cdigo ms cortos y poder reutilizarlo, en muchas ocasiones requieren que las acompaemos de otras caractersticas de LINQ.

4.2.3 INICIALIZADORES DE OBJETO Y COLECCIN


Estas caractersticas nos servirn de gran utilidad sobre todo cuando empezamos a escribir expresiones de consulta.

I NICIALIZADORES DE OBJETO
Los inicializadores de objeto nos permiten especificar valores para uno o ms campos o propiedades de un objeto en una sentencia. Permiten inicializaciones declarativas para todo los tipos de objetos. Hasta ahora, hemos podido inicializar objetos de primitivas como sigue:

Pero el problema se daba cuando tenamos que inicializar objetos, donde tenamos que utilizar cdigo parecido a este:

Con C# 3.0 y VB.NET podemos inicializar todos los objetos utilizando un enfoque inicializador (ejemplo en C#):

Las piezas de cdigo con y sin inicializadores de objeto generan el mismo cdigo IL. Por tanto los inicializadores de objeto simplemente ofrecen un mtodo abreviado.

Pgina | 65

I NICIALIZADORES DE COLECCIN
Otros inicializadores que se han aadido son los inicializadores de coleccin. Esta nueva sintaxis nos permite inicializar diferentes tipos de colecciones, con tal que implementen System.Collections.IEnumerable y proporcionan mtodos adecuados Add. Un ejemplo:

Estos inicializadores son particularmente tiles cuando se utilizan en la misma pieza de cdigo. Veamos unos ejemplos, el primero con inicializadores:

El segundo, mucho ms largo y equivalente pero sin inicializadores:

Por tanto nos van a permitir ahorrarnos mucho cdigo. Hay que tener en cuenta que podemos inicializar colecciones de clases que tengan implementada el mtodo Add de la clase IEnumerable.

Resumiendo, la utilizacin de inicializadores de objeto y coleccin nos permiten obtener diversas ventajas: Podemos inicializar un objeto dentro de una sola instruccin No necesitamos proporcionar un constructor para poder inicializar objetos sencillos No necesitamos varios constructores para inicializar diferentes propiedades de objetos

Pgina | 66

4.2.4 EXPRESIONES LAMBDA


Las expresiones lambda son unas de las nuevas caractersticas del lenguaje ms tiles que estn disponibles para LINQ. Basndose como su nombre indica en el clculo lambda, pueden verse como un paso hacia los lenguajes funcionales futuros como F#, aunque ya algunos lenguajes funcionales como Lisp utilizan notaciones lambda.

Nota El clculo lambda es un sistema formal diseado para investigar la definicin de funcin, la nocin de aplicacin de funciones y la recursin. Fue introducido por Alonzo Church y Stephen Kleene en la dcada de 1930; Church us el clculo lambda en 1936 para resolver el Entscheidungsproblem. Puede ser usado para definir de manera limpia y precisa qu es una "funcin computable". El clculo lambda tiene una gran influencia sobre los lenguajes funcionales, como Lisp, ML y Haskell.

En LINQ utilizaremos las expresiones lambda principalmente para realizar acciones de filtrado sobre colecciones.

La utilizacin de delegados nos permita pasar un mtodo como un parmetro a otro y conseguir un filtro, esta caractersticas ya estaba disponible en C# 1.0, pero se mejoro en la C# 2.0 para permitir trabajar con delegados mediante mtodos annimos que nos permiten utilizar cdigo ms corto y evitar la necesidad de escribir explcitamente los mtodos nombrados.

S INTAXIS DE LAS EXPRESIONES LAMBDA


En C#, una expresin lambda se escribe como una lista de parmetros, seguida por un =>, seguida por una expresin o un bloque de sentencia, tal y como se muestra en el ejemplo:

Expresin lambda

Parmetros de entrada Operador lambda

Expresin bloque de sentencia

Pgina | 67

El operador lambda se puede leer como va a. El lado izquierdo del operador especifica los parmetros de entrada y la parte derecha contiene la expresin o bloque de sentencia a evaluar. A modo de apunte, en el ejemplo anterior utilizamos una expresin lambda para incluirlo dentro de un Where de LINQ to SQL para obtener los cultivos con lnea igual a 2009. Si nos fijamos bien el bloque es equivalente al que incluamos en los ejemplos anteriores:

Existen dos tipos de expresin lambda: Lambda expresin: expresin al lado derecho Lambda sentencia: igual que la lambda expresin pero en su parte derecha costa de cualquier nmero de sentencias englobadas en llaves.

x => x + 1 x => { return x + 1; } (int x) => x + 1

Cuerpo de expresin, implcitamente tipado Cuerpo de sentencia, implcitamente tipado Cuerpo de expresin, explcitamente tipado Cuerpo de sentencia, explcitamente tipado Mltiples parmetros Cuerpo de expresin, no parmetros Cuerpo de sentencia, no parmetros

(int x) => { return x + 1; } ( x, y ) => x * y () => 1 () => Console.WriteLine()

Nota Los parmetros de una expresin lambda pueden encontrarse explcitamente o implcitamente tipados.

Pgina | 68

En VB.NET la sintaxis es diferente que en C#, el principal cambio es que comienzan por la palabra clave Function:

Palabra reservada Parmetros de entrada En VB.NET 9.0 no soporta sentencias lambdas. Expresin bloque de sentencia

4.2.5 MTODOS DE EXTENSIN


Siguiendo nuestro recorrido por las nuevas caractersticas de lenguaje, vamos a ver los mtodos de extensin. Los mtodos de extensin no van a permitir aadir mtodos a un tipo despus de haberlo definido.

4.2.5.1 C REAR UN MTODO DE EXTENSIN DE EJEMPLO

Para entender un poco mejor cmo funcionan los mtodos de extensin se crear un ejemplo y despus veremos algunos de los mtodos de extensin ya definidos. Imaginemos que en nuestro ejemplo queremos tener un mtodo esttico que nos imprima los valores del objeto Cultivo que viene en una coleccin despus de hacer una consulta en LINQ to SQL.

Pgina | 69

Con el cdigo que vemos arriba se obtendran los valores de la consulta y el mtodo esttico se encargara de realizar de hacer el bucle para devolver el valor y imprimirse en pantalla:

Pero el cdigo del ejemplo se podra mejorar transformado el mtodo esttico en un mtodo de extensin. Con esta nueva caracterstica de lenguaje podemos tratar con tipos existentes como si se hubieran ampliado con mtodos adicionales.

D ECLARAR MTODOS DE EXTENSIN EN C#


Para transformar un mtodo esttico en un mtodo de extensin en C#, todo lo que tenemos que hacer es incluir la palabra reservada this en el primer parmetro del mtodo.

Pgina | 70

Si examinamos la nueva versin del mtodo solo tenemos que tener en cuenta que hemos incluido la palabra this. La palabra clave this le dice al compilador que trate el mtodo como un mtodo de expresin, y por tanto le indica que este es un mtodo que amplia del tipo IEnumerable<Cultivo>. Resumiendo, para declara los mtodos de extensin: Se deben declarar en una clase no genrica esttica El mtodo puede tomar cualquier nmero de argumentos pero el primer parmetro debe ser del tipo que se ampla Debe estar precedido el primer parmetro por la palabra clave this

Con todo esto se ha conseguido ejecutar el ejemplo como si fuera un mtodo de la instancia IEnumerable<Cultivo>:

Fijmonos que adems nuestro mtodo sale en la lista de mtodos del IntelliSense para los tipos soportados por este mtodo, y las extensiones de mtodos con un icono especfico.

Pgina | 71

Esta caracterstica nos va a resultar clave para escribir consultas en LINQ.

D ECLARAR MTODOS DE EXTENSIN EN VB.NET


En VB.NET los mtodos de extensin son mtodos compartidos decorados con un atributo personalizado (System.Runtime.CompilerServices.ExtensionAttribute) que permite invocarles con sintaxis de mtodo de instancia (un mtodo de extensin puede ser un procedimiento Sub o un procedimiento Function.) Este atributo lo proporciona el nuevo ensamblador System.Core.dll.

Definiremos siempre los mtodos de extensin en VB.NET en un mdulo aparte como muestra el ejemplo.

El primer parmetro especifica qu tipo de datos ampla el mtodo. Cuando se ejecuta el mtodo, el primer parmetro se vincula a la instancia del tipo de datos contra la que se aplica el mtodo.

4.2.6 TIPOS ANNIMOS

Pgina | 72

La ltima de las caractersticas que se van a presentar son los tipos annimos, que utilizaran una sintaxis similar a los inicializadores de objeto. La idea de utilizar los tipos annimos es la de almacenar agrupaciones de datos en un objeto sin declarar previamente la clase.

Los objetos declarados que utilizan un tipo annimo solo puede ser declarados con las palabras reservadas Dim o var. Esto es porque un tipo annimo no tiene un nombre que podemos utilizar en nuestro cdigo. Los tipos annimos son tipos sin nombres, pero son tipos de cualquier forma. Esto significa que un tipo real se crea por el compilador. Por tanto si en nuestro cdigo de ejemplo incluimos un tipo annimo:

En la siguiente imagen podemos observar el ensamblado que se ha creado en nuestro programa al incluir el tipo annimo producido por el compilador.

Pgina | 73

Esta captura esta realizada con el .NET Reflector ( http://www.red-gate.com/products/reflector/ ) un programa libre que nos permite observar el cdigo compilado. Algunos problemas que podemos encontrar con los tipos annimos pueden ser que estos objetos realmente su utilidad es temporal, es decir, que se utilizan para un espacio de tiempo limitado. El problema viene cuando queremos trabajar con ellos y deseamos pasarlos a mtodos que entonces pueden surgir problemas con el tipo. El tipo del parmetro de entrada del mtodo en teora deber ser object, mientras que si el proceso es el contrario y es en un mtodo donde creamos el tipo annimo y lo deseamos pasar como valor de retorno del mtodo, tendra que ser tambin object aunque esto no es del todo cierto ya que en ocasiones lo mtodos van a forzar una conversin y de lo contrario pueden lanzar una excepcin. Un apunte importante ms sobre los tipos annimos es que en C# las instancias de estos son inmutables, entendiendo como inmutables que los valores de campo y propiedad se fijan para siempre. Si volvemos a fijarnos en el .NET Reflector y vemos las propiedades que se han creado, observamos que esas propiedades tienen mtodos getter y no setter.

Pgina | 74

La nica forma de asignar valores a las propiedades y a sus campos subyacentes es a travs del constructor de la clase. Cuando invocamos la sintaxis para inicializar una instancia de un tipo annimo, el constructor de ese tipo se invoca automticamente y los valores se establecen para siempre. Esto se hace para evitar posibles efectos secundarios en los lenguajes funcionales. Los objetos que no cambian de valor permiten acceso concurrente para trabajar mucho mejor. Esto ser til para en el futuro permitir PLINQ (Parallel LINQ), un proyecto de Microsoft para incorporar la concurrencia en consultas LINQ. Por tanto los tipos annimos inmutables nos lleva a .NET un paso ms cerca de un mundo de programacin ms funcional donde podemos utilizar cdigo libre de efectos secundarios.

Por otra parte, los tipos annimos inmutables hemos comentado que son para C#, VB.NET tiene un comportamiento diferente y los tipos annimos son mutables. Esto hace la necesidad de utilizar un modificador Key en las propiedades de un tipo.

Pgina | 75

4.3 BLOQUES DE CONSTRUCCIN LINQ


En el punto anterior se revisaron las adiciones del lenguaje hechas para VB.Net y C#, en este apartado se mostrarn nuevos conceptos nicos en LINQ basados en las caractersticas del apartado 4.2 de esta tesina. Se va a detallar las secuencias, los operadores estndar de consulta, expresiones de consulta y rboles de expresin, y por ltimo se ver como amplia LINQ el marco del Framework de .NET. Para comenzar este apartado de bloques de construccin en LINQ tenemos que conocer con exactitud cules son las incorporaciones ms significativas en los lenguajes que hemos tratado en el apartado anterior: Variables locales implcitamente tipadas Inicializadores de objeto Expresiones lambda Mtodos de extensin Tipos annimos

En la figura de a continuacin se muestran a modo de ejemplo estas caractersticas, donde GetCultivos2009() es un mtodo esttico de clase Cultivo que devuelve una List<Cultivo> del plan 2009 :

Variable implicitamente tipada

Expresin lamda

Mtodos de extensin Tipo annimo

Inicializador de objeto

El recorrido por este punto es muy importante y seguiremos este orden: Veremos que son las sentencias y como se utilizan en consultas LINQ Utilizacin de la expresiones y los operadores de consulta Veremos la importancia de una ejecucin en diferido y la utilizacin que hace LINQ de los rboles de expresin.

Pgina | 76

4.3.1 SECUENCIAS EN LINQ


El primer concepto de LINQ que se presentar sern las secuencias por su importancia y porque son las estructuras de datos ms utilizadas, por ellos es muy importante comprenderlas.

4.3.1.1 L A INTERFAZ IE NUMERABLE <T>

La interfaz IEnumerable<T> es una interfaz clave que encontraremos en todas partes cuando se utiliza LINQ. Para explicarla utilizaremos la figura que nos ha servido en la introduccin para explicar las extensiones del lenguaje:

Es importante comprender para que utilizamos esta consulta y que nos va a devolver. Nos va a devolver una lista de Cultivo, esto no sera interesante si no fuera porque las tablas implementan la interfaz genrica IEnumerable<T>. Esta interfaz que naci con .NET 2.0 y hace que se la utilicemos de tal forma que se implemente IEnumerable<Cultivo>. La importancia de esta interfaz reside en que los operadores estndar de consulta en LINQ como Where, OrderByDescending, Select implementan un objeto que espera este tipo.

Ejemplo de la implementacin del mtodo Where en nuestro ejemplo:

El mtodo Where es un mtodo de extensin, que se puede deducir por la presencia de la palabra reservada this en el primer parmetro, estos mtodos de extensin esta proporcionados por la clase System.Linq.Enumerable.

Pgina | 77

Por otra parte la aparicin de la sentencia yield return y el tipo de retorno en la firma lo convierte en un iterador.

4.3.1.2 E JECUCIN DIFERIDA DE CONSULTA

Las consultas LINQ se basan en una evaluacin perezosa, en otras palabras una ejecucin diferida. Este concepto es muy importante para los desarrolladores que utilizan LINQ ya que una misma consulta la van a poder utilizar distintas veces para obtener distintos resultados entre otras maniobras que se pueden hacer en el cdigo antes de ejecutarla.

Veamos un sencillo ejemplo para comprender lo que se desea explicar:

Y que da como resultado:

Pgina | 78

Los resultados muestran claramente que la consulta no se ejecuta inmediatamente. En su lugar, la consulta evala a medida que iteramos sobre ella. Por tanto la consulta no se ejecuta cuando es asignada a una variable, sino despus paso a paso. Una de las ventajas principales de la evaluacin diferida es que conserva recursos, y por tanto la fuente de datos no se itera hasta que no se desea a diferencia de la programacin clsica donde los contenidos de una tabla o lista se cargan en memoria. Esto es porque los resultados se proporcionan como una secuencia (implementado la interfaz IEnumerable). Otra ventaja es que nos permite definir la consulta en un punto y ejecutarla ms tarde, en otro punto o varios puntos para obtener resultados diferentes.

Veamos un ejemplo:

En este ejemplo se ha querido simular un mtodo que nos podra servir por ejemplo para implementar un sistema de filtrado de una bsqueda. Al mtodo le llegan una serie de parmetros y en el propio mtodo se define la consulta, despus se detecta si existe el parmetro de bsqueda y filtra por l. De esta forma la consulta no se ejecuta y le vamos dando forma poco a poco.

Fijmonos ahora en lo que se ha querido hacer en el return del mtodo. En l la consulta que por defecto tiene un comportamiento de ejecucin diferida se fuerza la ejecucin explcitamente, de tal forma que lo que devuelve el mtodo es una lista de objetos filtrados y ya tipados. Se ha forzado la ejecucin.

4.3.2 OPERADORES DE CONSULTA Y EXPRESIONES DE CONSULTA


Los mtodos de extensin que hasta ahora se estn utilizando en esta tesis previenen de la clase System.Linq.Enumerable y apartir de ahora los denominaremos operadores de consulta.

Pgina | 79

Los operadores de consulta se pueden combinar para desarrollar operaciones complejas y consultas sobre enumeraciones. Varios operadores de consulta estn predefinidos y abarcan un amplio rango de operaciones. Estas operaciones se denominan operadores de consulta. A continuacin se muestra una tabla clasificada acuerdo al tipo de operador [11]: Operador
Agregacin Aggregate Average Count LongCount Min Max Sum Concatenacin Concat Conversin Cast OfType ToArray ToDictionary ToList ToLookup ToSequence Elemento DefaultIfEmpty ElementAt Crea un elemento predeterminado para una secuencia vaca Devuelve el elemento de un ndice determinado en una secuencia Convierte los elementos de una secuencia en un tipo determinado Filtra los elementos de una secuencia de un tipo determinado Devuelve una matriz desde una secuencia Devuelve un diccionario desde una secuencia Devuelve una lista desde una secuencia Devuelve una bsqueda desde una secuencia Devuelve una secuencia de IEnumerable Concatena dos secuencias en una Realiza un mtodo personalizado sobre una secuencia Calcula el promedio de una secuencia de valores numricos Devuelve el nmero de elementos en una secuencia como un valor int Devuelve el nmero de elementos de una secuencia como un valor long Encuentra el nmero mnimo de una secuencia de nmeros Encuentra el nmero mximo de una secuencia de nmeros Suma los nmeros en una secuencia

Descripcin

ElementAtOrDefault Devuelve el elemento de un ndice determinado en una secuencia o un valor predeterminado si el ndice est fuera del intervalo First FirstOrDefault Devuelve el primer elemento de una secuencia Devuelve el primer elemento de una secuencia o un valor predeterminado si no se

Pgina | 80

encuentra ningn elemento Last LastOrDefault Devuelve el ltimo elemento de una secuencia Devuelve el ltimo elemento de una secuencia o un valor predeterminado si no se encuentra ningn elemento Single SingleOrDefault Devuelve el nico elemento de una secuencia Devuelve el nico elemento de una secuencia o un valor predeterminado si no se encuentra ningn elemento Igualdad SequenceEqual Generacin Empty Range Repeat Genera una secuencia vaca Genera una secuencia en funcin de un intervalo Genera una secuencia mediante la repeticin de un elemento un nmero determinado de veces Compara dos secuencias para ver si son equivalentes

Agrupacin GroupBy Unin GroupJoin Join Ordenacin OrderBy OrderByDescending ThenBy ThenByDescending Reverse Particin Skip SkipWhile Take Devuelve una secuencia que omite un nmero determinado de elementos Devuelve una secuencia que omite elementos que no cumplen una expresin Devuelve una secuencia que toma un nmero determinado de elementos Ordena una secuencia en funcin de los valores en orden ascendente Ordena una secuencia en funcin de los valores en orden descendente Ordena una secuencia que ya se ha ordenado en orden ascendente Ordena una secuencia que ya se ha ordenado en orden descendente Invierte el orden de los elementos de una secuencia Realiza una unin agrupada en dos secuencias Realiza una unin interior en dos secuencias Agrupa elementos en una secuencia en funcin de una agrupacin dada

Pgina | 81

TakeWhile Proyeccin Select SelectMany Cuantificadores All Any Contains Restriccin Where Establecimiento Distinct Except Intersect Union

Devuelve una secuencia que toma elementos que cumplen una expresin

Crea una proyeccin de elementos de una secuencia Crea una proyeccin uno a varios de elementos de una secuencia

Determina si todos los elementos de una secuencia cumplen una condicin Determina si algn elemento de una secuencia cumple una condicin Determina si una secuencia contiene un elemento dado

Filtra los elementos de una secuencia

Devuelve una secuencia sin elementos duplicados Devuelve una secuencia que representa la diferencia entre dos secuencias Devuelve una secuencia que representa la interseccin entre dos secuencias Devuelve una secuencia que representa la unin entre dos secuencias

Otro concepto clave de LINQ es la nueva sintaxis que se propone a la hora de integrarla en el lenguaje que hace que sea mucho ms sencilla y resulta ms familiarizada para los programadores que conocen SQL. Durante los ejemplos hemos visto llamadas a mtodos para realizar las consultas en cdigo LINQ pero veremos que en la mayora de casos podemos escribirlas como expresiones de consulta de tal forma que ganamos en similitud con SQL.

Mejor vase con un ejemplo la nueva sintaxis de las expresiones de consulta. Durante ejemplos anteriores utilizbamos este tipo de consulta:

Pero podemos escribirla de tal forma que parezca una consulta SQL:

Pgina | 82

Ambas consultas LINQ son semnticamente idnticas, la nica diferencia es que la segunda consulta es una abreviatura declarativa conveniente para cdigo que podra escribirse manualmente. Por tanto las expresiones de consulta permiten utilizar la potencia de los operadores de consulta con una sintaxis orientada a consulta SQL (ganando en legibilidad y simplicidad). Veamos la sintaxis en C# y VB.NET

SINTAXIS C#
from [ type ] id in source [ join [ type ] id in source on expr equals expr [ into id ]] [ from [ type ] id in source | let id = exp | where expression ] [ orderby ordering, ordering, ...] select exp | group expr by key [ into id query ]

SINTAXIS VB.NET
From id [As type] In source [, id2 [As type] In source2 [...] ] { Aggregate id [As type] In source _ [, id [As type2] In source2 [...] ] [ clause ] Into [alias =] aggregateExpresion [, [alias =] aggregateExpresion [] ] Distinct From id [As type] In source [, id2 [As type] In source2 []] Group [ column [, column2 []]] _ By keyExpr [, keyExpr2 [] _ Into groupAlias = Group [, aggregations] Pgina | 83

Group Join id [As type] In source On keyA Equals keyB [And keyA2 Equals keyB2 []] Into expressionList Join id In source [joinClause] [groupJoinClause ] _ On keyA Equals keyB [And keyA2 Equals keyB2 []] Let id = expression [,id2 = expresion2 []] Order By orderExpr [Ascending|Descending] _ [, orderExpr2 [Ascending|Descending] []] Select [alias =] columnExpr [,[alias2 =] columnExpr2[]] Skip count Skip While condition Take count Take While condition Where condition }

Si se compara la sintaxis de VB.NET es ms rica en cuanto a operadores de consulta estndar soportados. El compilador de .NET traduce automticamente la expresin de consulta en operadores de consulta estndar. An as no todos los operadores tienen palabras claves equivalentes en C# y VB.NET por lo que en muchas ocasiones ser ms sencillo invocar directamente al operador.

4.3.3 ARBOLES DE EXPRESIN


Los arboles de expresin permiten a LINQ extensibilidad avanzada y hacen posible en gran medida LINQ to SQL.

Cuando una expresin lambda se utiliza como datos en vez de cdigo se trata de un rbol de expresin. Vemos el ejemplo:

Pgina | 84

Este cdigo representa un mtodo (un delegado) que toma como parmetro un entero y devuelve un booleano.

Vemosla como un rbol de expresin:

El compilador de .NET reconoce este tipo Expression<TDelegate> y hace que se comporte como Func<T, TResult> evaluando la expresin y haciendo que se comporte como un rbol de expresin. Obsrvese como las expresiones lambda con cuerpo de expresin se pueden expresar como arboles de expresin. Cuando el compilador construye el rbol de expresin no se puede modificar en tiempo de ejecucin. Ejemplo, un rbol de expresin generado por el compilador:

LambdaExpresion
NodeType = Lambda

Parmetros ParameterExpresion
NodeType = Parameter

Cuerpo BinaryExpresion
NodeType = Equal

Izquierda

Derecha

BinaryExpresion referencias
NodeType = And

ConstantExpresion
NodeType = Lambda

Izquierda Derecha LambdaExpresion


NodeType = Lambda Type = Int32

ConstantExpresion
NodeType = Constant

Pgina | 85

A modo resumen podemos decir que las expresiones lambda se pueden representar como cdigo (delegados) o como datos (rboles de expresin). Asignada a un delegado, una expresin lambda emite cdigo IL; asignada a Expression<TDelegate>, emite un rbol de expresin, que es una estructura de datos en memoria que representa lambda analizada

4.3.4.1 IQ UERYABLE , OTRA FORMA DE REALIZAR LA EJECUCIN DIFERIDA

En un punto anterior de la tesina se ha visto una forma de realizar consultas diferidas mediante la interfaz IEnumerable<T> y iteradores. Los arboles de expresin son la base de otra forma de realizar las consultas fueras del proceso.

Este tipo de consulta diferida es utilizada sobretodo en LINQ to SQL, escribiendo la consulta y no ejecutndose hasta que no accede al bucle.

El comportamiento es similar al de IEnumerable<T> pero esta vez el tipo cultivo no es IEnumerable<Cultivo>, sino IQueryable<Cultivo>. La forma de procesar este tipo es diferente que como sucede en las secuencias, IQueryable <T> recibe un rbol de expresin que puede inspeccionar para decidir que procesado debera realizar. En el ejemplo en el momento que se comienza el bucle se genera la SQL, se ejecuta y se devuelven los objetos de tipo Cultivo. La ejecucin de consulta diferida con rboles de expresin permite a LINQ to SQL optimizar una consulta que contiene mltiples consultas anidadas o complejas en el ms reducido nmero de sentencias SQL eficientes posibles, mejorando el patrn de pipeling que utiliza IEnumerable.

Pgina | 86

4.3.5 MARCO DE .NET, LAS DLL Y ESPACIOS DE NOMBRE LINQ


Las clases y ensamblajes (DLL) que utiliza LINQ vienen distribuidas en el .NET Framework 3.5 de Microsoft.

La librera principal que se utilizar ser System.Core.dll (por defecto se hace referencia a esta librera al crear una nueva solucin en Visual Studio 2008). Para escribir consultas LINQ to Objects ser necesario utilizar el espacio de nombres System.Linq.

Pgina | 87

4.4 . LINQ TO OBJECTS


En los puntos anteriores de este captulo se han presentado las nuevas caractersticas del lenguaje y los conceptos de LINQ. En los tres siguientes puntos veremos ejemplos de los tipos LINQ, en este caso trataremos LINQ to Objects. LINQ to Objects podra decirse que es el tipo base de LINQ, por la sencilla razn de que la principal caracterstica es tratar colecciones de objetos en memoria y teniendo en cuenta que si se tiene una fuente de datos que carga los datos en memoria para posteriormente operar con ellos podra decirse que es el tipo LINQ que ms se utiliza a la hora de desarrollar aplicaciones utilizando LINQ.

4.4.1. LINQ CON COLECCIONES DE MEMORIA


En realidad no todo se puede consultar con LINQ to Objets, pero si la mayora de colecciones genricas de .NET. Todo lo que se requiere para que una coleccin sea consultable con LINQ es que implemente la interfaz IEnumerable<T> (ver punto 4.3.1.1 de la tesina). Normalmente casi todas las colecciones genricas de .NET implementan dicha interfaz. Algunas de estas colecciones genricas son: Arrays: de cualquier tipo de datos. Ej. Object[] array = {String, 12 , true, a} Listas genricas: o System.Collections.Generic.List<T> o System.Collections.Generic.LinkedList<T> o System.Collections.Generic.Queue<T> o System.Collections.Generic.Stack<T> o System.Collections.Generic.HashSet<T> o System.Collections.ObjectModel.Collection<T> o System.ComponentModel.BindingList<T> Diccionarios genricos: implementan IEnumerable<KeyValuePair<TKey,TValue>> donde la estructura KeyValuePair contiene las propiedades Key y Value tipadas. o System.Collections.Generic.Dictionaty<TKey,TValue> o System.Collections.Generic.SortedDictionary<TKey,TValue> o System.Collections.Generic.SortedList<TKey,TValue> Cadenas: a primera vista System.String no se percibe como una coleccin pero en realidad implementa IEnumerable<Char>

Las colecciones que se proporcionan anteriormente son colecciones proporcionadas por el marco de .NET pero debe incidirse en la idea que cualquier otro tipo de coleccin que implemente la interfaz IEnumerable<T> podr ser manipulada por LINQ to Objetcs y las operaciones soportadas pueden consultarse en el punto 4.3.2 de la tesina, las operaciones de consulta estndar. En determinadas ocasiones en programador se puede encontrar con que la coleccin con la que trabaja no implementa dicha interfaz. De hecho solo las colecciones fuertemente tipadas implementan esta interfaz. Las colecciones no genricas no implementan IEnumerable<T> pero implementan IEnumerable, con lo que se soluciona el problema utilizando operadores de consulta Cast y OfType.

Pgina | 88

4.5 LINQ TO SQL


En el punto anterior se han abordado el trabajo en LINQ centrado en los objetos en memoria para los cuales era necesario trabajar sobre la interfaz IEnumerable<T>. Aunque se hace muy necesario tener esta caracterstica, no es suficiente para abordar la problemtica de interactuar con una base de datos relacional como SQL Server. En este punto se va a presentar LINQ to SQL, un tipo de LINQ que nos permite mapear una base de datos relacional, realizar consultas sobre ella en LINQ y ampliar las clases generadas, lo que permite ahorrarse una tediosa faena desde el punto de vista de cmo se estaba haciendo hasta ahora con ADO.NET. Comenzaremos por echar un vistazo a las opciones de mapeado existentes y nos centraremos en la que nos proporciona Visual Studio 2008, se explicar la interaccin entre las clases generadas y la base de datos abordando los tpicos problemas y se terminar explicando cmo se pueden ampliar las clases generadas al realizar el mapeado de la base de datos relacional.

4.5.1. MAPEAR LINQ TO SQL


Para eliminar el cdigo repetitivo de ADO.NET y facilitar el acceso a datos de una base de datos relacional surge LINQ to SQL, y el primer paso que se debe hacer para poder tener dicha interaccin es el mapeado de las tablas a clases. Cuando se habla de mapear se entiende que se estn generando una serie de clases que emulan las propiedades, relaciones y tipos de la base de datos. Proporcionando clases que nos permitirn traducir nuestras construcciones de consulta declarativas en una sintaxis que pueda reconocer nuestra base de datos. Con esto conseguimos un marco de trabajo que gestiones el mapeado de las tablas relacionales a nuestras clases de entidad de negocio. Veamos la lista de opciones que podemos tener a la hora de mapear la base de datos: Atributos declarados en lnea con sus clases, o dicho de otra forma, hacer el mapeo manualmente. Utilizando XML externos Herramienta SqlMetal de lnea de comando Herramienta grfica LINQ to SQL Designer

Ya que en el proyecto Agromutua.Web que estamos abordando se ha utilizado la herramienta grfica de Visual Studio 2008 LINQ to SQL Designer, se abordar el mapeo viendo su uso. Esta herramienta es muy til, ya que aparte de proporcionar el mapeo tambin provee de una visin grfica de la base de datos que tenemos mapeada y proporciona los enlaces establecidos. Para empezar el proceso se deber crear un nuevo archivo de base de datos en el proyecto seleccionando la de la lista de ficheros la opcin Clases de LINQ to SQL

Pgina | 89

El resultado de aadir este archivo al proyecto donde se est trabajando es la creacin de un archivo con extensin DBML (Database Markup Language).

Pgina | 90

Nada ms crearlo se abrir automticamente la edicin de este archivo con el LINQ to SQL Designer de Visual Studio 2008, pero para poder manipular y aadir las tablas a mapear ser necesario disponer de una conexin a un servidor de base de datos. En el ejemplo se conecta con SQL Server 2005

Una vez se enlace el servidor de base de datos con la base de datos aparecen todas las tablas contenidas en la base de datos relacional listas para ser arrastradas al diseador que es la parte situada en el centro de la imagen.

Pgina | 91

Y a continuacin se pueden arrastrar las tablas que se deseen para que el diseador mapee automticamente cada tabla y sus relaciones. En este ejemplo se han arrastrado las tablas de dbo.Poliza, dbo.Colectivo y Maestros.Linea y se observa a simple vista todos sus campos, restricciones y asociaciones han sido correctamente creadas.

El editor grfico permite la manipulacin y edicin de todo lo que se ha arrastrado, por lo que se puede borrar campos, aadir restricciones, etc. De esta forma cada caja (tabla de la base de datos) que se observa se convertir en una clase, y cada flecha en una relacin. En la parte de Propiedades se pueden configurar las opciones referentes a la cadena de conexin y al nombre del DataContext. Una vez se guarde las tablas que queremos mapear, se generaran un archivo de metadatos basado en XML (el DBML) que especifica cmo se generan las clases. Otro archivo XML que contiene informacin del diseo visual en la superficie del diseador (XXX.dbml.layout) y las clases generadas en un archivo (X.designer.cs)

Pgina | 92

Si se desea ver las relaciones y propiedades que se han creado se puede hacer con el botn derecho sobre el DBML Abrir con -> Edito de XML y se apreciaran las conversiones que se han realizado.

Una vez realizados estos sencillos pasos ya se puede comenzar a trabajar con LINQ to SQL. En los siguientes puntos de este captulo se ver que tendremos que tener en cuenta y la importancia del DataContext.

4.5.2. INTERACCIN DE LINQ TO SQL CON LA BD


El DataContext, que se muestra en la figura de abajo, se localiza en el corazn de LINQ to SQL y maneja la mayor parte del trabajo. El DataContext gestiona la conexin con la base de datos, indicndole en sus propiedades la cadena de conexin o incluyndola como parmetro en la creacin del objeto. Por tanto con la utilizacin de este objeto no habr que preocuparse de la apertura y cierre de la conexin ya que se encargar de manejarla.

Pgina | 93

Servicios ofrecidos por el DataContext:

DataContext Gestin de la conexin Traduccin y ejecucin de consulta Identidad de objeto Registro de cambio

Se puede configurar la cadena de conexin en el app.config de la aplicacin web de tal forma que despus se indique en las propiedades del DataContext con el editor grfico, este proceso se hace normalmente automtico pero el desarrollador podra querer cambiar la conexin en algn momento determinado.

Con esto se consigue tener un enlace que adems de gestionar la conexin con la base de datos, realice las pertinentes comprobaciones para su estabilidad entre la base de datos y LINQ to SQL. Vase un ejemplo completo en el que despus de ser creado DataContext es utilizado para realizar una consulta LINQ to SQL y obtener los pertinentes resultados de la base de datos: Pgina | 94

Pero adems de ver cmo se crean instancias del DataContext es importante comprender el ciclo de vida de la entidad mapeada de la base de datos. El DataContext realiza un papel fundamental al gestionar la conexin, evaluar los mapeados y traducir los rboles de expresin en estructuras consumibles. Las aplicaciones que se realizan funcionan con los datos obtenidos de las consultas, visualizndose y realizando los cambios oportunos. Para ello el DataContext se encarga en LINQ to SQL de disponer de un mecanismo y detectar los cambios que se hacen en los valores y registrarlos hasta que no se necesiten, manejando el ciclo de vida del objeto.

DataContext Gestin de la conexin

Traduccin y ejecucin de consulta Identidad de objeto

Aplicacin

Registro de cambio

Base de datos

Contexto personalizado de datos

Pgina | 95

El ciclo de vida comienza cuando leemos por primera vez un valor de la base de datos. Antes de pasar el objeto resultante al cdigo de la aplicacin, DataContext mantiene una referencia al objeto. Un servicio de gestin de identidad rastra el objeto en una lista indexada por la identidad designada en el mapeado. Al retener este valor, podemos hacer referencia al objeto segn su identidad de objeto. Cada vez que se consulta valores de la base de datos DataContext comprueba con el servido de gestin de identidad para ver si un objeto con la misma identidad ya se ha proporcionado en una consulta anterior. Si es as, DataContext devolver el valor almacenado en la cache interna en lugar de volver a mapear la fila de la tabla. Al mantenerse el valor original se puede proporcionar al usuario hacer cambios sin que afecten a los otros usuarios, ya que el dato solo estar en su copia de datos. Por tanto no hay que preocuparse por problemas de concurrencia hasta que los datos se envan. Cuando se est trabajando con objetos de la base de datos mapeados, en algn momento puede surgir el problema o la necesidad de saber realmente que consulta se est realizando, ya que como se ha indicado ms arriba LINQ nos va a servir para interactuar entre la base de datos y la aplicacin de una forma sencilla y sin necesidad de aprender un lenguaje de consulta SQL, pero realmente lo que est haciendo es transformado lo que se opera con los objetos mapeados a consultas SQL que sern ejecutadas contra la base de datos. As se debe conocer que existen varias formas de conocer que consulta se est ejecutando: Herramienta de SQL Server Profiler que viene con SQL Server. Propiedad Log de DataContext hacia un flujo de salida, por ejemplo la consola o un archivo. Utilizando la herramienta Query Visualizer de Microsoft que viene de forma separada de Visual Studio 2008

Pgina | 96

Si se observa las consultas que se lanzan hacia el servidor, en concreto las que contienen filtrado, se detecta que son consultas parametrizadas, lo que implica que LINQ to SQL solventa dos problemas de comunes en las consultas a base de datos. En primer lugar, la gran vulnerabilidad que supone la inyeccin SQL. La segunda mejora es que LINQ saca partido a la cache, permitiendo rentabilizarla y reducir tiempos en posteriores consultas repetidas.

4.5.3. CARGA DE DATOS EN MEMORIA


Cuando vamos a buscar datos a la base de datos, LINQ to SQL utiliza una tcnica denominada ejecucin diferida. La ejecucin diferida permite que los datos se carguen en memoria cuando se solicite. Esperar a acceder a los valores hasta que se necesitan se denomina carga perezosa. Cuando mostramos los resultados, la carga perezosa ofrece el beneficio de recuperar solamente los datos cuando se solicitan y devolver solamente los datos solicitados. En muchos casos esto proporciona beneficios de rendimiento, pero en otros casos, puede conducir a un resultado imprevisto. En este ejemplo se dispone las relaciones entre Pliza, Colectivo y Lnea que se observan.

Cuando se realiza una consulta y se desea obtener un objeto pliza concreto, se puede pensar que solo se est realizando una consulta a la base de datos, pero si se observa el fragmento de cdigo de abajo se ve que LINQ to SQL te permite navegar por las relaciones y obtener datos de tablas relacionadas. Por tanto cuando se van a realizar ms consultas y se van a traer datos asociados al registro de pliza que se deseaba, es decir, todos los registros hijos de Colectivo y a su vez todos los registros de Lnea. En este punto algo que en principio era bueno, la carga perezosa, se convierte en algo malo respecto al rendimiento y a la carga.

Pgina | 97

LINQ to SQL da la posibilidad de cargar los datos inmediatamente, podemos almacenarlos previamente en tablas o listas con los mtodos ToList, ToDictionary, ToLookup o ToArray. Al indicar a LINQ que queremos recuperar los resultados, se fuerza a LINQ to SQL a ir a buscar inmediatamente los resultas y completar la nueva lista o tabla. El nico inconveniente que se produce es que al convertir los resultado a la estructura de datos se pierden los beneficios de LINQ to SQL. Con estos mtodos no se pierden las llamadas de consultas a las tablas dependientes pero si nos da la posibilidad de almacenar los datos para posteriores usos. Afortunadamente se tiene la opcin DataLoadOptions del DataContext que permite especificar los datos que se quieren cargar, eliminando las mltiples subconsultas que eran necesarias con la carga perezosa.

4.5.4. ACTUALIZACIN Y BORRADO DE DATOS


LINQ to SQL no solo se reduce a la bsqueda de datos, sera una funcionalidad reducida, por lo que tambin permite el uso de actualizaciones y borrado de datos. Lo importante es disponer de un DataContext persistente y a partir de ese momento utilizar mtodos estndar de LINQ para realizar las operaciones mencionadas. Para actualizar registros se utiliza SubmitChanges en el objeto DataContext, vase un ejemplo donde se muestra la Lnea y su Descripcin:

Pgina | 98

Con el siguiente cdigo, incluyendo el SubmitChanges() se actualiza y ejecutando otra vez el fragmento de cdigo de arriba se observa que se han actualizado los datos de la base de datos.

Pgina | 99

De la misma forma se opera para crear y eliminar registros, utilizando los mtodos InsertOnSubmit() y DeleteOnSubmit() respectivamente. En el ejemplo daramos de alta y de baja un registro.

Lo que se acaba de presentar anteriormente es realmente til para trabajar con escenarios desconectados, normalmente trabajar en un entorno conectado con el contexto es totalmente desaconsejable, pngase de ejemplo un pgina en ASP.NET donde es necesario encapsular normalmente los datos en sesiones o cach. As cuando utilizamos los mtodos InsertOnSubmit, DeleteOnSubmit y SubmitChanges va a ser el DataContext el encargado de gestionar y resolver los posibles conflictos con registros existentes. Por eso la existencia normalmente de varios usuarios en las aplicaciones hace realmente importante una buena gestin de la concurrencia. Resuelto el problema de la concurrencia pesimista y los bloqueos con la aparicin de la API para .NET, ADO.NET se resolvi la problemtica del escenario desconectado apareciendo la alternativa de la concurrencia optimista donde se permite hacer cambios a todos los usuarios en su copia de datos para posteriormente comparar y actualizar en la base de datos real. De hecho cuando se invoca SubmitChanges, el DataContext implementar automticamente

Pgina | 100

concurrencia optimista, generando este la sentencia UPDATE en el servidor y gestionando los conflictos. LINQ to SQL permite gestionar las excepciones de concurrencia sobrescribiendo, no actualizando o utilizando transacciones.

4.5.5. AMPLIAR LA CAPA DE NEGOCIO


Este apartado revisa algunas de las funcionalidades avanzadas que ofrece LINQ to SQL y que se estn utilizando en el proyecto Agromutua.WEB. Principalmente la caractersticas que se van a presentar se centrar en mejorar el mantenimiento y la reutilizacin mediante el uso de clases parciales, mtodos parciales y herencia de objeto. Utilizar practicas de programacin orientada a objeto aade funcionalidad al dominio de negocio al tomar estructuras base de objeto y ampliarlas para aadir la lgica personalizada de negocio. Anterior a .NET 2.0, la principal forma de ampliar estas estructuras era al heredar de una clase base. Con .NET 2.0, Microsoft incluyo el concepto de clases parciales. Con estas clases parciales, podemos aislar conjuntos especficos de funcionalidad en archivos separados y despus permitir que el compilador los fusione en una sola clase. Por defecto las herramientas mencionadas en el punto 4.5.1 (el diseador y el SqlMetal) generan las definiciones de las clases como clases parciales automticamente, as va a permitir agregar al usuario otras clases parciales para realizar validaciones extra, por ejemplo. Otra novedad en los lenguajes C#3.0 y VB 9.0 es la incorporacin de una caracterstica de lenguaje denominada mtodos parciales para permitir incluir funcionalidad en un mtodo. Normalmente, cuando trabajamos con entidades de negocio tenemos que proporcionar procesado adicional como parte de un constructor o durante un cambio de propiedad. Anteriormente a C#3.0 y VB 9.0 se deberan crear clases abstractas y permitir que las nuevas clases se anulen al implementar las clases. Utilizar esta forma de herencia puede ser problemtico en LINQ to SQL debido al modelo de implementacin de herencia, de ah la necesidad de disponer los mtodos parciales. Con los mtodos parciales, se pueden insertar stubs de mtodo en nuestro cdigo generado. Si se implementa el mtodo en nuestro cdigo de negocio, el compilador aadir la funcionalidad. Si no lo implementamos, el compilador eliminara el mtodo vacio. Cuando generamos un mapeo con el diseador de LINQ to SQL o SqlMetal se insertan en las definiciones de clase.

Pgina | 101

En la siguiente captura se ve la clase parcial con los mtodos parciales que ha generado el diseador de la tabla Lnea.

Pgina | 102

5. LINQ EN LA ARQUITECTURA MULTICAPA


La aparicin de LINQ supone una revolucin en lo que se refiere con la interaccin de la base de datos y el tratamiento de estos. Pero a la hora de comenzar un nuevo desarrollo al desarrollador se le aade una cuestin nueva referente al lugar que debe ocupar LINQ dentro de sus aplicaciones. Durante los captulos anteriores se han realizando ejemplos de pequeas consultas y operaciones que utilizaban LINQ pero no se abordado el problema de donde incluir la interaccin de LINQ con la base de datos dentro de una arquitectura. En este captulo se va abordar el debate de las diferentes opciones que se pueden tomar respecto al lugar de LINQ dentro del desarrollo de una aplicacin multicapa, teniendo en cuenta que LINQ no solamente es una tecnologa de consulta genrica sino un conjunto completo de herramientas que puede tratar con bases de datos relacionales, XML, DataSets, colecciones de objetos en memoria y muchas ms fuentes de datos gracias a su ampliabilidad. Esto significa, que para el desarrollador la utilizacin de LINQ en su cdigo se convierta en algo dominante. Primero se repasar una arquitectura multicapa de 3 capas, la ms bsica y se ver el lugar que ocupa LINQ to SQL dentro de ella, que influir bastante en la arquitectura por lo que es necesario para el desarrollador deba pensar en cmo utilizarla. Despus se analizar donde pueden ser tiles LINQ to XML y LINQ to Objects en general.

5.1 LINQ TO SQL Y LA CAPA DE ACCESO A DATOS


EL tipo de LINQ que tiene probablemente ms impacto sobre la arquitectura es LINQ to SQL. Por esta razn en este punto del captulo vamos a analizar la tpica arquitectura de tres capas y qu funcin desempea LINQ to SQL en ella, que puede ser tan importante hasta el punto de reconsiderar en muchas ocasiones la propia naturaleza de una capa de acceso a datos.

5.1.1 LA ARQUITECTURA TRADICIONAL DE TRES CAPAS


Aunque muchas aplicaciones en una arquitectura multicapa se dividen en ms de tres capas, en este punto nos servir para exponer el impacto de LINQ to SQL con una arquitectura bsica de tres capas. Una arquitectura de tres capas es cualquier sistema que fuerza una separacin general entre las siguientes tres partes: La capa de presentacin: gestiona el nivel ms alto de la aplicacin, la interfaz de usuario. La funcin principal de esta capa es traducir tareas y resultados en algo que el usuario pueda entender. La capa de presentacin posee componentes necesarios para interactuar con el usuario de la aplicacin: pginas web o formularios de cliente entre otros. La capa lgica o capa de negocio: Coordina la aplicacin, procesa comandos, toma decisiones y evala lgicas y lleva a cabo clculos. Tambin mueve y proceso datos entre las dos capas de alrededor.

Pgina | 103

La capa de acceso a datos o persistencia: almacena y recupera informacin de una base de datos, sistema de archivo o cualquier otro almacn. La informacin se pasa a la capa de lgica de negocio para procesarla.

Capa de presentacin Interfaz usuario

Capa Lgica de negocio Servicios de negocio

Capa de acceso a datos Objetos de acceso a datos

Base de DATOS

La idea principal de dividir la aplicacin en varias capas es separar las funcionalidades comunes para agrupar intereses y optimizar independientemente de otras funciones. De esta forma un fallo en determinada capa solo afectara a esta y no har que otras capas fallen y en general facilitar entender, disear y gestionar complejos interdependientes que se solapen lo menos posible.

5.1.2. LA CAPA DE ACCESO A DATOS Y LINQ TO SQL


Durante el desarrollo de la tesina se han ido incluyendo ejemplos de pequeas consultas LINQ to SQL, pero nunca se ha hecho referencia a su utilizacin en una arquitectura. Eso es porque hasta ahora se ha utilizando LINQ to SQL de una forma RAD (Rapid Application Development, o Desarrollo Rpido de Aplicaciones). El RAD es una metodologa que implica un desarrollo de aplicaciones iterativo y de construccin de prototipos. En este punto se va a explicar que cuando un desarrollador decide utilizar LINQ to SQL puede seguir una o dos direcciones: bien utilizar LINQ to SQL de forma transparente en toda su aplicacin haciendo uso de l cuando lo vea necesario (forma RAD que se ha indicado) o puede seguir el modelo tradicional de tres capas con acceso a datos que se construye utilizando LINQ to SQL.

Pgina | 104

Con la primera opcin el programador tendr todos los beneficios de LINQ to SQL, con la segunda opcin obtiene los beneficios de tener una capa de acceso a datos bien definida. Se describir a continuacin cada opcin por separado.

5.1.2.1. U TILIZAR LINQ TO SQL COMO CAPA DE ACCESO A DATOS

Cuando incluimos consultas en cualquier parte de nuestra aplicacin, LINQ to SQL est actuando como una capa de acceso a datos mnima. Las clases que generamos con el LINQ to SQL Designer y su posterior archivo .dbml son las entidades de datos que forma el modelo de objeto de datos. El cdigo que SQL que lleva a cabo las llamadas a la base de datos para cargar o guardar datos de las entidades de datos se generan por un DataContext LINQ to SQL basado en consultas que se escriben en algn lenguaje de programacin .NET. En la presentacin de este captulo se comenta que a utilizar LINQ sin crear una capa de datos real podra obtener todos los beneficios de LINQ to SQL, a continuacin se detallan dichos beneficios. Cuando se desarrollan aplicaciones a menudo, el desarrollador se da cuenta que en cada pgina necesita consultas distintas o puntuales para obtener algn dato concreto. Es muy posible que esta consulta que se haga en un sitio puntual no se vaya a realizar en ms partes de la aplicacin. Por tanto no existe una capa de datos real que encaje en todos lados. Es decir, si existe cualquier cada de acceso a datos que tiene cdigo genrico suficiente para satisfacer las necesidades de cada pgina, puede ser acosta del rendimiento. De lo descrito en el prrafo anterior se obtiene la conclusin de que si se escribe directamente en la pgina la consulta puede obtener consultas que coincidan exactamente con las necesidades del programador para esa pgina en concreto. Reduciendo la sobrecarga de la base de datos y el trfico de red. Veamos un ejemplo:

En este ejemplo se muestra un ejemplo de una consulta que podra ser utilizada solo en una pgina por su alto nivel de detalle, esta obteniendo solo cultivos con una descripcion mayor de 20 caracteres. Otro beneficio a destacar, es cuando se recuperan datos de la base de datos, se pueden seleccionar facilmente solo los campos con los que se van a trabajar y as evitar cargar datos inncesarios que no se van a utilizar. Por ejemplo y utilizando la consulta anterior, solo se quieren recuperar las lineas de los cultivos con la descripcin mayor de 20 caracteres:

Pgina | 105

Posiblemente al disponer de una capa de datos real, hubiera sido necesario obtener todo el objeto Cultivo, no solamente las lineas. Siempre se puede disear una funcion y seleccionar los datos a devolver pero esto complica el codigo y posiblemente se dispondr de muchos metodos y funciones que pocas veces se utilizan. Tambien, cuando realizamos las consultas genericas a servidor de base de datos, la ordenacin y los agrupamientos los hara siempre de la misma forma por lo que tambien se le pueden indicar ms operaciones.

Para resumir los beneficios que se han mencionado, se podria indicar que la genericidad tiene un coste. Lo que permite utilizar LINQ to SQL de una forma RAD es la personalizacion. Pero teniendo en cuenta que existe una segunda posibilidad, se exponen una serie de limitaciones que supone aplicar consultas LINQ to SQL de una forma RAD: Escribir consultas de base de datos en su capa de presentacin no es tan malo como utilizar codigo SQL en ella, pero sigue siendo una practica cuestionable. Ya que se mezcla codigo de acceso a datos con logica de negocio y codigo de presentacion, y por tanto se estan abandonando las buenas practicas de la separacin en capas. No existira un solo lugar donde mirar y ver todo lo realcionado con el acceso a datos, ya que todas las consultas estaran dispersas por el codigo. Por tanto cualquier modificacin acarrearia dificiles tareas de actualizacin y mantenimiento. La reutilizacin de codigo pasa a un segundo plano, ya que no se podran compartir consultas. Se podra enriquecer la clase DataContext con consultas predefinidas o cdigo de validacion, pero carecera de mucho sentido comprado con una capa real de acceso a datos. Mapear esta limitado al modelo de tabla por clase. Si se desea tener entidades que se extienden varias tablas debser ser mejor utilizar algo diferente de LINQ to SQL o crear una capa de aplicacin que abstrae esta limitacin y devuelve entidades enriquecidas.

Para evitar este tipo de uso pasamos a explicar la opcion opuesta, en la que LINQ to SQL se utiliza como capa de acceso a datos real.

5.1.2.2. U TILIZAR LINQ TO SQL COMO CAPA DE ACCESO A DATOS REAL

A la hora de poseer LINQ to SQL como capa de acceso a datos en nuestros proyectos podemos disponer de verdaderos beneficios de una capa real de acceso a datos y algunos de LINQ to SQL. La capa de persistencia o acceso a datos es la ltima capa de la arquitectura multinivel, as una caracterisitca de esta capa es el ocultamiento de todo tipo de datos hacia la base de datos y la tecnologia de acceso utilizada, tanto como si es una herramienta de mapeado objeto-relacional, SQL generado a mano, llamadas a procedimientos, etc. Consiguiendo mayor abstraccin en capas superiores, aspecto importante en las arquitecturas multinivel.

Pgina | 106

As la capa de acceso a datos tampoco debe imponer ninguna restriccion significativa en el diseo del modelo de objeto de negocio ( o modelo de dominio). Teniendo en cuenta los dos aspectos anteriores, dicha capa podria ser totalmente reemplazable y modificable con un impacto minimo en capas superiores, consiguiendo un mayor desacoplamiento. Se recuerda que cuando utilizabamos la forma RAD disponiamos de multiples consultas diseminadas por todo el cdigo de la aplicacin. A la hora de crear una capa de acceso a datos LINQ del tipo LINQ to SQL se deben tener unos aspectos en cuenta: El ratio de codigo de ejemplo y codigo real se puede comparar con codigo directo LINQ to SQL Si se devuelven entidades o consultas LINQ to SQL desde su cada de acceso a datos, estos objetos soportan ejecucion diferida y bsqueda perezosa, debilitando su divisin. La capa de acceso a datos deber devolver objetos que se pueden pasar entre componentes en diferentes capas y ser tratados debidamente en cada uno de ellas.

Referente al primer punto, es cierto que mucho cdigo de la capa de acceso a datos puede parecer intil porque sea sencillo o no se utilice. Sin embargo si se desea adoptar este tipo de arquitectura ser algo que se deba aceptar. De hecho es mejor disponer todo ese codigo que consultas literales SQL. Veamos el segundo punto. Cuando se escribe un metodo en la capa de acceso a datos el programador puede estar tentado de escribir metodos del estilo:

Puede observarse un metodo GetCultivoByLinea que devuelve un tipo IQueryable<Cultivo>. Si como en el ejemplo se crea una capa de acceso a datos y devuelve tipos de tipo IQueryable o parecido se debe tener en cuenta que se estan devolviendo consultas, que es diferente a devolver colecciones del tipo Cultivo, en este caso. En esta situacin y debido a la consulta diferida de LINQ la consulta se ejecutaria fuera de la capa de acesso a datos. Por tanto es mejor devolver ya las propias consultas enumerads y ejecutadas (Utilizando por ejemplo ToList, ToArray, etc.).

Pgina | 107

Si se utiliza como en este caso la carga perezosa, se producen llamadas a la base de datos por medio de llamadas transparentes a LINQ to SQL. Se pueden enviar los objetos valor con la carga perezosa desactivada utilizando la propiedad DeferredLoadingEnabled = false del DataContext. Por tanto devolver objetos de valor es importante cuando necesitamos pasar objetos entre capas remotas.

5.1.3. LINQ TO XML Y LINQ TO OBJECTS EN LA ARQUITECTURA


El uso de LINQ to XML y LINQ to Objects en una arquitectura es indiferente y no importara en que parte de las aplicaciones esten situadas. LINQ to XML se puede utilizar para leer o crear XML. Dado el amplio uso de XML en estos momentos, se puede esperr encontrar LINQ to XML empleado en todas las capas de aplicaciones. Por ejemplo en combinacion con datos de una base de datos, para importar datos XML, crear RSS feeds y ms. Por otra parte, y en general, LINQ to Objetcs se va a utilizar en combinacion con LINQ to XML y LINQ to SQL y por tanto va a estar presente en todas las capas. Adems la importancia de LINQ to Objects va a ser importante como ya hemos comentado en los primeros capitulos de esta tesina en los desarrollos que se hagan apartir de ahora utilizando el Framework 3.5 y posteriores ya que nos permitira reducir codigo y manejar colecciones de formas muy sencillas y intuitivas, ya que el desarrollador en cualquier momento va tener la necesidad de consultar tablas, colecciones, listas o diccionarios y encontrara en LINQ to Objects una herramienta til.

Pgina | 108

6. MEJORAS Y AVANCES FUTUROS


En este captulo se van a mostrar aspectos importantes que el desarrollador debe tener en cuenta durante la construccin de la aplicacin. Los problemas mencionados, en muchas ocasiones no son problemas sino ms bien son problemas surgidos fruto de un uso incorrecto de LINQ y que se debe corregir o hacerlo de forma correcta, en otras ocasiones no y es que cuando se trabaja con LINQ hay que tener en cuenta que existe un desajuste de paradigma entre la programacin orientada a objetos y las bases de datos relacionales, que de alguna forma se tiene que salvar.

6.1. ASPECTOS A MEJORAR EN LINQ


En ocasiones cuando se usa LINQ se pueden encontrar con muchos aspectos que posiblemente necesiten una revisin en ediciones futuras, pero el hecho de ser criticados en esta tesina no significa que estn mal desarrollados, simplemente que durante el desarrollo de nuestra aplicacin de Agromutua.Web nos han producido problemas.

6.1.1. PROBLEMAS COMUNES


Para mencionar todos los problemas encontrados, se introducir el problema y debajo de l se dar la explicacin. Alguno de estos problemas son producidos por el desajuste de paradigma que se aborda en el punto 6.1.2. LINQ parece estar diseado en ocasiones para una arquitectura de dos niveles. En ocasiones el programador de la aplicacin tiende a olvidarse de una arquitectura de tres niveles, comenzado a diseminar por la aplicacin consultas y operaciones de la base de datos, que a la larga pueden acarrear problemas. LINQ facilita mucho el desarrollo rpido pero se debe tener en cuenta la arquitectura que se emplea y no salirse de ella. LINQ to SQL genera SQL dinmico. La tecnologa motiva el uso de SQL dinmico en vez de procedimientos almacenados. En ocasiones un procedimiento almacenado puede resolver un problema de una gran consulta o un problema relacionado con el rendimiento de esta. LINQ realiza un enfoque para utilizar siempre el uso de SQL dinmico, es decir, construcciones de consultas que variaran segn condiciones en vez de utilizacin de procedimientos almacenados con tablas temporales o SQL dinmico en el propio procedimiento almacenado. El problema del desajuste de la cache. LINQ to SQL carga una vez los objetos en la cache conduciendo en ocasiones a resultados inesperados.

Pgina | 109

Ms que un problema es una caracterstica de LINQ to SQL, el DataContext de LINQ utiliza una carga de datos por las claves primarias Por lo que esto puede acarrear problemas con aserciones y cabe la necesidad de siempre que se desee actualizar registros deber disponer la tabla de claves primarias. De lo contrario la actualizacin se reflejar con xito pero el cambio en la base de datos realmente no se realizar. Mtodos First() y Single() ocasionan problemas cuando no obtienen resultados esperados. Estos mtodos ejecutan la consulta LINQ y nos devuelven en el caso de First() el primer resultado, y en caso de Single() el nico resultado. Pero los problemas vienen cuando First() no obtiene ningn resultado o Single() no obtiene ningn resultado o obtiene ms de uno. Lgicamente se produce un error en tiempo de ejecucin que deber ser tratado, pero a simple vista parecen innecesario que esto produzca errores, existiendo mtodos como FirstOrDefault() o SingleOrDefault() que devuelven valores nulos cuando se dan las situaciones mencionadas. En futuras versiones de LINQ (en el Entity Framework) est previsto eliminar los mtodos para evitar confusiones. Relaciones muchos a muchos y asociaciones Como veremos en el siguiente punto, el desajuste del paradigma entre la orientacin a objetos y las base de datos relacionales producen en ocasiones una inestabilidad dentro de los modelos equivalentes que se supone que nos proporciona el mapeo. El choque producido entre filas de datos unidas por identificadores de columna y construcciones de memoria que contienen colecciones de objetos que pueden contener adicionalmente otras colecciones de objetos y as sucesivamente van a producir problemas a la hora de obtener los resultados con LINQ, al igual que la imposibilidad de representar una relacin muchos a muchos en el paradigma de la orientacin a objetos, ya que en las bases de datos relacionales se representa con una tabla intermedia. En el punto siguiente se analizar el desajuste del paradigma.

6.1.2. EL DESAJUSTE DE PARADIGMA


El hecho de que los desarrolladores modernos tengan que trabajar simultneamente con lenguajes de programacin de aplicacin general, datos relaciones, SQL, documentos XML, etc., significa que necesitamos dos cosas: Ser capaces de trabajar con cualquiera de estas tecnologas o lenguajes de una forma individual. Mezclar y hacerlas coincidir para crear una solucin robusta y coherente.

El problema surge cuando la programacin orientada a objetos, el modelo de bases de datos relacional y XML, entre otros, no se crearon originalmente para trabajar juntos. Por tanto representan diferentes paradigmas que no interactan bien entre ellos. Traducir un modelo de una base de datos relacional en cdigo de lenguaje de programacin requiere, a menudo, un trabajo tedioso. El problema general que LINQ aborda ha sido indicado por Microsoft como Datos != Objetos, y ms especficamente para LINQ to SQL como Datos relacionales != Objetos, igual con LINQ to XML, por ejemplo, Datos XML != Objetos y por lgica Datos XML !=Datos relacionales.

Pgina | 110

A continuacin se muestran algunos de los desajustes existentes entre el paradigma orientado a objetos y el paradigma relacional: Las bases de datos relacionales y los lenguajes orientados a objetos no comparten el mismo conjunto de tipos primitivos de datos: Un ejemplo de esto son las cadenas que normalmente en las bases de datos tienen una longitud preestablecida y en los lenguajes como C# y VB.Net no. OOP y las teoras relacionales vienen con diferentes modelos de datos: Normalmente por razones de rendimiento principalmente las bases de datos estn normalizadas. La normalizacin es un proceso que se encargar de la eliminacin de la redundancia, organiza los datos eficientemente y reduce el potencial por anomalas durante las operaciones de datos y mejora la consistencia de datos. Las bases de datos estn normalizadas en tablas y relaciones, mientras los objetos utilizan herencia, composicin y grficos de referencia complejos. La equivalencia entre ambos requiere el uso de trucos adicionales por el programador. Modelos de programacin: En SQL escribimos consultas y as obtenemos una forma declarativa de ms alto nivel de expresar el conjunto de datos en los que estamos interesados. Con los lenguajes de programacin imperativos como C# o VB.NET tenemos que escribir bucles y sentencias.

Encapsulacin: Los objetos son autnomos y tienen un comportamiento. En las bases de datos, los registros de datos no tienen comportamiento de por s. En las bases de datos el cdigo y los datos estn claramente separados.

Este desajuste es el resultado de las diferencias entre una base de datos relacional y la jerarqua tpica de clase orienta a objetos. Veamos un ejemplo para demostrar el desajuste de paradigma:

Los conceptos como herencia o composicin no se pueden soportar directamente por las bases de datos relacionales, lo que significa que no podemos representar los datos de la misma forma en los dos

Pgina | 111

modelos. El problema es que en algn punto necesitamos hacer que el modelo de objeto y el modelo relacional trabajen conjuntamente. Esto no es una tarea sencilla puesto que los lenguajes de programacin orientados a objetos y .NET implican clases de entidad, reglas de negocio, relaciones complejas y herencia, mientras que una fuente de datos relacional implica tablas, filas, columnas y claves primarias y externas. Ninguna solucin a da de hoy es perfecta y los mapeadores relacionales de objeto podran mejorar. Algunas de sus limitaciones principales incluyen lo siguiente: Un buen conocimiento de las herramientas es necesario antes de ser capaz de ser utilizadas de forma eficiente y evitar problemas de rendimiento. Un uso ptimo requiere conocimiento sobre base de datos relacionales. Las herramientas de mapeado no son siempre tan eficientes como el cdigo de acceso a datos escrito a mano. No todas las herramientas vienen con soporte para la validacin en tiempo de compilacin.

6.2. EL FUTURO DE LINQ


Las novedades de LINQ surgirn a partir de la nueva versin de Microsoft Visual Studio 2010, que vendr con el nuevo Framework 4.0. Por lo que respecta a LINQ las ltimas novedades surgidas, entre ellas PLINQ, ya se pudieron apreciar en la Parallel Extension y en el SP1 del Framework 3.5, por lo que no se esperan grandes cambios. A da de hoy es una incgnita.

6.2.1 VISUAL STUDIO 2010 Y FRAMEWORK .NET 4


La web de Visual Studio 2010 [15] nos permite observar las nuevas novedades que traer la nueva versin del producto para desarrolladores ms importante de Microsoft: Experiencia de usuario mejorada: nueva y mejorada UI, menor complejidad, editores mejorados, mejorado el soporte de ventanas y documentos as como la focalizacin de documentos y animaciones. SharePoint Development: mayor integracin de Sharepoint en Visual Studio, permitiendo personalizarlo y agregando opciones para trabajar ms gilmente. Democratizacin de la administracin de ciclo de vida de las aplicaciones: nuevas capacidades para Microsoft Visual Studio Team System 2010 como gestores avanzados y evaluadores, as como nuevos diagramas, pruebas y control de versiones. Seguir facilitando las tareas a los programadores: compatibilidad con versiones anteriores de Visual Studio, desarrollo intuitivo, actualizar las aplicaciones a Windows 7, entre otras. Desarrollo de Cloud Computing: utilizacin de herramientas de Windows Azure. Desarrollo Web: mejorado el motor Intellisense para adaptarse a los estndares JavaScript, publicar de forma rpida los sitios web y completo soporte para Silverligth. Programacin paralela: simplificacin de las tareas de programacin de paralela con soporte IDE, nuevas bibliotecas de tareas, extensiones paralelas para .NET Framework ya incluidas, concurrencia en tiempo de ejecucin y herramientas para su depuracin. Mayor soporte a las bases de datos: ahora ya no ser SQL Server la nica base de datos con la que se podr trabajar y se podrn utilizar otras como Oracle o IBM DB2.

Pgina | 112

Por lo que respecta a las nuevas caractersticas concretas del Framework .NET 4 que se podrn apreciar respecto a sus antecesoras son: . NET Framework 4 trabaja codo con codo con el Framework versin 3.5 SP1. Las aplicaciones que se basan en las versiones anteriores del Framework seguir funcionando en esta versin. Slo un subconjunto de la funcionalidad es compartida por todas las versiones del Framework. Innovaciones en los lenguajes Visual Basic y C #, por ejemplo, declaraciones lambdas, continuaciones de lneas implcitas, envo dinmico, y llamada / parmetros opcionales. El ADO.NET Entity Framework, nuevas caractersticas para los desarrolladores que trabajan con bases de datos relacionales con una mayor nivel de abstraccin, incluye soporte para POCO, test-driven, nuevos operadores LINQ y funciones de modelo. Mejoras de ASP.NET: o Nueva interfaz de usuario o Plantillas JavaScript con capacidad de enlace de datos para Ajax. Nuevo control de grfico de ASP.NET. Mejoras en WPF: o Aadido soporte en Windows Presentation Foundation (WPF) para Windows 7 MultiTouch, los controles de la cinta, y las caractersticas de extensibilidad de la barra de tareas. o Se ha agregado soporte de WPF para la superficie 2.0 SDK. o Nueva lnea o de negocio controles y grficos de control, smart edit, data grids, y otras que mejoran la experiencia de los desarrolladores que crean aplicaciones centradas en datos. o Mejoras en el rendimiento y la escalabilidad. o Mejoras visuales en la claridad de texto, diseo de pxel de romperse, la localizacin y la interoperabilidad. Mejoras de Windows Workflow (WF) que permiten a los desarrolladores mejorar la interaccion con los flujos de trabajo. Estos incluyen un modelo mejorado de programacin de la actividad, una experiencia de diseo mejorado, un nuevo estilo de modelado de diagrama de flujo, una paleta de mayor actividad, las normas de flujo de trabajo de integracin y caractersticas de la nueva correlacin de mensajes. . NET Framework tambin ofrece importantes mejoras de rendimiento para flujos de trabajo basados WF. Mejoras a Windows Communication Foundation (WCF), como el apoyo para los servicios de WCF programas de flujo de trabajo que permitan el flujo de trabajo con las actividades de mensajera, soporte de correlacin, duradera comunicacin de dos vas y las amplias capacidades de acogida. Adems,. NET Framework 4 proporciona nuevas caractersticas de WCF, como el descubrimiento de servicios, servicio de router, configuracin simplificada y una serie de mejoras de cola, el resto solo, diagnsticos y de rendimiento. Nuevas e innovadoras caractersticas de programacin en paralelo, como el apoyo loop paralelo, Grupo de la Biblioteca Paralelo (TPL), LINQ Paralelo (PLINQ), y las estructuras de coordinacin de datos que permiten a los desarrolladores aprovechar la potencia de los procesadores multi-ncleo.

Pgina | 113

6.2.2. PARALLEL LINQ (PLINQ)


Parallel Language Integrated Query (PLINQ), tambin conocido como Parallel LINQ, se trata de una implementacin de LINQ to Objects que ejecuta consultas en paralelo. PLINQ est basado en Parallel Extensions de .NET Framework y actualmente se debe descargar para poderlo utilizar [16] (a partir de Visual Studio 2010 ya vendr con el entorno). PLINQ solo puede utilizarse con consultas que se ejecuten en memoria, as como aquellas sobre proveedores IQueryable y requiere el conocimiento de las implicaciones de la programacin multihilo, as como los efectos secundarios de la ejecucin de consultas, como el acceso de escritura a objetos compartidos. Para empezar se debe tener instalado el paquete de Parallels Extensions de .NET Framework y si todo ha ido correctamente se debe poder importar el ensamblado System.Threading que contiene toda al implementacin de PLINQ. Ahora ya se puede utilizar los mtodos y las clases que vienen con PLINQ, para ello se comentar lo que trae esta extensin de LINQ y la utilizacin.

6.2.2.1 LOS MTODOS Y LAS CLASES DE PARALLELS EXTENSIONS


Existen tres mtodos que utilizaremos para ejecutar las consultas en paralelo: Parallel.For Parallel.ForEach Parallel.Invoke

Veamos la utilizacin de los mtodos Parallel.For y Parallel.ForEach en comparacin con la utilizacin normal:

Pgina | 114

Cuando utilizamos este cdigo en una maquina de ms de un ncleo la ejecucin paralela es ms rpida, ya que ejecuta diferentes hilos para invocar al mtodo ProcessData que se supone que es un proceso muy pesado, mientras s una maquina es de un solo ncleo la ejecucin en paralelo es ms lenta. El uso de los mtodos Parallel.For y Parallel.ForEach requiere que la operacin de cada ciclo sea independiente de las otras. En el caso de que el cdigo ejecutado durante varios ciclos tuvo que almacenar resultados en un objeto compartido, por ejemplo una lisa, tendr que asegurarse de que el acceso a el objeto compartido est protegido contra concurrencia. Por otra parte existe el mtodo Parallel.Invoke que recibe una matriz de delegados que pueden ejecutarse en cualquier orden basndose en los recursos disponibles

Pgina | 115

Observamos el resultado:

La implementacin de Parallel.Invoke crea varias instancias de la clase Task, sin exponerlas al control de los programadores. La clase Task, encontrada en System.Theading.Tasks.Task representa una operacin asindrona. Es un contenedor de un delegado que incluye informacin como el fin de la ejecucin (IsCompleted, IsCanceled) o bien mtodos para detener la ejecucin de una clase (Cancel). Pgina | 116

La clase Task es til cuando queremos contralar operaciones asncronas con la posibilidad de cancelar una o ms de ellas, sin tener que implementar una gestin personalizada para cada contexto concreto. De la clase Task, hereda la clase Future<T> para aadir significado semntico para leer el valor de una operacin asncrona sin tener que reescribir el cdigo de sincronizacin. Al usar Future<T> se ocultan la mayora de detalles relacionados con la sincronizacin de hilos, los cuales son necesarios cuando una operacin asncrona tiene que devolver datos de otro hilo. En relacin a todo lo anterior y al trabajar con la concurrencia en .NET hay que tener en cuenta que un fragmento de cdigo es seguro si funciona correctamente durante la ejecucin simultanea de varios hilos. Sin embargo, la mayor parte de las clase de .NET no estn diseadas por defecto para su uso en entornos multihilo. Al usar Parallel Extensions de .NET Framework se tiene que sincronizar ese tipo de acceso. EL enfoque ms adecuado es escribir cdigo que no comparta datos, aunque esto no siempre es posible.

6.2.2.2 USO DE PLINQ


PLINQ es una implementacin de LINQ to Objects que ejecuta consultas en paralelo utilizando para ello las clases de Parallels Extensions. Para usar PLINQ solo se debe usar el mtodo de extensin AsParallel() sobre el origen de datos:

Por tanto el escaneo de la matriz de enteros se dividir en varios hilos, usando ms ncleos de la CPU que el enfoque secuencial. AsParallel() dispone de diferentes versiones que le permiten configurar sus argumentos: nmero mximo de hilos, preservacin de orden, aadir mtodos, etc. Hasta el momento se ha visto una de las tres formas que dispone PLINQ de procesar una consulta, a continuacin se describirn con detalle: Procesado de tubera:

El procesado de tubera es el modelo de proceso por defecto. Hay un conjunto de hilos que ejecutan la consulta y un hilo aparte que consume el resultado de dicha consulta. Este hilo procesa los datos tan pronto como los otros hilos comienzan a generar resultados, este es el comportamiento por ejemplo del bucle Parallel.Foreach Procesado Stop-and-Go:

Pgina | 117

Al utilizar este tipo de procesado el hilo que va a ejecutar los datos espera que los hilos que ejecutan el procesado terminen su trabajo antes de pasar a usar los datos. De esta manera no se produce una competencia entre los diferentes hilos para utilizar los recursos de la CPU. Cuando se utiliza un ToArray o un ToList el procesado Stop-and-Go es automtico. Enumeracin invertida:

En ocasiones es necesario conseguir un mayor grado de paralelizacin invocando el cdigo del hilo que utiliza los resultados en el mismo hilo que genera un elemento durante la ejecucin de la consulta. Para ello se utiliza el mtodo de extensin ForAll. Se han enumerado los posibles procesados de las consultas en paralelo, esto puede acarrear efectos secundarios y uno de ellos es el orden de resultados, al no ser secuencial el proceso los resultados pueden obtenerse desordenados, para corregir esto podemos utilizar en nuestras consultas el operador orderby de LINQ, otra posibilidad es usar el argumento ParallelQueryOptions.PreserveOrdering en la invocacin de AsParallel().

6.2.3. ADO.NET ENTITY FRAMEWORK


El ADO.NET Entity Framework surge despus de LINQ, oficialmente en el SP1 del Framework .NET 3.5 y viene a ser un ORM que ofrece una tecnologa para relaciones de mapeado ms avanzadas. LINQ to SQL cubra las necesidades bsicas de CRUD pero en determinadas situaciones de bases de datos ms grandes, la base de datos se desarrollar mejor con una estructura ms normalizada. Cuando en LINQ to SQL realizamos una vista perdemos los metadatos necesarios para actualizar registros en las tablas originales. Esto lo soluciona ADO.NET Entity Framework con la incorporacin del EDM (Entity Data Model o Modelo de Datos de Entidades) que incluye informacin conceptual sobre la fuente de datos para que las herramientas tengan la informacin suficiente creacin de entidades de modelos. El EF separa los modelos fsico del lgico al utilizar unas series de archivos de mapeado basados en XML: CSDL, MSL y SSDL.

Pgina | 118

Las entidades lgicas se definen mediante un archivo SSDL (Store Schema Definition Language) basado en XML. Estos mapeados son similares a los que se definen en LINQ to SQL. EL EF se mueve ms all de LINQ to SQL para utilizar otro archivo basado en XML, el MSL (Mapping Schema Language) para mapear el modelo lgico con un modelo conceptual. El modelo conceptual es otro archivo XML utilizando un CSDL (Conceptual Schema Definition Language). Estas entidades conceptuales se pueden convertir adems en objetos fuertemente tipados si se desea. Con el EDM establecido, podemos consultarlo con un lenguaje de consulta basado en cadenas denominado Entity SQL. Adems, se pueden aplicar conocimientos de LINQ utilizando LINQ to Entities sobre el EDM. Puesto que el EDM supone una verdadera capa de abstraccin entre la aplicacin y la base de datos, podemos modificar nuestra base de datos y el archivo de mapeado EDM y reestructurar el almacn de datos sin tener que recompilar la aplicacin. La separacin de capas que obtenemos de EDM permite una separacin mayor entre lo fsico y lo lgico. Esto nos permite cambiar nuestro modelo de datos y estructuras de mapeado y dejar nuestra aplicacin intacta. Adicionalmente, puesto que EF se ha construido sobre el modelo de proveedor ADO existente, el EF puede trabajar contra almacenes de datos distintos a SQL Server. A continuacin se muestra una figura de la arquitectura del EF (vase la explicacin de esta en el punto 6.2.3.1.):

Pgina | 119

ADO.NET Entity Framework cuenta con un asistente y un diseador integrados en Visual Studio 2008, los cuales resultan de utilidad para crear esquemas conceptuales de la nada, o bien a partir de una capa de persistencia de la base de datos soportada.

Lo primero que se debe hacer es crear un nuevo elemento de Datos del tipo ADO.NET Entity Data Model, en la figura de la parte superior se puede apreciar. El siguiente paso pedir al usuario si desea crear un EDM vaco o de una base de datos, en el ejemplo se ha aprovechado y se ha seleccionado Generar desde la base de datos ya que se dispone de la base de datos de Agromutua, que seleccionaremos en el siguiente paso.

A continuacin, una vez se conecta el asistente con la base de datos nos permite seleccionar las tablas, vistas y procedimientos almacenados de dicha base de datos para poder crear a partir de estos el EDM.

Pgina | 120

El resultado de ejecutar el asistente es un archivo .EDMX que, bsicamente, es un archivo XML, a nivel interno, representa el conjunto de archivos de modelado (CSDL,SSDL y MSL). El editor visual nos permite realizar los cambios pertinentes en las relaciones, tablas, etc. y de esta forma modelar las entidades.

Pgina | 121

Una de los aspectos a destacar es que si se dispone de dos tablas con una relacin de muchos a muchos, el diseador omite esa tabla y representa la relacin subyacente en el esquema del modelo de entidades. Si abrimos dicho archivo con el editor XML podemos observar que efectivamente dispone de las descripciones CSDL, SSDL y MSL:

Ahora ya se podra ejecutar una consulta sobre el nuevo modelo creado:

Pgina | 122

La gestin de datos que realiza ADO.NET Entity Framwork se realiza de una forma transparente mostrando el estado de los objetos involucrados en las operaciones de modificacin de las instancias de las entidades. La clase EntityObject se trata de la clase padre, de la cual se hereda cada tipo de entidad definida en el EDM. EntityObject, junto con ObjectContext, forman parte del componente ObjectServices. Este componente tambin forma parte del EF, y es implementado mediante los espacios de nombres System.DataObjects y System.Data.Objects.DataClasess, los cuales permiten la ejecucin de consultas, asi como la edicin, actualizacin y eliminacin de entidades con un enfoque que utiliza Entity SQL y LINQ to Entities. Cada instancia de la entidad creada, dispondr de un atributo EntityState que podr tomar los valores: Added, Deleted, Detached, Modified y Unchanged. La actualizacin de la base de datos se realizar con la llamada al mtodo SaveChanges() por parte de la instancia de la conexin. Cuando se realiza una actualizacin, esta se realiza por la clave de identidad de cada entidad, de aqu la importancia que est bien definida dentro del modelo de entidades. A nivel interno, el motor ObjectServices garantiza que no existen varias instancias de la misma entidad, lo que sirve para evitar problemas de concurrencia dentro de la propia aplicacin.

6.2.3.1 LINQ TO ENTITIES


LINQ to Entities es una implementacin que permite ejecutar consultas sobre un modelo de datos entidad de ADO.NET Entity Framework, utilizando sintaxis de LINQ, por tanto hablaremos de LINQ to Entities como proveedor de consultas LINQ para ADO.NET Entity Framework.

Pgina | 123

Dentro de la arquitectura, LINQ to Entities se basa en la infraestructura de ADO.NET Entity Framework, la cual se compone de un conjunto de componentes con varias capas. Los componentes Object Services y Entity SQL estn conectados directamente a LINQ to Entities. Laca capa de Object Services se encarga de la gestin de la identidad y del estado de los objetos, mientras que Entity SQL proporciona capacidades de consulta sobre el modelo de datos de la entidad. Estas capas funcionan gracias a los componentes subyacentes que, bsicamente, son aquellos que permiten el mapeado entre el almacenamiento de persistencia fsica y su representacin del modelo de datos entidad. De forma interna, Entity Framework utiliza el entorno clsico de ADO.NET para conectarse al sistema de gestin de base de datos (DBMS) y para ejecutar consultas sobre este, lo cual permite el uso de las implementaciones de IDbConnection, IDbCommand y IDataReader.

Se debe destacar que LINQ to Entities es compatible con todos los operadores y mtodos de consulta bsicos de LINQ. Por tanto, se puede elegir entre la sintaxis de consulta de LINQ o la de los mtodos de extensin. Se pueden utilizar casi todos los comandos disponibles para la sintaxis de consulta de LINQ to Objects. Existen algunas limitaciones de algunos comandos de consulta que no son soportados por LINQ to Entities, como Agregate, Take, Skip, etc. y esto es debido a que no todas las operaciones CLR se pueden convertir en instrucciones SQL equivalentes ya que no hay garanta de que exista la misma caracterstica en todos los motores DBMS.

Pgina | 124

6.2.3.2 DIFERENCIAS ENTRE LINQ TO SQL Y LINQ TO E NTITIES


A primera vista LINQ to SQL y LINQ to Entities son implementaciones competitivas de LINQ. De hecho, desde el punto de vista de una consulta de LINQ ambas poseen caractersticas similares, y ambas le permiten ejecutar una consulta sobre una DBMS utilizando LINQ. Sin embargo, ambas implementaciones tienen diferencias que reflejan los diferentes escenarios a los que estn orientadas. LINQ to SQL es un mapeador relacional de objetos fcil y rpido de utilizar. Por lo general, se considera que su uso es ms apropiado en contextos de desarrollo rpido de aplicaciones, donde la nica base de datos es del tipo Microsoft SQL Server, y el esquema de la base de datos no tiene que ser abstrado a travs de un modelo de dominios entidad. LINQ to SQL trabaja con entidades que mapean tablas de la capa de persistencia de la base de datos de origen, siguiendo una relacin 1:1. En este escenario, LINQ to SQL es muy rpido, y ofrece un rendimiento excelente al ejecutar consultas sobre Microsoft SQL Server, puesto que esta optimizado para trabajar con este producto. LINQ to Entities es el proveedor de consultas de LINQ oara ADO.NET Entity Framework. Es un mapeador de objetos relacionales ms complejo y ms potente. Ha sido diseado para ser utilizado con una gran variedad de servidores de base de datos. Puede utilizarse para definir complejos modelos de entidades sin las restricciones de un mapeado 1:1 entre entidades y un esquema de base de datos. Con ADO.NET Entity Framework se puede modelar las entidades sin tener en cuenta la estructura de datos de la capa fsica. Tambin es posible mapear el modelo de datos entidad sin que sea necesaria una capa de persistencia, independientemente de que se trate de una base de datos SQL Server o no, o de que tras una entidad sencilla tengamos una tabla, un conjunto de tablas, varios procedimientos almacenados o ambos. Por supuesto estas caractersticas hacen que el modelo de datos de entidad nos permita definir consultas que son ms fcilmente transferibles, lo cual puede afectar al rendimiento de estas (respecto a LINQ to SQL, que seran ms eficientes). Sin embargo, se debe evaluar estas circunstancias con detalle antes de tomar una decisin respecto al modelo a utilizar.

Pgina | 125

7. CONCLUSIONES
Durante los captulos anteriores se ha mostrado el proyecto en el que se ha trabajado, as como LINQ como una tecnologa novedosa y se han enseado sus nuevas y futuras caractersticas. Se han analizado puntos de vista diferentes respecto a las arquitecturas posibles que se pueden utilizar y se ha enseado el camino que se sigue por parte de Microsoft y todo lo relacionado con el mapeado de base de datos relaciones. Pues bien, lo que se quiere comentar en esta ltima parte de la tesina es la demostracin de la experiencia y el trabajo realizado con LINQ desde el punto de vista del propio programador.

7.1 LA EXPERIENCIA PROPIA CON LINQ


LINQ to SQL y LINQ sobretodo ha supuesto una forma de revolucionar la programacin convencional relacionada con el acceso a base de datos. La primera sensacin que se percibe cuando programa y lo hace utilizando todas las nuevas caractersticas es una sensacin de control de la situacin, se est acostumbrado a realizar consultas con lneas y lneas de cdigo con ADO.NET y sobretodo el mantenimiento que esto supone, la idea de realizar cualquier cambio supona un reto en tiempo y recursos desperdiciados. Con LINQ el asunto mejora, se cambia la base de datos, se vuelve a mapear y automticamente la depuracin en tiempo de compilacin muestra lo que se debe cambiar sin trabajar de la forma cambiar y probar, un gran avance y todo bajo control. Como bien se dijo en los primeros captulos donde se repasa la arquitectura, esta est dividida en dos grandes partes, la denominada como antigua y la nueva. La antigua es donde se accede a los datos mediante ADO.NET y la nueva donde ya se utiliza LINQ to SQL. Es en ese momento cuando el programador se da cuenta del avance, ADO.NET generaba muchas ms dependencias y produce muchos ms problemas al producir errores en tiempo de ejecucin y no en compilacin. Hay que matizar que LINQ es un gran avance pero que como todo, no siempre es la mejor opcin. Existen escenarios donde podemos tener en cuenta el rendimiento del cdigo o tiempo empleado en desarrollar ese cdigo, en ocasiones realizar una consulta LINQ es menos eficiente que hacerlo de una forma convencional con bucles for o foreach. En el primer caso, en el caso de que se debe tomar una decisin entre un rbol de posibilidades que nos brinda LINQ. Se realiza una prueba en la que se dispone de una coleccin de objetos y quiere obtener el elemento mayor de uno de sus atributos, la tentacin principal puede ser utilizar el mtodo de extensin Max, pero analcese con ms detenimiento: Utilizacin de un bucle foreach que mantiene una referencia al elemento mximo en cada momento, si el registro actual es mayor al que se tiene referencia se cambia sino se mantiene, as sucesivamente. En este caso la complejidad del problema es O(n), que matemticamente es lo mejor que se puede conseguir sobre una lista. Se puede ordenar la coleccin y tomar el primer elemento, tiene complejidad O(n log n). Otra opcin es usar una subconsulta, seleccionando el libro Max dentro de una comparacin. La comparacin convierte la operacin en O(n)

Pgina | 126

Y otra opcin es utilizar dos consultas separadas, que resuelve el problema de la comparacin, por tanto tiene O(n), aunque debemos iterar dos veces la coleccin. Y por ltimo se puede hacer un operador de consulta personalizado.

Con un sencillo ejemplo encontrado en [1] nos muestra una tabla con los resultados: Opcin Foreach OrderBy + First Subconsulta Dos consultas Operador personalizado Tiempo medio (en msg) 37 1724 37482 66 56

Estos resultados nos muestran que el rendimiento puede variar mucho entre diferentes soluciones, es importante utilizar consultas correctas y no siempre un operador personalizado es la mejor opcin, aunque si se puede siempre puede ser la mejor opcin iterar una vez sobre la lista con operadores convencionales. Por otra parte y al margen del propio rendimiento existe otro dilema que tiene que ver entre el rendimiento y la concisin del cdigo. Si LINQ tiene una ventaja es que se puede escribir cdigo fcilmente entendible y muy parecido al lenguaje SQL que estamos acostumbrados a utilizar, por ello existen ocasiones en las que una consulta legible es preferible a montar un fragmento de cdigo que con el tiempo se va a convertir en tareas casi imposibles de entender, hablando de partes de un tamao considerable. Resumiendo, LINQ ha sido (y va ser) un importante avance para los programadores y al fin ha supuesto un importante cambio a mejor en el vaco que se encontraba la interaccin del cdigo con la base de datos. Proporcionando una interaccin con las bases de datos relacionales que hasta el momento no exista en la plataforma .NET, y por tanto ganando en costes tanto de desarrollo, programacin y tiempos de entrega de las aplicaciones.

7.2 FUNCIN REALIZADA EN EL PROYECTO AGROMUTUA.WEB


Cuando entre en Prodevelop S.A. en Junio de 2008 se me introdujo en un grupo de trabajo con 2 programadores ms, el equipo de trabajo de Agromutua.Web dentro del departamento de .NET de la empresa. Desde esa fecha hasta ahora se han ido desarrollando partes de la aplicacin y manteniendo otras. Nada ms incorporarme al puesto de trabajo observe el importante cambio que supona LINQ en el recin sacado Framework 3.5 de Microsoft. Mis anteriores experiencias con Frameworks de .NET por trabajos de asignaturas en la Universidad Politcnica de Valencia me permitieron observar la evolucin que en poco tiempo haba tenido la tecnologa y el entorno de trabajo Visual Studio 2008, del que normalmente saca versiones Microsoft cada un par de aos. Como se comenta en el captulo de la arquitectura, Agromutua.Web est dividida en una parte de acceso a datos con ADO.NET y otra ya con LINQ to SQL. En mi caso, cuando me incorpore a la empresa se estaba comenzando a migrar el acceso a datos a LINQ to SQL por lo que participe en el proceso de

Pgina | 127

mapeo y construccin de la nueva capa de datos que nos proporcionara el acceso LINQ to SQL con la base de datos relacional SQL Server. Durante todo este tiempo se me han asignado tareas de desarrollo de diversas partes de la aplicacin. Una de las partes que ms trabajo supuso a nivel de negocio, por su importancia fue desarrollar los complejos clculos de las plizas de los aseguradores y a la vez el clculo de las distintas subvenciones de comunidades autnomas que proporciona Agroseguro. Este trabajo supuso exprimir al mximo mis conocimientos de LINQ ya que necesita de la interaccin con la base de datos muy frecuentemente debido que para llegar al resultado final del clculo se deben extraer datos de mltiples tablas de la base de datos: Asegurados, Opciones Asegurables, Precios, Tarifas, Cultivos, Variedades de Cultivo, Modulacin, etc Al igual suceda con los clculos para la obtencin de las subvenciones de las comunidades autnomas, las cuales depende de la situacin geogrfica (municipio, comarca y provincia) y la variedad junto con otros campos como pueden ser la opcin y la zona para realizar este clculo que comprenda a la vez otros que cualquier fallo de uno supona un resultado errneo con lo que esto conlleva en una pliza. Para todo lo relacionado con el negocio y capas intermedias LINQ permiti acelerar el trabajo notablemente, y puede ser confirmado por mi experiencia debido a que en ocasiones algunos mtodos del negocio estaban implementados con la parte ms antigua de la aplicacin y encontrar errores y modificarlos se convertan en tareas tediosas y desesperantes para el programador, debido principalmente a que un cambio produca inconsistencia en otras partes de la aplicacin solamente detectables en tiempo de ejecucin con lo que esto supone a la vista del cliente. Los clculos suponan (como en todas las plizas) la parte ms importante, que despus se deberan validar con la entidad Agroseguro, encargada de validar todas las plizas agrarias y documentos adjuntos a nivel nacional para que no se produzcan irregularidades. Para ello se deban desarrollar envos de archivos mediante FTP, en los cuales participe en la creacin de varios documentos junto con el de la pliza. Por otra parte mi experiencia en otros trabajos en desarrollo HTML, CSS y JavaScript me permiti desarrollar algunas de las pantallas de documentos adjuntos, referente a la capa interfaz. En estas pantallas el nivel de dificultad fue creciendo a la vez que fue creciendo la aplicacin y las exigencias del cliente. La aplicacin se converta cada vez ms pesada y eso nos forz hacer uso amplio de la tecnologa AJAX, por ello se desarrollaron bastantes libreras JavaScript junto con C# y VB.NET que implementaban llamadas AJAX a dichas libreras, suponiendo un incremento de la velocidad y del rendimiento de la aplicacin. Por ltimo compaginando el desarrollo de las partes antes mencionadas una de las tareas que con ms frecuencia se daba era la resolucin de incidencias, apoyndonos en el gestor de proyectos e incidencias JIRA (http://www.atlassian.com/software/jira/) se iban resolviendo muchas incidencias propias del negocio con el apoyo de los informticos de Agromutua. Ejemplo de esto, era la pantalla de parcelas que fue y es una de las que ms trabajo nos produce por el complejo negocio que existe entre los diferentes cultivos, variedades, opciones, etc ya que en muchos casos se tena que trabajar con esta pantalla realizada con las partes tecnolgicas ms viejas de la aplicacin e introducir nuevas caractersticas con la llegada de la contratacin de un nuevo cultivo por parte de los aseguradores.

Pgina | 128

8. BIBLIOGRAFA
[1] LINQ in Action. Fabrice Marguerie, Steve Eichert y Jim Wooley. 2008 Manning Publications [2] Programacin LINQ. Paolo Pialorsi, Marco Russo. Anaya Multimedia 2009 [3] La biblia de SQL Server 2005. Mike Gunderloy, Joseph L. Jorden y David W. Tschanz. Editorial Anaya Multimedia 2004. [4] Paso a Paso ASP.NET 3.5. George Shepherd. Editorial Anaya Multimedia 2009 [5] JavaScript para desarrolladores Web. Nicholas C. Zakas. Editorial Anaya Multimedia 2005 [6] Ajax con ASP.NET. Wallace B.McClure, Scott Cate, Paul Glavich, Craig Shoemaker. Editorial Anaya 2006 [7] Manual Avanzado de Visual Basic. Jorge Serrano Perez. Editorial Anaya multimedia 2008 [8] Manual imprescindible de AJAX. Javier Mellado Dominguez. Editorial Anaya 2008 [9] ASP.NET 2.0. Bill Evjen, Scott Hanselman, Farham Muhammad, Srinivasa Sivakumar, Devin Rader. Editorial Anaya Multimedia 2006 [10] MSDN de Microsoft, http://msdn.microsoft.com/ [11] http://msdn.microsoft.com/es-es/magazine/cc337893.aspx , Operadores de Consulta con LINQ, John Papa ( mmdatat@microsoft.com ) [12] http://weblogs.asp.net/scottgu/archive/2007/07/31/linq-to-sql-debug-visualizer.aspx, LINQ to SQL Debug Visualizer [13] http://www.microsoft.com/spanish/msdn/latam/visualstudio2008/ [14] http://cmenez.wordpress.com/ [15] Visual Studio 2010, http://www.microsoft.com/spain/visualstudio/products/2010/default.mspx [16] Parallel Extensions, http://www.microsoft.com/downloads/details.aspx?FamilyId=348F73FD-593D-4B3C-B055694C50D2B0F3&displaylang=en [17] Blog del CIIN, http://geeks.ms/blogs/ciin/

Pgina | 129

Vous aimerez peut-être aussi