Académique Documents
Professionnel Documents
Culture Documents
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.
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
Pgina | 10
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
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.
Pgina | 15
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
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
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
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
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
12Mb
3 discos SAS de 73 GB a 15.000 rpm en configuracin RAI-5, expandible hasta 6 discos en total
Pgina | 20
Windows 2003 Server R2 x32 Enterprise IIS 6.0 Microsoft .Net Framework 2.0 o superior
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.
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.
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
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.
Tipo de listado Determinar el listado mediante un filtro (campos opcionales) y una vista. Listado
Pgina | 25
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
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
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:
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
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
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
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.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.
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
PERSISTENCIA
BD
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
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.
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.
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]
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.
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.
Pgina | 48
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)
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:
BCL
CardSpace SP1
Framework 2.0
Framework 2.0
Framework 3.0
Pgina | 54
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.
Pgina | 57
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.
Pgina | 58
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.
Integrar posibilidades de consulta en el propio lenguaje de programacin. Permitir implementacin programacin. para otros lenguajes de
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.
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.
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.
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
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.
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.
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.
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.
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.
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:
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
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.
Expresin lambda
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.
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
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
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.
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
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.
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
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 :
Expresin lamda
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
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.
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.
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.
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.
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
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.
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.
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
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
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
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
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
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.
Pgina | 93
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.
Aplicacin
Registro de cambio
Base 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.
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.
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.
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
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.
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.
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.
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.
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.
Pgina | 108
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.
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.
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
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.
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().
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:
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.
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
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.
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.
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