9. Taller de Formación.NET Ing. Gustavo Guimerans A/C. Nicolás Sampietro A/C. Emiliano Martínez Capa de acceso a datos 1 Introducción Taller de Formación.NET La capa que describe la agrupación lógica de las funcionalidades y componentes que acceden a los datos (fuentes de datos, como bases de datos relacionales o servicios web) en una aplicación se conoce como la capa de datos (data layer). 554 Este documento está basado en la segunda edición del libro Microsoft Application Architecture Guide [1]. Su lectura brinda una completa guía sobre el uso de las distintas tecnologías. 1.1 Descripción General Esta capa provee acceso a la información dentro del sistema y datos expuestos en la red. Expone interfaces genéricas que la capa de negocio puede consumir. La capa de datos usualmente incluye: • Data Access components: estos componentes abstraen la lógica requerida para acceder a los almacenes de datos. Centralizan las funcionalidades comunes de acceso a datos con el objetivo de lograr una aplicación más simple de configurar y mantener. • Service agents: cuando un componente de negocio necesita acceder a datos que provee un servicio externo, es necesario implementar código. Los componentes que implementan esta actividad son los service agents. Permiten aislar la diversidad de requerimientos que imponen la llamada a estos servicios y brindan otros servicios como caching, soporte offline y un mapeo entre el formato de quien expone el servicio y la aplicación. 2 Consideraciones generales de diseño Taller de Formación.NET La capa de acceso a datos debe cumplir con los requerimientos de la aplicación: ser eficiente y segura, fácil de mantener y extender cuando hay cambios en los requerimientos de la capa de negocio. En este capítulo se describen los principales puntos generales a tener en cuenta al momento de diseñar la capa de acceso a datos. Elegir el tipo adecuado de tecnología depende de: • el tipo de datos que se tengan que manejar, • cómo se necesiten manipular. Abstraer. Implementar interfaces de acceso a datos con bajo acoplamiento. Encapsular las funcionalidades de acceso a datos en la capa de acceso a datos. La capa debe: • Ocultar detalles de acceso a la fuente de datos. • Ser responsable de: manejar las conexiones, generar consultas, mapear entidades de la aplicación a estructuras de datos. Decidir como mapear entidades de la aplicación a estructuras de datos. Dependerá básicamente del tipo de entidad que se use en la aplicación. Diseños comunes siguen enfoques: • Patrones Domain Model Table Module. • Frameworks Object/Relational Mapping (O/RM). Considerar estructuras de datos consolidadas. 555 • Ej. Si se están exponiendo datos a través de servicios considerar Data Transfers Objects (DTOs). Decidir cómo se manejarán las conexiones. • La capa de acceso a datos deberá crear y manejar todas las conexiones a fuentes de datos que requiera la aplicación. Es necesario elegir el método apropiado para almacenar y proteger la información de conexión, eventualmente mediante secciones encriptadas de archivos de configuración. Determinar cómo se manejarán las excepciones. • La capa de acceso a datos deberá manejar las excepciones asociadas a operaciones CRUD (Create, Read, Update and Delete) con las fuentes de datos. Considerar riesgos de seguridad. Reducir tráfico “muchas idas y vueltas”. • Considerar operaciones por lotes (batch) en simples sentencias SQL. • Considerar los objetivos de escalabilidad y de performance. 3 Consideraciones especificas de diseño Al momento de desarrollar el diseño hay varios problemas comunes a considerarse. Estos problemas pueden categorizarse en aéreas especificas de diseño. Las aéreas donde más problemas existen son: Procesamiento por lotes (batch), Binary Large Objects (BLOBs), Conexiones, Formato de datos, Manejo de excepciones, Object Relational Mapping, Consultas, Procedimientos almacenados (Stored Procedures). • Stored Procedures vs. Dynamic SQL Transacciones Validaciones XML. Por cada una de las aéreas, mencionadas anteriormente, existen varios puntos a considerar. A continuación se mencionan algunos ejemplos asociados a tecnologías específicas. En el capítulo 8 del libro [1] se describen cada uno de esos puntos. Taller de Formación.NET 3.1 Transacciones 556 • Microsoft SQL Server – cada SQL ejecuta como una transacción individual (auto-commit transaction mode). • Para clases del namespace System.Transactions, considerar usar el modo implícito provisto por el objeto TransactionScope. 3.2 XML • Considerar usar XML readers y writers para acceder a datos XML (especialmente cuando sea mucho volumen). Si se desea interactuar con una base relacional, considerar usar objetos que soporten esa funcionalidad tales como ADO.NET DataSet. 4 Consideraciones tecnológicas Una de las decisiones más importantes a tomar, al momento de implementar un sistema, pasa por la elección de la tecnología. La tecnología adecuada dependerá del tipo de aplicación y los requerimientos. A continuación, se mencionan casos concretos que ayudan a tomar una correcta decisión. • Si se requiere soporte básico para consultas y parámetros, considerar directamente objetos ADO.NET. • Si se requiere soporte para escenarios de acceso a datos más complejos o simplificar el código de acceso a datos, considerar utilizar el Enterprise Library Data Access Application Block. • Para aplicaciones Web data driven con páginas basadas en el modelo de datos de la base de datos, considerar utilizar ASP.NET Dynamic Data. • Para manipular datos con formato XML, considerar usar clases en el namespace System. Xml, o Linq to XML (XLinq). • Con interfaces ASP.NET, considerar DataReader para acceder a los datos con la máxima performance de renderizado. Ideales para operaciones read-only, forward-only. • Para acceder a SQL Server, considerar ADO.NET la namespace SqlClient para maximizar performance. • En SQL Server 2008, considerar FILESTREAM para una mayor flexibilidad en el almacenamiento y para acceder a datos BLOB. • Si se diseña una capa de negocio orientada a objetos en el patrón Domain Model, considerar un framework Object/Relation Mapping (O/RM), tal como el ADO.NET Entity Framework o el NHibernate framework de código libre. 5 Diseñando componentes de datos 5.1 Paso 1 – Seleccionar la tecnología de acceso a datos En este paso es que se hace necesario conocer las tecnologías disponibles en la plataforma Microsoft, cuándo es recomendable su uso, escenarios comunes, así como sus ventajas y consideraciones. A continuación se pretende llegar a cubrir estos puntos. Dada la importancia que tienen hoy en día ADO.NET Entity Framework (EF) y LINQ se profundizará. • ADO.NET Core. Brinda facilidades para recuperar, alterar y administrar información. Incluye proveedores para bases de datos SQL Server, OLE DB, Open Database Connectivity (ODBC), SQL Server Compact Edition y Oracle. • ADO.NET Data Services Framework. Este framework permite exponer información de cualquier fuente de datos Linq, típicamente un Entity Data Model, mediante REST sobre HTTP. La información puede direccionarse mediante Uniform Resource Identifiers (URIs). Taller de Formación.NET En lo que resta de la lección se revisarán los pasos para el diseño de componentes asociados a datos. El primer paso es identificar las restricciones asociadas a los datos que se accederán, lo cual ayudará a identificar la tecnología de acceso a datos adecuada. El siguiente paso consiste en decidir la estrategia de mapeo y el enfoque de acceso a datos que se desea implementar, esto consiste en identificar las entidades de negocio y la forma de representarlas. Luego se puede determinar cómo los componentes de acceso a datos se conectarán a la fuente de datos. Finalmente, se determina la estrategia para manejo de excepciones en el acceso a datos. Es importante conocer con cuáles tecnologías se cuenta en la plataforma y para qué escenarios es mejor una que otra. De esta manera, se pueden tomar otras decisiones necesarias (por ejemplo: capacitación sobre determinada tecnología). Por tal motivo, se incluye en esta guía una descripción de las tecnologías disponibles. El sitio web de la Microsoft Developer Network (MSDN) [2] es el lugar indicado para utilizar como referencia en todo momento de un proyecto en la plataforma Microsoft, principalmente al momento de desarrollar, en particular para la plataforma .NET Framework, ya que, por ejemplo, cuenta con documentación y ejemplos. 557 Taller de Formación.NET Los servicios Web pueden configurarse para que retornen los datos con formato Atom y JavaScript Object Notation (JSON). • ADO.NET Entity Framework (EF): es un conjunto de tecnologías ADO.NET que permiten el desarrollo de aplicaciones orientadas a datos. Brinda una experiencia de acceso fuertemente tipada sobre base de datos relacionales. Mueve datos desde el modelo de almacenamiento o lógico (las estructuras físicas de las tablas relacionales) al modelo conceptual (que refleja los objetos de negocio). Introduce Entity Data Model a ADO.NET [4]. Soporta LINQ to Entities. Permite que los programadores trabajen: •con datos en forma de objetos y propiedades específicos del dominio; por ejemplo, con clientes y direcciones, sin tener que pensar en las tablas y columnas de las bases en las que se almacenan sino que consultan las entidades y relaciones en el modelo de dominio (modelo conceptual), •basados en EF para traducir esas operaciones en los comandos específicos del origen. El modelo conceptual, el modelo de almacenamiento y las asignaciones entre los dos se expresan en esquemas basados en XML y se definen en archivos de extensiones correspondientes: El Conceptual Schema Definition Language (CSDL) define el modelo conceptual. Es la implementación de EF del Entity Data Model. La extensión de archivo es .csdl. El Store Schema Definition Language (SSDL) define el modelo de almacenamiento. La extensión de archivo es .ssdl. El Mapping Specification Language (MSL) define las asignaciones entre los modelos conceptual y de almacenamiento. La extensión de archivo es .msl. Estos modelos y archivos de asignación permiten a EF transformar las operaciones de creación, lectura, actualización y eliminación de las entidades y relaciones del modelo conceptual en las operaciones equivalentes en el origen de datos [4]. A continuación se muestra un ejemplo de cómo se pueden consultar tanto entidades como asociaciones [5]. 558 Taller de Formación.NET ADO.NET Sync Services. Es un proveedor incluido en el Microsoft Sync Framework y se utiliza para implementar sincronización en bases de datos embebidas en ADO.NET. Language Integrated Query (LINQ). Brinda librerías para extender C# y Visual Basic con lenguaje nativo para consultas. Es, primero que nada, una tecnología de consultas soportada por diferentes assemblies a través del .NET Framework, por ejemplo: • LINQ to Entities está incluido en los assemblies ADO.NET Entity Framework. • LINQ to XML está incluido en los assemblies System.Xml. • LINQ to Objects está incluido en .NET Framework core system assemblies. Las consultas pueden ser ejecutadas para diferentes formatos, entre ellos: • DataSet (LINQ to DataSet). • XML (LINQ to XML). • objetos de memoria (LINQ to Objects). • ADO.NET Data Services (LINQ to Data Services). • datos relacionales (LINQ to Entities). • LINQ to SQL brinda una solución a consultas fuertemente tipada para SQL Server. Todas las operaciones de consulta LINQ se componen de tres acciones distintas. [6] • Obtención del origen de datos. • Creación de la consulta. • Ejecución de la consulta. 559 La elección de una apropiada tecnología de acceso a datos debe tomar en cuenta el tipo de datos y cómo se manipularán. Ciertas tecnologías son mejores para determinados escenarios. Taller de Formación.NET 5.1.1 Escenarios de uso de aplicaciones 560 La siguiente guía pretende ser útil al momento de mapear escenarios de uso de aplicaciones con las soluciones tecnológicas de acceso a datos disponibles. ADO.NET Entity Framework (EF). Si se desea: • crear un modelo de datos y mapearlo a una base de datos relacional, • mapear una clase a múltiples tablas usando herencia, • realizar consultas relacionales a almacenes que no sean de la familia Microsoft SQL Server. EF es apropiado cuando se tiene un modelo de objetos y se necesita mapear a un modelo relacional usando un esquema flexible, y se necesita la flexibilidad de separar el esquema mapeado del modelo de objetos. Si se usa EF considerar usar: LINQ to Entities: si es necesario, • realizar consultas sobre las entidades fuertemente tipadas. • ejecutar consultas sobre los datos relacionales usando sintaxis LINQ. ADO.NET Data Services Framework. Esta construido sobre EF y permite exponer parte del modelo entidad mediante una interfaz REST (URIs). Considerar su uso si se está desarrollando un RIA o una aplicación cliente en N-capas y se desea acceder a datos mediante una interfaz centralizada de recursos. ADO.NET Core. Considerarla si se necesita o desea: • Usar una API de bajo nivel para mayor control sobre los datos. • Aprovechar lo existente y convertirse en proveedores de ADO.NET. • Se está utilizando un acceso lógico a la base de datos. Es apropiado si no se necesita de las funcionalidades que ofrecen las otras tecnologías de acceso a datos o se está implementando una aplicación que debe soportar experiencia de acceso a datos sin conexión. ADO.NET Sync Services. Considerarla si se está diseñando una aplicación que: • Debe soportar eventuales escenarios de conexión. • Requiere colaboración entre bases de datos. • Windows Mobile, para el sincronizado contra una base de datos centralizada. LINQ to Data Services. Si se: • utilizan datos en el cliente que retornan de ADO.NET Data Services, • desean realizar consultas usando sintaxis. LINQ desde el cliente o vía REST. LINQ to DataSets. Si se desea: • ejecutar consultas sobre un DataSet, incluyendo consultas que realicen joins de tablas; • usar un lenguaje de consultas común en vez de código iterativo. LINQ to Entities. Si se está utilizando: • ADO.NET Entity Framework. • Consultas sobre entidades fuertemente tipadas. • consultas sobre datos relacionales usando sintaxis LINQ. LINQ to Objects. Consultas sobre: • una colección, • directorio de archivos, • objetos en memoria usando sintaxis LINQ. LINQ to SQL. LINQ to Entities es la solución recomendada para utilizar LINQ en escenarios con una base de datos relacional. Si bien LINQ to SQL seguirá con soporte no será el foco de innovación o mejoras. Si ya se está utilizando LINQ to SQL se puede seguir usando. Para nuevas soluciones considerar el uso de LINQ to Entities en su lugar. LINQ to XML. Si se utilizan datos XML y se desea utilizar sintaxis LINQ para ejecutar consultas. 5.1.2 Beneficios y consideraciones de cada tecnología Acceso a datos Objeto-Relacional ADO.NET Entity Framework (EF) Beneficios Desacopla la estructura de datos del modelo de datos lógico. Entity SQL brinda un lenguaje consistente sobre todas las fuentes de datos y tipos de base de datos. Separa la metadata en capas de la arquitectura bien definidas. Brinda a los desarrolladores de la capa de negocios acceso a los datos sin necesidad de conocer particularidades (especificaciones) de la base de datos. Permite que el modelo sea mapeado a otras bases de datos. Consideraciones LINQ to Entities Beneficios Una solución basada en LINQ para datos relacionales en el ADO.NET Entity Framework. Brinda acceso LINQ fuertemente tipado. El procesamiento se realiza del lado del servidor. Consideraciones Requiere ADO.NET Entity Framework. LINQ to SQL Beneficios Taller de Formación.NET Requiere un cambio en el diseño de entidades y consultas si se trabajaba con un método tradicional. Tiene más niveles de abstracción que LINQ to DataSet. Se puede usar sin LINQ. Si la estructura de la base de datos cambia, es necesario regenerar el Entity Data Model y re-deployar las librerías del EF. 561 Lectura y escritura de modelo de datos como objetos cuando estos modelos coinciden. Brinda acceso LINQ fuertemente tipado. Procesamiento del lado del servidor. Consideraciones En .NET Entity Framework 4.0 se mapean consultas LINQ directamente a la base de datos en lugar de un provider. Trabaja solo con Microsoft SQL Server. Acceso a datos sin conexión. LINQ to DataSet Beneficios Permite realizar todo tipo de consultas sobre un DataSet. Consideraciones Todo el procesamiento se da en el cliente. Taller de Formación.NET ADO.NET Sync Services Beneficios Brinda sincronización entre bases de datos, escenarios de colaboración y sin conexión. La sincronización puede ejecutar en background. Consideraciones Hay que implementar el traqueo de cambios. Las grandes cantidades de datos pueden degradar notoriamente la performance. 562 SOA/Services ADO.NET Data Services Framework Beneficios Los datos pueden ser accedidos directamente mediante una URI usando un esquema REST y retornados tanto en formato Atom o JSON. El .NET Framework, Silverlight y las bibliotecas de cliente AJAX permiten trabajar directamente con objetos dando acceso LINQ a ADO.NET Data Services, así como una API para Windows Azure Tables, SQL Data Services, etc. Consideraciones Ideado para escenarios orientados a servicios. LINQ to Data Services Beneficios Permite crear consultas LINQ del lado del cliente y los datos se retornan de ADO.NET Data Services. Soporta consultas LINQ sobre datos REST. Consideraciones Requiere ADO.NET Data Services del lado del cliente. N-capas y genéricas ADO.NET Core Beneficios Incluye código manejado de proveedores para acceder a varios almacenes de datos. Brinda facilidades para manipulación de datos. Consideraciones El código se escribe directamente para determinados proveedores, reduciendo la reusabilidad. La estructura de la base de datos puede implicar la creación de un modelo nuevo. LINQ to Objects Beneficios Permite crear consultas LINQ sobre objetos en memoria. Puede ser utilizado: Sobre cualquier colección que soporte IEnumerable o IEnumerable<T>. Para consultar strings, metadata basada en reflection y directorio de archivos. Consideraciones Soporte para objetos que implementen IEnumerable. LINQ to XML Beneficios Permite crear consultas LINQ sobre datos XML. Se compara con Document Object Model (DOM). Consideraciones No está optimizado para dar soporte a seguridad. 5.1.3 Consideraciones generales. Si se necesita o se está buscando máxima Flexibilidad y Performance, considerar usar ADO.NET Core. SOA • Exponiendo la base de datos como un servicio, ADO.NET Data Services, • almacenando la información en la nube, SQL Data Services. Microsoft Windows Mobile, considerar la base de datos SQL Server Compact Edition y ADO.NET Sync Services para mantener la información en el dispositivo móvil y sincronizarla con un mecanismo basado en el servidor. Taller de Formación.NET • Una solución basada en O/RM o con soporte a múltiples bases de datos, considerar el Entity Framework, • escenarios sin conexión, considerar usar DataSets o el Sync Framework. Un escenario N-capas donde: • los datos pasen entre las capas, Data Transfer Objects (DTO), • centralizar recursos (REST), ADO.NET Data Services, • centralizar operaciones (SOAP), Windows Comunication Fundation (WCF). 563 5.2 Paso 2 – Seleccionar como recuperar y persistir objetos de negocio desde un almacén de datos Luego de identificar los requerimientos de la fuente de datos, el próximo paso consiste en seleccionar la estrategia para poblar los objetos o entidades de negocio desde los almacenes de datos y persistirlos en las fuentes de datos. El enfoque más común usa herramientas o frameworks Object/Relational Mapping (O/RM). Al momento de mapear esas entidades a estructuras de datos, el principal factor para decidir cómo realizar ese mapeo es el tipo de entidades que utiliza la aplicación. 5.3 Paso 3 – Determinar cómo conectarse a la fuente de datos Una vez que se tiene el mapeo, es necesario identificar como conectarse a la fuente de datos, proteger las credenciales de los usuarios y realizar transacciones. A continuación, se muestran los principales puntos a considerar (cada uno incluye varias consideraciones para lograr el enfoque adecuado). Taller de Formación.NET 5.3.1 Conexiones 564 Conexiones a fuentes de datos son una parte fundamental de la capa de datos. Debe coordinar todas las conexiones a la fuente de datos. Asegurarse de abrir las conexiones a la fuente de datos tan tarde como sea posible y se cierran tan pronto como sea posible. De esta forma, se asegura que el bloqueo sobre recursos es tan corto como sea posible y se queda libre para otro proceso. Si no se tienen datos volátiles, usar concurrencia optimista para mitigar el costo de bloquear datos en la base (evitando overhead). Realizar transacciones a través de una conexión cuando sea posible. Esto permite características de ADO.NET sin la necesidad de servicios coordinadores de transacciones distribuidas. Si se usa un pool, realizar una prueba de carga con escenarios simultáneos y tunear la performance basado en los resultados. Por razones de seguridad, evitar el uso de System o User Data Source Name (DSN) para almacenar la información de conexión. Diseñar la lógica de “re-intento” para manejar situaciones donde la conexión a la fuente de datos se pierda o de time-out. Ejecutar comandos por lotes (batch) en la base de datos, en la medida que sea posible, para evitar tráfico excesivo (“idas y vueltas”). Otro aspecto importante a considerar son los requerimientos de seguridad para acceder a la fuente de datos. En otras palabras: ¿cómo se autenticarán los componentes de acceso a datos con la fuente de datos? ¿Y cuáles son los requerimientos de seguridad? Preferible Autenticación Windows que SQL Server. • Si se utiliza Microsoft SQL Server considerar utilizar autenticación Windows con subsistema confiable. 5.3.2 “Pooles” de Conexión Los pooles de conexión permiten que aplicaciones vuelvan a usar conexiones de un pool, o crear una nueva y agregarla al pool si no hay una conexión disponible. Cuando una aplicación cierra la conexión esta se devuelve al pool, pero la conexión permanece abierta. Esto significa que ADO.NET no necesita crear una nueva conexión y abrirla contra la fuente de datos todo el tiempo. Si bien consumen recursos, reducen los delays asociados al acceso a datos y hacen que las aplicaciones corran más eficientes cuando hay conexiones disponibles. 5.3.3 Transacciones y concurrencia Considerar formar transacciones con las operaciones críticas para el negocio. En general, se pueden seleccionar entre tres tipos de transacciones: System.Transactions namespace classes, brindadas como parte del .NET Framework con soporte a transacciones implícitas y explicitas. Considerar su uso si se está desarrollando una aplicación nueva que requiera soporte de transacciones. Para la mayoría de las transacciones, el enfoque recomendado es usar el modelo implícito que brinda el objeto TransactionScope en el namespace System.Transaction. Si bien no son tan rápidas como las manuales, o explicitas, son más fáciles de desarrollar y se logran soluciones flexibles y mantenibles. ADO.NET Transactions basadas en una conexión simple. Este es el enfoque más eficiente para transacciones controladas por clientes en un único almacén de datos. Considerar su uso si se está extendiendo una aplicación que ya utilizaba esta tecnología o se esté desarrollando para un entorno que no soporte la versión 2.0 del Framework .NET T-SQL (Database) Transactions controladas por comandos ejecutados en la base de datos. Son más eficientes para transacciones controladas por el servidor en un único almacén de datos, donde la base de datos gestiona toda la transacción. Considerar esta tecnología en el desarrollo de stored procedures que encapsulan todos los cambios que debe manejar la transacción o que usan varias aplicaciones, y los requerimientos de la transacción se pueden encapsular en él. 5.4 Paso 4 – Determinar la estrategia para manejo de errores en el acceso a fuentes de datos No deberían pasar para otra capa, salvo que afecten a la aplicación o alguna funcionalidad. Objetos que manejan la semántica de comunicación con servicios externos. 6 Bibliografía Microsoft, Microsoft Application Architecture Guide, 2nd Edition. Patterns & Practices, 2009. Sitio Web de la MSDN. [Online]. Available: http://msdn.microsoft.com. [Accessed: 01Oct-2011]. Tutorial rápido (Entity Framework) [Online]. Available: http://msdn.microsoft.com/eses/library/bb399182.aspx [Accessed: 5-Aug-2011]. Información general de Entity Framework [Online]. Available: http://msdn.microsoft. com/es-es/library/bb399567.aspx [Accessed: 5-Aug-2011]. Consultar entidades y asociaciones. [Online]. Available: http://msdn.microsoft.com/eses/library/bb386884.aspx [Accessed: 22-Aug-2011]. Introducción a las consultas LINQ. [Online]. Available: http://msdn.microsoft.com/eses/library/bb397906.aspx [Accessed: 1-Jul-2011]. Taller de Formación.NET 5.5 Paso 5 –Diseñar Service Agent Objetcts (opcional) 565 Windows Communication Foundation Taller de Formación.NET Qué es Windows Comunication Foundation (WCF) 566 El uso global de Web Services ha cambiado la forma en que se desarrollan las aplicaciones. Por ejemplo, las funciones que los Web Services proveen en la actualidad incluyen: seguridad, coordinación de transacciones distribuidas y comunicaciones confiables. Windows Communication Foundation (WCF) esta diseñado para ofrecer un enfoque administrable a la computación distribuida, la interoperabilidad y, en definitiva, la arquitectura orientada a servicios. En otras palabras Windows Communication Foundation (WCF) es un framework1 para la creación de aplicaciones basadas en servicios. Utilizando WCF se puede enviar información como mensajes asíncronos desde un “lugar” a otro. Este “lugar” se denomina endpoint. Un endpoint son lugares donde los mensajes son enviados o recibidos (o ambos) y definen toda la información necesaria para el intercambio de mensajes. Un endpoint puede ser parte de un servicio alojado en el Internet Information Server (IIS) o puede ser un servicio alojado en una aplicación. Un endpoint puede ser un cliente de un servicio que solicita información a otro endpoint. Los mensajes pueden ser tan simples como un único carácter o palabra enviado como un XML o tan complejos como una secuencia de datos binarios. Algunos escenarios de ejemplo pueden ser los siguientes: • Un servicio de seguridad que procesa transacciones bancarias. • Un servicio que provee información a otros servicios, como ser reportes de tráfico o algún otro servicio de monitoreo. • Un servicio de chat que permite a dos personas comunicarse o intercambiar información en tiempo real. La inclusión de esta tecnología no implica que antes de su existencia no se podían desarrollar este tipo de servicios, todo lo contrario, pero WCF hace que el desarrollo de los endpoints sea mucho más sencillo. En resumen, WCF esta diseñado para ofrecer un enfoque más sencillo a la creación de Web Services (servicios web) y clientes de Web Services. Ejemplo ilustrativo de la utilización de WCF El siguiente ejemplo ilustra algunos de los problemas que WCF aborda. Una compañía de renta de autos decide crear una nueva aplicación de reservas. Los diseñadores de esta nueva aplicación saben que la lógica de negocio debe ser accedida por otras aplicaciones ejecutadas En el desarrollo de software, un framework o infraestructura digital, es una estructura conceptual y tecnológica de soporte definido, normalmente con artefactos o módulos de software concretos, con base a la cual otro proyecto de software puede ser más fácilmente organizado y desarrollado. 1 dentro y afuera de la compañía. En consecuencia, deciden diseñar una arquitectura orientada a servicios, con la lógica de la aplicación expuesta a través de un conjunto bien definido de servicios. Los diseñadores saben que, al momento de crear la aplicación, la misma será accedida por, al menos, otras tres aplicaciones. Taller de Formación.NET 1. Una aplicación cliente de “call center” que se ejecuta en máquinas cuyo sistema operativo es Windows y es usada por empleados dentro de la organización. Esta aplicación será creada especialmente para el nuevo sistema de reserva y usará también el framework .NET y WCF. 2. Una aplicación existente de reservas hecha en J2EE ejecutando en un servidor Windows dentro de la compañía. Debido a una reciente asociación con otra firma de renta de autos la aplicación existente debe poder acceder a la lógica de la nueva aplicación y proveer a los clientes una experiencia unificada. 3. Aplicaciones de firmas de socios ejecutando en un conjunto variado de plataformas, esto incluye: agencias de viaje, aerolíneas y cualquier compañía que tenga la necesidad de crear reservas de renta de autos. Este es un escenario perfectamente realista y representa algunos desafíos. Para la interacción con el Call Center, por ejemplo, la velocidad de respuesta es importante, mientras que la interoperabilidad es directa (comunicación .NET a .NET). Para la comunicación con la aplicación existente de reservas hecha en J2EE o las aplicaciones de las firmas socios, la interoperabilidad se convierte en el objetivo primario. Los requerimientos de seguridad son también muy diferentes, desde una comunicación entre máquinas en una intranet Windows (Active Directory) a máquinas ejecutando en lugares remotos en otros sistemas operativos. WCF esta diseñado para abordar éste y otros escenarios diversos pero realistas. 567 Arquitectura de una aplicación típica WCF Arquitectura típica de una aplicación empresarial, mostrando la capa de servicios. Taller de Formación.NET La capa de servicios comúnmente debe incluir: 568 • Interfaz de servicios. El servicio expone una interfaz donde los mensajes entrantes son enviados. La interfaz de servicios se puede pensar como una fachada que expone la lógica de negocio implementada en la aplicación. Tipos de mensajes. Cuando se intercambian datos a través de la capa de servicios las estructuras de datos son empaquetados en mensajes que soportan distintos tipos de operación. La capa de servicios, típicamente, va a definir tipos de datos y contratos que se usan en los mensajes. Comenzar a trabajar con WCF A lo largo de este documento vamos a repasar ordenadamente los pasos que se necesitan para crear aplicaciónes WCF y sus clientes. Un servicio es una entidad que expone uno o mas “endpoints” cada uno de los cuales expone una o más operaciones de servicio. El endpoint de un servicio especifica la dirección (Address) donde el servicio puede ser ubicado, un elemento (Binding) que indica el tipo de comunicación que se va a establecer y un contrato (Contract) que define la funcionalidad que provee el servicio a sus clientes. Esto es comúnmente llamado el “ABC”: • Address • Binding • Contract Veamos ahora cómo definir un servicio WCF con un contrato, cómo implementar el servicio, cómo configurarlo y, por último, cómo ejecutarlo. Esto se desarrollará en seis pasos. 1. Cómo definir un contrato de un servicio WCF Cuando se crea un servicio básico en WCF la primera tarea es definir el contrato. El contrato especifica cuáles operaciones tendrá el servicio. Los contratos son creados definiendo una interfaz en C++, C# o Visual Basic. Cada método en la interfaz corresponde a una operación específica del servicio. Cada interfaz debe contener el atributo ServiceContractAttribute y cada operación debe contener el atributo OperationContractAttribute. Si un método dentro de una interfaz no contiene el atributo antes mencionado, dicho método no será expuesto por el servicio. Los pasos para la creación del contrato son los siguientes: 5. Luego, cambie el espacio de nombres en el archivo Program.cs generado a Microsoft. ServiceModel.Samples como se muestra en el siguiente ejemplo: Taller de Formación.NET 1. Abra Visual Studio 2010 como administrador haciendo clic con el botón secundario en el programa en el menú Inicio y seleccionando Ejecutar como Administrador. 2. Cree un nuevo proyecto de aplicación de consola. Haga clic en el menú Archivo y seleccione Nuevo, Proyecto. En el cuadro de diálogo Nuevo proyecto, seleccione Visual C#. Elija la plantilla Aplicación de consola y denomínela Service. Use la ubicación predeterminada. 3. En un proyecto, Visual Studio crea un archivo denominado Program.cs. Esta clase contendrá un método vacío denominado Main(). 4. Cambie el espacio de nombres (namespace) Service predeterminado a Microsoft.ServiceModel.Samples. Para ello, haga clic con el botón secundario en el proyecto en el Explorador de soluciones y seleccione Propiedades. Asegúrese de que esté seleccionada la pestaña Aplicación situada a la izquierda del cuadro de diálogo Propiedades. Luego, escriba Microsoft.ServiceModel.Samples en el cuadro de edición que tiene la etiqueta Espacio de nombres predeterminado. Haga clic en el menú Archivo y seleccione Guardar todo para guardar los cambios. 569 6. Agregue una referencia a System.ServiceModel.dll al proyecto. a. En el Explorador de soluciones, haga clic con el botón secundario en la carpeta Referencias bajo la carpeta del proyecto y elija Agregar referencia. b. Seleccione la pestaña .NET en el cuadro de diálogo Agregar referencia y desplácese hacia abajo hasta que vea System.ServiceModel (versión 4.0.0.0), selecciónelo y haga clic en Aceptar. 7. Agregue una instrucción using para el espacio de nombres System.ServiceModel.using System.ServiceModel. 8. Defina una nueva interfaz denominada ICalculator y aplique el atributo ServiceContractAttribute a la interfaz con un valor de Namespace de “http://Microsoft.ServiceModel. Samples”. Especificar el espacio de nombres explícitamente es un procedimiento recomendado porque evita que el valor de espacio de nombres predeterminado se agregue al nombre del contrato. 9. Declare un método para cada una de las operaciones que el contrato ICalculator expone (suma, resta, multiplicación y división) dentro de la interfaz y aplique el atributo OperationContractAttribute a cada método que desee exponer como parte del contrato público de WCF. Taller de Formación.NET El siguiente código unificará el resultado obtenido al realizar cada uno de los pasos detallados anteriormente: 570 2. Cómo implementar un contrato de servicio de Windows Communication Foundation Ésta es la segunda de las seis tareas que son necesarias para crear un servicio básico en Windows Communication Foundation (WCF) y un cliente que llame al servicio. La creación de un servicio WCF requiere que se cree primero el contrato, que se define mediante una interfaz, esta tarea fue realizada en la sección anterior. El siguiente paso, mostrado en este ejemplo, es implementar la interfaz. Esto implica la creación de una clase denominada CalculatorService que implemente la interfaz ICalculator definida por el usuario. Los pasos para la implementación de la interfaz son los siguientes: 1. Cree una nueva clase denominada CalculatorService en el mismo archivo donde definió la interfaz ICalculator. CalculatorService implementa la interfaz ICalculator. public class CalculatorService: ICalculator 2. Implemente cada método definido en la interfaz ICalculator dentro de la clase CalculatorService. Taller de Formación.NET El siguiente ejemplo de código muestra la interfaz que define el contrato de servicio y la implementación de la interfaz. Es decir, se despliega tanto el código escrito en la sección anterior como en la presente: 571 Taller de Formación.NET 572 Ahora, el contrato de servicio se ha creado e implementado. Compile la solución para asegurarse de que no hay ningún error de compilación y, a continuación, continúe en Procedimiento para hospedar y ejecutar un servicio básico de Windows Communication Foundation para ejecutar el servicio. Para compilar el código diríjase al menú Generar, haga clic en Generar solución. 3. Procedimiento para hospedar y ejecutar un servicio básico de Windows Communication Foundation Ésta es la tercera de las seis tareas necesarias para crear un servicio Windows Communication Foundation (WCF) básico y un cliente que pueda llamar al servicio. En este tema se describe cómo ejecutar un servicio básico de Windows Communication Foundation (WCF). Este procedimiento consta de los siguientes pasos: • Crear una dirección base para el servicio. • Crear un host del servicio para el servicio. • Habilitar el intercambio de metadatos. • Abrir el host del servicio. En el ejemplo que se ofrece después del procedimiento se proporciona una lista completa del código escrito en esta tarea. Agregue el código siguiente al método Main() definido en la clase Program. Esta clase se generó al crear la solución Service. Configuración de una dirección base para el servicio 1. Cree una instancia de Uri para la dirección base del servicio. Este identificador URI especifica el esquema HTTP, su equipo local, el número de puerto 8000 y la ruta de acceso ServiceModelSample/Service correspondiente al servicio que se especificó para el espacio de nombres del servicio del contrato. Para hospedar el servicio 2. Cree una nueva instancia de ServiceHost para hospedar el servicio. Debe especificar el tipo que implementa el contrato de servicios y la dirección base. En este ejemplo, la dirección base es http://localhost:8000/ServiceModelSamples/Service y Calculator. Service es el tipo que implementa el contrato de servicio. 3. Agregue una instrucción try-catch que detecte una CommunicationException y agregue el código en los tres pasos siguientes al bloqueo de intentos. La cláusula catch debería mostrar un mensaje de error y, a continuación, llamar a selfHost.Abort(). Taller de Formación.NET 1. Importe el espacio de nombres System.ServiceModel.Description. Esta línea de código se debería colocar en la parte superior del archivo Program.cs con el resto de las instrucciones using o imports. 573 4. Agregue un endpoint que exponga el servicio. Para ello, debe especificar el contrato que el endpoint está exponiendo, un enlace y la dirección del endpoint. Para obtener este ejemplo, especifique ICalculator como el contrato, WSHttpBinding como el enlace y CalculatorService como la dirección. Observe que la dirección del endpoint es una dirección relativa. La dirección completa del endpoint es la combinación de la dirección base y la dirección del endpoint. En este caso la dirección completa es http://localhost:8000/ServiceModelSamples/ Service/CalculatorService. 5. Habilite el intercambio de metadatos. Para ello, agregue un comportamiento de metadatos de servicio. Primero, cree una instancia de ServiceMetadataBehavior, establezca la propiedad HttpGetEnabled en true y, a continuación, agregue el nuevo comportamiento al servicio.2 Taller de Formación.NET 6. Abra el ServiceHost y espere a los mensajes entrantes. Cuando el usuario presione la tecla Entrar, cierre el ServiceHost. 574 Para obtener más información sobre los problemas de seguridad al publicar metadatos, vea Security Considerations with Metadata. 2 Para comprobar si el servicio funciona 1. Ejecute service.exe desde dentro de Visual Studio. Al ejecutarse en Windows Vista, el servicio se debe ejecutar con privilegios de administrador. Dado que Visual Studio se ejecutó con privilegios de administrador, service.exe también se ejecuta con dichos privilegios. También puede iniciar un nuevo símbolo del sistema con privilegios de administrador y ejecutar service.exe desde allí. 2. Abra Internet Explorer y vaya a la página de depuración del servicio en http://localhost:8000/ServiceModelSamples/Service. El siguiente ejemplo incluye la implementación de los pasos anteriores del tutorial y hospeda el servicio en una aplicación de consola. Ésta es la cuarta de las seis tareas que son necesarias para crear un servicio de Windows Communication Foundation (WCF) básico y un cliente que puede llamar al servicio. En este tema se describe cómo se pueden recuperar metadatos desde un servicio WCF y usarlos para crear un proxy WCF que pueda obtener acceso al servicio. Esta tarea se completa con ayuda de la Herramienta de utilidad de metadatos de ServiceModel (Svcutil.exe) que WCF proporciona. Esta herramienta obtiene los metadatos del servicio y genera un archivo de código fuente administrado para un proxy en el lenguaje elegido. Además de crear el proxy Taller de Formación.NET 4. Creación de un cliente de Windows Communication Foundation 575 de cliente, la herramienta también crea el archivo de configuración para el cliente que permite que la aplicación cliente se conecte al servicio en uno de sus endpoints. Taller de Formación.NET Creación de un cliente de Windows Communication Foundation 576 1. Siga estos pasos para crear en la solución actual un nuevo proyecto para el cliente en Visual Studio 2010: a. En el Explorador de soluciones (en la esquina superior derecha) de la misma solución que contiene el servicio, haga clic con el botón secundario en la solución actual (no el proyecto) y seleccione Agregar y, a continuación, Nuevo proyecto. b. En el cuadro de diálogo Agregar nuevo proyecto, seleccione Visual C# y elija la plantilla Aplicación de consola y denomínela Cliente. Utilice la ubicación predeterminada. c. Haga clic en Aceptar. 2. Agregue una referencia a System.ServiceModel.dll para el proyecto. 3. Agregue una instrucción using para el espacio de nombres System.ServiceModel en el archivo Program.cs generado. 4. En Visual Studio, presione la tecla F5 para iniciar el servicio creado en el tema anterior. 5. Ejecute la Herramienta de utilidad de metadatos de ServiceModel (Svcutil.exe) con los modificadores adecuados para crear el código de cliente y un archivo de configuración realizando los siguientes pasos: a. En el menú Inicio, haga clic en Todos los programas y, a continuación, en Visual Studio 2010. Haga clic en Visual Studio Tools y, a continuación, en Símbolo del sistema de Visual Studio 2010. b. Explore hasta el directorio donde desea colocar el código de cliente. Si creó el proyecto de cliente con la configuración predeterminada, el directorio es C:\ Users\<nombre de usuario>\My Documents\Visual Studio 10\Projects\Service\Client. c. Utilice la herramienta de línea de comandos Herramienta de utilidad de metadatos de ServiceModel (Svcutil.exe) con los modificadores adecuados para crear el código de cliente. El siguiente ejemplo genera un archivo de código y un archivo de configuración para el servicio. De forma predeterminada, el código de proxy de cliente se genera en un archivo con nombre después del servicio (en este caso, por ejemplo, CalculatorService.cs) con una extensión adecuada al lenguaje de programación: .cs para C#. El modificador /out cambia el nombre del archivo proxy de cliente a GeneratedProxy.cs. El modificador /config cambia el nombre predeterminado del archivo de configuración de cliente, Output.config, por App.config. Observe que los dos archivos se generan en el directorio C:\Users\<nombre de usuario>\My Documents\Visual Studio 10\Projects\Service\Client. 6. Agregue el proxy generado al proyecto de cliente en Visual Studio, haga clic con el botón secundario en el proyecto de cliente en el Explorador de soluciones y seleccione Agregar y Elemento existente. Seleccione el archivo generatedProxy generado en el paso anterior. Ahora ha creado un cliente Windows Communication Foundation (WCF). 5. Configuración de un cliente básico de Windows Communication Foundation Ésta es la quinta de las seis tareas necesarias para crear un servicio de Windows Communication Foundation (WCF) básico y un cliente que pueda llamar al servicio. En este tema se agrega el archivo de configuración del cliente generado mediante la Herramienta de utilidad de metadatos de ServiceModel (Svcutil.exe) en el proyecto del cliente y se explica el contenido de los elementos de configuración del cliente. La configuración del cliente consiste en especificar el endpoint que utiliza el cliente para obtener acceso al servicio. Un endpoint tiene una dirección, un enlace y un contrato, y cada uno de estos elementos debe especificarse en el proceso de configuración del cliente. Configuración de un cliente de Windows Communication Foundation 1. Agregue el archivo de configuración App.config generado en la sección anterior al proyecto del cliente en Visual Studio. Haga clic con el botón secundario en el proyecto de cliente en el Explorador de soluciones, seleccione Agregar y, a continuación, Elemento existente. A continuación, seleccione el archivo de configuración App.config en el directorio desde el que ejecutó SvcUtil.exe en el paso anterior. (El archivo se llama App.config porque se usó el modificador /config:app.config al generarlo con la herramienta Svcutil.exe.) Haga clic en Aceptar. De forma predeterminada, el filtro del cuadro de diálogo Agregar elemento existente descarta todos los archivos con extensión .config. Para ver estos archivos, seleccione Todos los archivos (*.*) en el cuadro de lista desplegable situado en la esquina inferior derecha del cuadro de diálogo. Agregar elemento existente. archivo de configuración es una versión simplificada del archivo generado. Este ejemplo configura el endpoint que utiliza el cliente para tener acceso al servicio que se ubica en la siguiente dirección: http://localhost:8000/ServiceModelSamples/service. El elemento de endpoint especifica que el contrato Microsoft.ServiceModel.Samples. ICalculator se utiliza para la comunicación que está configurada con el WsHttpBinding pro- Taller de Formación.NET 2. Abra el archivo de configuración generado. Svcutil.exe genera valores para cada ajuste del enlace. El siguiente ejemplo es una vista del archivo de configuración generado. Bajo la sección <system.serviceModel>, busque el elemento <endpoint>. El siguiente 577 porcionado por sistema. Este enlace especifica HTTP como el transporte, la seguridad interoperable y otros detalles de configuración. Ahora se ha configurado el cliente. 6. Cómo usar un cliente de Windows Communication Foundation Esta es la última de las seis tareas necesarias para crear un servicio de Windows Communication Foundation (WCF) básico y un cliente que pueda llamar al servicio. Una vez creado y configurado un proxy de Windows Communication Foundation (WCF) se puede crear una instancia de cliente, y la aplicación de cliente se puede compilar y utilizar para comunicar con el servicio WCF. En este tema se describen los procedimientos para crear y utilizar un cliente de WCF. Este procedimiento hace tres cosas: 1. Crea un cliente WCF. 2. Llama a las operaciones de servicio desde el proxy generado. 3. Cierra el cliente una vez completada la llamada de operación. El código de esta tarea se debería colocar en el método Main() de la clase Program generada en el proyecto de cliente. Taller de Formación.NET Uso de un cliente de Windows Communication Foundation Asegúrese de que el servicio se está ejecutando antes de intentar utilizar el cliente. 578 Para ejecutar el cliente, haga clic con el botón secundario en Cliente en el Explorador de soluciones y elija Depurar, Iniciar nueva instancia. Bibliografía Application Architecture Guide v2 apparchguide.codeplex.com/ What is Windows Communication Foundation? Framework 3.5 [Online] http://msdn.microsoft.com/en-us/library/ms731082(v=vs.90).aspx What is Windows Communication Foundation? Framework 4.0 [Online] http://msdn.microsoft.com/en-us/library/ms731082.aspx Getting Started Tutorial [Online] http://msdn.microsoft.com/en-us/library/ms734712(v=VS.90).aspx Taller de Formación.NET 579 ASP.NET MVC 1 Introducción ASP.NET MVC es un framework para la construcción y desarrollo de aplicaciones web que aplica el patrón general MVC (Model View Controller) al framework de ASP.NET. En el año 2002 se realizó el primer lanzamiento del framework de ASP.NET, y por muchos años fue muy fácil pensar en ASP.NET y Web Forms (una de las tecnologías de presentación utilizada por ASP.NET) como si fueran realmente la misma cosa. La realidad es que ASP.NET es, en sí mismo, un complejo framework extensible para el desarrollo de aplicaciones web. No fue sino hasta el año 2007 que se anunció ASP.NET MVC, y ya en ese momento el patrón MVC se estaba convirtiendo en una de las formas más utilizadas para la construcción de web frameworks. Taller de Formación.NET 1.1 El patrón MVC 580 Es uno de los patrones arquitectónicos de software más importantes en la actualidad y lo viene siendo desde hace muchos años. Es una poderosa y elegante forma de separar los distintos aspectos concernientes a una aplicación. Si bien es cierto que agrega una pequeña cantidad de complejidad al diseño de una aplicación, los beneficios que otorga hacen que el esfuerzo sea ampliamente recompensado. El patrón MVC separa la interface de usuario de una aplicación en tres aspectos principales: 1. El modelo: Un conjunto de clases que describen los datos con los cuales se están trabajando, así como también las reglas de negocio sobre cómo estos datos pueden ser cambiados y manejados. 2. La vista: Define cómo la interface de usuario (UI) será desplegada. 3. El controlador: Un conjunto de clases que maneja la comunicación del usuario, sobre todo el flujo de la aplicación y la lógica específica de la aplicación. 1.2 El patrón MVC aplicado a Web Frameworks El patrón MVC se ha vuelto, en los últimos tiempos, extremadamente popular aplicado a distintos web frameworks en distintas plataformas de ejecución. En ASP.NET MVC se puede mapear de la siguiente forma: 1. Modelo: éstas son las clases que representan el dominio en el que se está interesado. Estos objetos de dominio a menudo encapsulan datos almacenados en una base de datos, así como también el código necesario para la manipulación de los datos. En ASP.NET MVC se traduce generalmente a una capa de acceso a datos (Data Access Layer) de algún tipo utilizando alguna herramienta como ser Entity Framework o NHibernate. 2. Vista: Se representa mediante algún template para generar HTML de forma dinámica. Se detallará esto más adelante. 3. Controlador: Es una clase especial que maneja la relación entre la vista y el modelo. Responde a la entrada del usuario, habla con el modelo y decide qué vista se muestra al usuario, si se muestra alguna. En ASP.NET MVC, por convención, esta clase se denota mediante el sufijo Controller. Es importante destacar que el patrón MVC es un patrón arquitectónico de alto nivel y su aplicación depende mucho de su uso particular. ASP.NET MVC es contextualizado dentro del problema que quiere resolver, es decir, un ambiente carente de estado (stateless) como lo es el ambiente web, y ASP.NET como plataforma subyacente. 2 Creando una aplicación ASP.NET MVC Para crear una nueva aplicación ASP.NET MVC se deben seguir los siguientes pasos: • En el Visual Studio 2010, ir al menú Archivo → Nuevo Proyecto: Taller de Formación.NET • En “Installed Templates” seleccionamos Visual C# → Web → ASP.NET MVC 3 Web Application: 581 • En la siguiente ventana seleccionamos “Internet Application”: Taller de Formación.NET En la misma ventana, en la parte inferior, tenemos varias opciones: a. Para elegir el motor con el cual generar las vistas, en nuestro caso, seleccionaremos Razor. b. Una opción para indicar si se va a utilizar las características de marcado semántico de HTML5, la cual marcamos. c. Una última opción para indicar si deseamos crear junto a nuestro proyecto un proyecto para la realización de testeos unitario, la cual vamos a dejar desmarcada en esta ocasión. 582 Listo, en este momento ya tenemos nuestra primera aplicación ASP.NET MVC pronta. Solamente nos queda presionar F5 para correrla. Nos aparecerá un popup indicando que está corriendo el ASP.NET Development Server en un puerto aleatorio: Y en el navegador se abrirá la página principal de nuestra nueva aplicación: 3 Entendiendo la estructura de la aplicación ASP.NET MVC Una vez creada la aplicación podemos observar que en el Visual Studio, debajo de nuestra solución, se creó toda una estructura de directorios muy particular: Taller de Formación.NET La siguiente tabla detalla los distintos directorios y su función: 583 Esta estructura tiene su razón de ser y está enmarcada en algo llamado Convention over Configuration, un tema que retomaremos un poco más adelante, pasando primero a mostrar en nuestra aplicación el contenido creado en cada uno de los distintos directorios, y su función. • Cuando expandimos el directorio /Controllers, vemos que Visual Studio agregó dos clases Controller: HomeController y AccountController. El HomeController es el controlador de la página principal, el encargado de mostrar la(s) vista(s) principal(es) de nuestra aplicación y responder a los pedidos que el usuario realice desde allí. El AccountController es, por su parte, el encargado de mostrar las vistas correspondientes a lo que es el login de nuestra aplicación, así como también de realizar las acciones de Login, Crear Usuario, etc. Taller de Formación.NET • En el directorio /Views se crearon tres subdirectorios: /Account, /Home y /Shared, así como también varios templates (archivos con extensión cshtml) que corresponden a las distintas vistas creadas por el proyecto por defecto (Figura 9). 584 • En el directorio /Content se encuentra un archivo CSS, Site.css, que es utilizado para agregar estilos css a todo el sitio. Por su parte, en el directorio /Scripts se agregaron varias librerías javascript que pueden resultar muy útiles al momento de desarrollar nuestra aplicación como ser, por ejemplo, jQuery (Figura 10). 4 ASP.NET MVC y sus convenciones Todas las aplicaciones ASP.NET MVC se basan fuertemente en convenciones. Esto permite que los desarrolladores no tengan que estar configurando y especificando cosas que ya pueden ser inferidas basadas en convenciones, es decir, acuerdos sobre distintos aspectos como ser nombres, directorios, etc., de nuestra aplicación. Por ejemplo, para resolver las vistas, ASP.NET MVC utiliza una convención basada en los directorios de la estructura, lo que permite omitir la localización exacta de la vista cuando se referencia una vista desde un controlador. Por defecto, ASP.NET MVC busca el template de la vista en el directorio /Views/[Controller Name]/. 5 Desarrollando nuestra aplicación ASP.NET MVC A modo de práctica, vamos a desarrollar una aplicación muy sencilla que sirva para realizar el ABM (Alta, Baja y Modificación) de Productos almacenados en una base de datos. Por simplicidad, vamos a acceder a la base de datos utilizando Linq To SQL. Taller de Formación.NET 4.1 Convention over configuration El concepto de “Convention over configuration” se hizo popular gracias a otro framework para el desarrollo de aplicaciones web basado en MVC: Ruby on Rails. La idea principal es automatizar todas las tareas que sea posible automatizar. De esta forma, no se malgasta tiempo en tareas repetitivas en cada desarrollo de una nueva aplicación. Este concepto es fácilmente visible en ASP.NET MVC observando la estructura de directorios creada en la aplicación por defecto: • Controllers • Models • Views Estos nombres no necesitan ser configurados en el archivo de configuración de la aplicación, el archivo web.config, estos nombres se espera que sean esos, por convención. Existen varias convenciones en ASP.NET MVC. Por ejemplo, en cuanto a la estructura podemos destacar: • Solamente debe existir un único directorio para las vistas en la aplicación, de nombre Views. • Todas las clases de los controladores terminan con Controller (por ejemplo, HomeController, ProductosController) y estos se encuentran ubicados en el directorio Controllers. • Las vistas que utiliza un controlador determinado se encuentran ubicadas en un subdirectorio del directorio Views, y este es nombrado de acuerdo al nombre del controlador (con excepción del sufijo Controller). Por ejemplo, las vistas para el controlador ProductosController se encontrarán en el directorio /Views/Productos/. 585 5.1 Modelo En nuestra carpeta de modelos creamos una clase llamada ProductosModels, que va a ser la encargada de realizar las operaciones necesarias sobre la base de datos. La base de datos es muy simple y cuenta con una única tabla, Productos, con la siguiente estructura: Taller de Formación.NET Para manejar de forma más sencilla los datos, implementamos una clase, ProductoDTO (DTO: Data Transfer Object, ver referencias). La misma se implementa de la siguiente forma: 586 Ahora nos queda implementar nuestro modelo, ProductosModels, de forma de completar el acceso a los datos. Para ello, por el momento vamos a ofrecer dos métodos: uno para obtener todos los productos de la base de datos, y otro para crear un nuevo producto: 5.2 Controlador Para agregar un nuevo controlador tenemos que realizar un click derecho sobre el directorio Controllers → Add → Controller. Allí veremos una nueva ventana donde tendremos Taller de Formación.NET Estos métodos podrán ser utilizados por el controlador para obtener los productos y crear un nuevo producto, por ejemplo. 587 Taller de Formación.NET que ingresar el nombre del controlador, ProductosController en nuestro caso, y veremos en la parte inferior algo llamado “Scaffolding options”. Scaffolding es una técnica muy popular en los frameworks MVC y, básicamente, sirve para automatizar en cierta medida algunos de los pasos comunes al momento de realizar el alta, baja y modificación de una determinada entidad de software. En nuestro caso elegiremos “Controller with empty read/write actions”: Luego de realizada esta acción tendremos nuestro propio controlador, con cierto código generado por el propio Visual Studio, como se muestra a continuación: 588 Taller de Formación.NET 589 Taller de Formación.NET 590 Es necesario en este momento detenerse a analizar el código que obtuvimos. Como se observa, el controlador en cierta medida no varía demasiado de cualquier otra clase que podamos implementar nosotros, lo único que se nota en principio es que implementa la clase abstracta Controller. Pero hay una particularidad: cada uno de los métodos de esta clase que retorna un ActionResult recibe un nombre especial: Action. Cada Action tiene la responsabilidad de responder a los pedidos del usuario, realizando las tareas apropiadas y retornando la vista generada al usuario (navegador, cliente, etc.) que invocó la acción. En general, una acción de un controlador debe responder a dos tipos de pedidos HTTP: GET y POST. Para distinguir estos dos casos se utiliza, en el caso de las acciones POST, la metadata [HttpPost] en la parte superior de la declaración de la acción. Esto permite, por ejemplo, separar los casos en los cuales se quiere visualizar los datos existentes mediante un pedido GET del caso que se quiera modificar los datos mediante un POST. Vamos ahora a completar el controlador implementando dos acciones: Index y Create. En el caso de la acción Index, lo que se hará es obtener todos los productos para desplegarlos en un listado en la vista, y en el caso de la acción Create, insertará un nuevo producto en la base de datos, enviando los datos desde la vista hacia el modelo. Taller de Formación.NET Si observamos detalladamente el método Index, observamos lo siguiente: • Le solicitamos al modelo que nos retorne la lista de productos. • Le entregamos a la vista la lista que nos retornó el modelo. En este caso, el controlador solamente actua de intermediario entre la vista y el modelo pero, en casos más complejos podría, por ejemplo, agregar validaciones, tomar decisiones dependiendo de ciertas entradas (por ejemplo, usario, rol, etc.). En el caso del método Create podemos observar que recibe como parámetro una FormCollection. Este parámetro representa una colección muy particular, ya que su contenido es todos aquellos valores que se ingresaron en el formulario por parte del usuario. De esta forma, el controlador obtiene esos valores (pudiendo, otra vez, realizar las acciones que crea conveniente) y crea un ProductoDTO para poder enviar al modelo, que va a ser el encargado en definitiva de efectivamente ingresar los datos en la base de datos. 591 5.3 Vistas Taller de Formación.NET Por último, para concluir nuestra aplicación, una parte no menor, la creación de las distintas vistas. Recordemos que las vistas van a ser las responsables de mostrar desplegar la información al usuario, y aquí radica la importancia de las mismas. Para seguir nuestro ejemplo, vamos otra vez a aprovechar las ventajas del scaffolding al momento de crear nuestras vistas. Empecemos con la vista principal de nuestra aplicación, que en nuestro caso va a ser el Index, y lo que va a realizar es mostrar un listado de los distintos productos con los que contamos en nuestra base de datos. Para crear la vista, primero creamos el subdirectorio Productos debajo del directorio Views (recordemos la sección de las convenciones). En el subdirectorio Productos, hacemos click derecho y seleccionamos Add → View… 592 Ahora se abre una nueva ventana, donde tenemos varias opciones: • View Name: El nombre de la vista. En nuestro caso, estamos desarrollando la vista principal, Index. • View Engine: el motor de visualización. Dejamos el valor de Razor. • Marcamos el check box de “Create a strongly typed view”. Esto nos permitirá elegir el tipo de los datos con el que vamos a trabajar en la vista (en nuestro caso será ProductoDTO). Es imprescindible para el correcto funcionamiento del scaffolding. • En Model Class seleccionamos el tipo de datos (el modelo) con el que trabajaremos en la vista, como se explicó en el punto anterior. • En Scaffold Template podemos elegir entre varias opciones para el tipo de template a utilizar, como ser Create, List, Edit, etc. En el caso en que estamos, seleccionamos List: • Luego marcamos que use el layout por defecto que estamos utilizando. • Finalmente, presionamos Add. En este momento ya tenemos creada nuestra vista, si presionamos F5 podremos correr nuestra aplicación y dirigirnos a http://localhost:[puerto]/Productos/Index para acceder al listado de productos de nuestra aplicación: Taller de Formación.NET Como se observa, en este momento el listado se encuentra vacío, por lo que es necesario agregarle nuevos datos. Para ello, necesitamos crear la vista Create. Siguiendo los pasos como se describieron anteriormente podemos generar la siguiente vista: 593 Con la que podremos ahora sí crear nuestros datos. Para ello, ingresamos los distintos datos y presionamos el botón Create, el cual llamará a la acción del controlador Create, que se comunicará con el modelo para crear el producto correctamente. Para nuestro ejemplo ingresamos únicamente dos datos, con lo cual nuestro listado se vería de la siguiente forma: Solamente quedaría agregar, entonces, las vistas para la edición, los detalles y el borrado de un producto, ya que el template, por defecto, creó los links para estas acciones en el listado. Taller de Formación.NET 6 Referencias 594 ASP.NET MVC 3 [Última visita: Noviembre 2011] http://www.asp.net/mvc/mvc3 Creating Model clases with Linq To SQL [Última visita: Noviembre 2011] http://www.asp.net/mvc/tutorials/creating-model-classes-with-linq-to-sql-cs Scott Guthrie blog: Scott Guthrie lider de proyecto del equipo de desarrollo de ASP.NET [Última visita: Noviembre 2011] http://weblogs.asp.net/scottgu/ Data Transfer Object [Última visita: Noviembre 2011] http://en.wikipedia.org/wiki/Data_transfer_object Scaffolding [Última visita: Noviembre 2011] http://en.wikipedia.org/wiki/Scaffold_%28programming%29 ASP.NET MVC 1 Introducción Ya hemos visto el funcionamiento y la arquitectura general de una aplicación ASP.NET MVC. Ahora vamos a enfocarnos en entender más en profundidad a los controladores y las vistas y, más particularmente, su implementación en ASP.NET, así como también las características y facilidades que nos ofrecen. En cuanto al modelo, se puede ver más en profundidad en lo que refiere al acceso a datos. 2 Controladores 2.1 Implementando controladores en ASP.NET MVC Ya hemos visto que la forma de agregar un controlador es mediante la interfaz del propio Visual Studio 2010; la idea ahora es ver con más profundidad qué implica realizar esta acción. Vamos a recordar el HomeController creado por defecto por el Visual Studio 2010: El HomeController (así como también cualquier controlador que implementemos) implementa la clase abstracta Controller. Esta clase abstracta provee una implementación base para todas las características necesarias para que un desarrollador implemente un controlador, sin preocuparse de cosas como el ruteo, por ejemplo. 1 Este comportamiento se conoce como Routing (mecanismo de ruteo), y se verá más detalladamente un poco más adelante. Taller de Formación.NET Como ya se mencionó, los controladores en el marco del patrón MVC son los responsables de responder a las acciones del usuario, en general, esto implica realizar los cambios en el modelo apropiadamente a la entrada realizada por el usuario. De esta forma, los controladores manejan el flujo de la aplicación, trabajan con los datos ingresados y retornan los datos a la vista acorde a la acción realizada por el usuario. Con anterioridad, los servidores web tan solo entregaban como respuesta a un pedido por parte del usuario, páginas HTML estáticas alojadas en el propio servidor. Luego de un tiempo fueron ganando terreno las llamadas páginas dinámicas, o sea, páginas generadas en el momento a través de scripts también alojados en el propio servidor web. En el caso de MVC, el funcionamiento es un poco distinto. Mediante la URL del pedido realizado se identifica qué controlador y qué acción del mismo es necesario instanciar1 y provee los argumentos necesarios para instanciar dicho método. Es este método el que decide qué vista entregar al usuario, y la vista es la que despliega la información al usuario. Es claro que, en vez de tener una relación directa entre la URL y un archivo existente en el servidor web, tenemos una relación entre la URL y un método en un controlador. Por eso es bueno pensar en ASP.NET MVC como un escenario web donde el framework retorna el resultado de llamada a acciones realizada sobre controladores, y no páginas existentes físicamente en el servidor. 595 Además, provee dos características clave: • Action methods: Son los métodos del controlador, que responde a las acciones del usuario. Cada action method es expuesto en una URL distinta y se invoca mediante parámetros extraídos del pedido entrante (o sea, los parámetros forman parte del Request de la acción). • Action results: Se pueden retornar objetos que describan el resultado de una acción (por ejemplo, desplegar una vista o redirigir al usuario a otra URL). 2.2 Recibiendo datos En los controladores, en algún momento de la implementación de algún action method, va a ser necesario poder acceder a los datos ingresados por el usuario en la vista, como ser los datos de un formulario. Las dos formas principales de obtener estos datos son las siguientes: • Extraerlos de un conjunto de objetos de contexto. • Recibirlos como parámetros en el action method. Taller de Formación.NET 2.2.1 Objetos de contexto 596 Es la forma más directa de obtener los datos necesarios. Al crear el controlador implementando la clase abstracta Controller se tiene acceso a un muy amplio conjunto de propiedades que nos permiten acceder a distinta información del Request. 2.2.2 Parámetros de los action methods Como vimos al momento de crear nuestro controlador de Productos, es posible que los métodos del controlador reciban parámetros como, por ejemplo, en el siguiente método: public ActionResult Edit(decimal id) { return View(); } En este caso, el action method recibe el identificador del producto que se quiere editar explícitamente como parámetro. Es posible replicar la forma de recibir los datos, pero de esta manera ciertos datos (como el identificador) se manejan de forma más explícita y permite, además, armar una ruta al producto del estilo: http://[server]:[port]/Productos/Edit/{id} Que es una de las características más importantes del ruteo de ASP.NET MVC. Ingresando esa URL directamente se accede a la vista generada por el controlador mediante la acción Edit con el identificador de producto {id}. 2.3 Generando la respuesta al usuario Luego que el controlador termina de procesar un request, por lo general es necesario generar una response (respuesta). Aquí es donde entran en acción los Action Result. ASP.NET MVC provee distintos tipos de Action Result que tratan de representar las distintas posibilidades al momento de responder a una acción del usuario. Para ello, se utilizan distintas implementaciones de la clase base ActionResult, que retornan objetos que permiten, por ejemplo, mostrar una vista, redirigir a una URL, etc. Se utilizan, además, helpers que ayudan a simplificar la utilización de los distintos ActionResult existentes. La siguiente tabla muestra los action result más comúnmente utilizados: Taller de Formación.NET 597 2.3.1 Retornando HTML para mostrar en una vista La más común de las respuestas desde un action method es generar HTML y enviarlo al navegador. Utilizando las Action Results esto se realiza creando una instancia de la clase ActionResult que especifica la vista que se quiere desplegar con el fin de generar el HTML al usuario. Un ejemplo de esto es con el Action Method Index que Visual Studio genera por defecto: public ActionResult Index() { ViewBag.Message = “Welcome to ASP.NET MVC!”; return View(); } La forma de retornar la vista es mediante el helper View(). También se puede explicitar la vista que se quiere retornar indicando la ruta a la vista: public ActionResult Index() { ViewBag.Message = “Welcome to ASP.NET MVC!”; return View(“~/Views/Other/Index.cxhtml”); } Taller de Formación.NET 2.3.2 Realizando redirecciones 598 Es muy común como resultado de un action method no producir una salida directamente, sino redirigir al usuario a otra URL. Esta otra URL podría perfectamente ser otro action method que sea el responsable de generar la salida al usuario. La forma más básica de redirigir a un navegador es llamando al helper Redirect, que retorna una instancia de la clase RedirectResult: public ActionResult Redirect() { return Redirect(“/Productos/Index”); } Es posible utilizar una redirección a una ruta indicando el controlador, el método y un parámetro, por ejemplo: public ActionResult Redirect() { return RedirectToRoute(new { controller = “Productos”, action = “Index”, id = 5 }); } También podemos redirigir a un action method especifico, de una forma muy sencilla. En caso que el action method se encuentre en el mismo controlador: public ActionResult Redirect() { return RedirectToAction(“Edit”); } Si, por otra parte, el action method se encuentra en otro controlador, se debe indicar el mismo como otro parámetro: public ActionResult Redirect() { return RedirectToAction(“Edit”, “OtroControlador”); } 2.3.3 Enviar datos Además del HTML, hay cantidad de otros datos basados en texto que se podrían necesitar generar en respuesta a una acción del usuario, como ser XML, JSON o texto plano. Para retornar texto plano, se realiza lo siguiente: Taller de Formación.NET public ActionResult Texto() { return Content(“Retorno un texto cualquiera.”, “text/plain”, Encoding.Default); } El helper Content tiene tres parámetros: • El primero son los datos que se van a enviar. • El segundo es el valor de la cabezera HTTP “content-type”. En este caso, para texto plano se utiliza “text/plain”. • El tercero es la codificación, en este caso se utiliza la codificación por defecto. Si, por ejemplo, se quiere retornar XML, se podría realizar lo siguiente: public ActionResult XMLData() { ProductosModels model = new ProductosModels(); var productos = model.GetProductos(); XElement data = new XElement(“Productos”, productos.Select( p => new XElement(“Producto”, new XAttribute(“Id”, p.Id), new XAttribute(“Nombre”, p.Nombre), new XAttribute(“Descripcion”, p.Descripcion), 599 new XAttribute(“Stock”, p.Stock)))); return Content(data.ToString(), “text/xml”); } Para este ejemplo, utilizamos los mismos productos que ya teníamos en nuestro modelo y, mediante la utilización de LINQ To XML, los transformamos en una estructura XML y retornamos esa estructura como un string. El resultado de una llamada a este action method sería el siguiente, en caso de tener dos productos en nuestra base: <Productos> <Producto Id=”0” Nombre=”Producto 0” Descripcion=”Descripcion 0” Stock=”150” /> <Producto Id=”1” Nombre=”Producto 1” Descripcion=”Descripcion 0” Stock=”500” /> </Productos> Taller de Formación.NET Hoy en día es muy común, para trabajar en conjunto con JavaScript, utilizar JSON para retornar los datos. Por suerte, ASP.NET MVC provee un helper que ahorra mucho trabajo a la hora de enviar datos en formato JSON. 600 public ActionResult JsonData() { ProductosModels model = new ProductosModels(); var productos = model.GetProductos(); return Json(productos, JsonRequestBehavior.AllowGet); } Por defecto, y por temas de seguridad, ASP.NET MVC bloquea los pedidos GET de datos Json. Para deshabilitar esta opción, se utiliza el segundo parámetro del helper con el valor JsonRequestBehavior.AllowGet. El resultado de la llamada a este action method sería el siguiente: [{“Id”:0,”Nombre”:”Producto 0”,”Descripcion”:”Descripcion 0”,”Stock”:150}, {“Id”:1,”Nombre”:”Producto 1”,”Descripcion”:”Descripcion 1”,”Stock”:500}] 2.3.4 Retornar archivos y datos binarios También es muy común, para determinadas situaciones, poder responder a un pedido del usuario enviando datos binarios, como puede ser por ejemplo un archivo. Para estos casos, ASP.NET MVC provee un helper cuyo fin específico justamente es ese, el de enviar archivos y datos binarios. Este helper es el File. Para el caso de enviar un archivo almacenado en el servidor, se realiza lo siguiente: public ActionResult GetFile() { string fileName = @”c:\ASPNETMVC_1.pdf ”; string contentType = “application/pdf ”; string downloadName = “ASPNETMVC_1.pdf ”; return File(fileName, contentType, downloadName); } Al momento de invocar al action method GetFile, el navegador va a mostrar una ventana para que el usuario pueda salvar el archivo: El helper File cuenta con tres parámetros, que se explican a continuación: Si, por ejemplo, el contenido de un archivo estuviera cargado en memoria en un arreglo de bytes, se podría enviar el contenido de la siguiente forma: 2.4 Enviando datos desde un Action Method a una vista A menudo, es necesario enviar datos desde un action method que sean necesarios al momento de desplegar la vista. ASP.NET MVC ofrece varias formas diferentes para realizar esto, y veremos a continuación las más utilizadas. 2.4.1 Como parámetro del helper View La forma más común de enviar datos es pasándolos como parámetro del helper View, como se muestra a continuación: public ActionResult Index() Taller de Formación.NET public ActionResult GetFile() { string contentType = “application/pdf ”; string downloadName = “ASPNETMVC_1.pdf ”; byte[] data = .... // Se obtienen los datos de alguna forma return File(data, contentType, downloadName); } 601 { ViewBag.Message = “Welcome to ASP.NET MVC!”; DateTime date = DateTime.Now; return View(date); } En este caso, enviamos a la vista la fecha actual del server. Del lado de la vista ya podemos trabajar con este objeto de la siguiente forma: @{ ViewBag.Title = “Home Page”; } <h2>@ViewBag.Message</h2> La fecha es: @(((DateTime)Model).DayOfWeek) Si bien esto funciona, tiene la desventaja de que, al momento de trabajar en la vista, no contamos con el IntelliSense del Visual Studio. Para poder trabajar con esta importante ayuda se podría realizar lo siguiente: Taller de Formación.NET Como se observa, al principio se indica con @model el tipo del objeto pasado por parámetro para, de esta forma, poder acceder a toda la potencia del editor. 602 2.4.2 Utilizando el ViewBag Esta característica nos permite definir propiedades arbitrarias en un objeto dinámico (el ViewBag) y accederlos directamente en la vista. Es realmente simple de utilizar, como se muestra a continuación: public ActionResult Index() { ViewBag.Message = “Utilizando el ViewBag”; ViewBag.Date = DateTime.Now; return View(); } En la vista, estos datos se accederían de la siguiente forma: @{ ViewBag.Title = “Home Page”; } <h2>@ViewBag.Message</h2> <h3>@ViewBag.Date</h3> La desventaja de usar el ViewBag es el hecho de que no hay forma de saber en tiempo de compilación si el dato se agregó al ViewBag o no, por lo que de existir errores, solo se encontrarán en tiempo de ejecución. ViewBag fue introducido en la versión 3 de ASP.NET MVC. Previamente existía una colección similar llamada ViewData, que se manejaba de forma muy parecida. 3 Vistas Hemos visto que los action methods retornan action results y, además, como se mencionó, la enorme mayoría de las veces los action results son de la clase ViewResult, lo que se corresponde a desplegar las distintas vistas de nuestra aplicación. Si bien hemos visto varios pequeños ejemplos de vistas, ahora se va a entrar más en detalle de las distintas posibilidades que tenemos, utilizando el motor de vistas Razor Engine.2 El motor de Razor View Engine compila las vistas de nuestra aplicación web como forma de mejorar la performance. Para esto, las vistas se traducen a código C#, para posteriormente ser compiladas. Esto es lo que permite que sea tan sencillo incluir código C# embebido en las propias vistas. Las vistas son compiladas al momento de ser utilizadas por primera vez, y las clases compiladas se almacenan en el disco, hasta el momento en que la vista cambie y se necesite recompilar. 3.1 Agregando contenido dinámicamente a las vistas Taller de Formación.NET El objetivo principal de las vistas es el de permitir desplegar los datos de un modelo en la interfaz de usuario. Para ello, es necesario poder agregar contenido dinámicamente a las vistas. El contenido dinámico se genera en tiempo de ejecución y, probablemente, sea distinto para cada pedido. Existen tres técnicas principales para agregar contenido dinámico a las vistas en ASP.NET MVC: 603 El motor Razor Engine fue introducido en ASP.NET MVC, pudiendo elegirse el motor por defecto de ASP.NET en su lugar, o cualquier otro motor implementado por terceros, o por uno mismo, pero esto escapa al alcance de este documento. 2 3.1.1 Utilizando código embebido Para embeber código en una vista, lo único que se debe hacer es anteponer un símbolo @ antes del código a embeber. Por ejemplo, para mostrar una lista de 0 a 9 utilizando viñetas, se realizaría de la siguiente forma: <ul> @for (int i = 0; i < 10; i++){ <li>@i </li> } </ul> Si quisiéramos embeber varias líneas, lo que haríamos es rodear el bloque de código con un “@{“ y un “}”: @{ ViewBag.Title = “Home Page”; } 3.1.2 Utilizando los HTML Helpers Taller de Formación.NET Dos de los HTML helpers más utilizados son el Html.BeginForm y Html.EndForm. Estos helpers generan los tags HTML para la definición de un formulario: @{ Html.BeginForm(“Edit”, “Home”); } @{ Html.EndForm();} Estos tags generan el siguiente código HTML: <form action=”/Home/Edit” method=”post”> </form> Como se nota, ya en el action del form se apunta al action method indicado en el helper. Además, tenemos helpers para los elementos input de HTML, como se muestra en la siguiente tabla: 604 Un poco distinta es la forma de agregar combo boxes mediante la utilización de helpers; en la siguiente tabla se muestra la forma de realizar esto: 3.1.3 Utilizando vistas parciales Pueden darse escenarios donde sea necesario utilizar los mismos fragmentos de código en distintas vistas a lo largo de toda nuestra aplicación web. Para que sea nuestra aplicación mucho más mantenible en estos casos, es que existen las partial views, o sea, vistas parciales. Las vistas parciales son archivos de vistas separados que contienen fragmentos de código que pueden ser incluidos en otras vistas. Para crear una vista parcial, al igual que con las vistas regulares, se hace click derecho encima del directorio donde vamos a crear la vista, luego seleccionamos Add → View… Aparecerá el diálogo de creación de una nueva vista, que ya se ha visto: 4 URL y ruteo En ASP.NET tradicional, utilizando WebForms, cada URL se correspondía unívocamente con un archivo físico alojado en el servidor (por lo general una página, o sea, un archivo .aspx). El servidor web tenía como principal tarea recibir el pedido del usuario y devolver como respuesta la página correspondiente. Esto no funciona de esta forma en ASP.NET MVC porque, como ya se ha mencionado, un URL no se corresponde a un archivo físico, sino que indica qué acción de qué controlador Taller de Formación.NET Una de las opciones, como se ve en la Figura 3 – Diálogo para agregar una nueva vista, es un checkbox que permite crear una vista parcial. Una vez creada la vista parcial, para utilizarla en alguna vista principal, lo que se tiene que hacer es lo siguiente: @Html.Partial(“VistaParcial”) 605 y con cuáles parámetros invocar y, dependiendo de esto, se genera la vista correspondiente. Para manejar entonces los pedidos, ASP.NET MVC utiliza un sistema de ruteo, que tiene dos funciones principales: • Examinar las URLs entrantes, y de estas extraer a qué controlador, qué acción y con cuéles parámetros invocar. • Generar las URLs salientes. En todo el HTML generado los elementos que invocan acciones necesitan que sean generados correctamente, de forma que invoquen al controlador y acción que necesite. Las rutas en un proyecto de ASP.NET MVC se definen en el archivo Global.asax de la solución. En la solución, por defecto, el mapeo de las rutas se define de la siguiente manera: public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute(“{resource}.axd/{*pathInfo}”); routes.MapRoute( “Default”, // Route name “{controller}/{action}/{id}”, // URL with parameters new { controller = “Home”, action = “Index”, id = UrlParameter.Optional } // Parameter defaults ); } Lo importante acá es la línea que comienza con routes.MapRoute. En ella se indica cómo se realiza el mapeo de una URL en nuestra aplicación, en este caso de la forma: {controller}/{action}/{id} 5 Bibliografía Taller de Formación.NET ASP.NET MVC 3 [Última visita: Noviembre 2011] http://www.asp.net/mvc/mvc3 606 Razor View Engine [Última visita: Noviembre 2011] http://weblogs.asp.net/scottgu/archive/2010/07/02/introducing-razor.aspx Scott Guthrie blog: Scott Guthrie lider de proyecto del equipo de desarrollo de ASP.NET [Última visita: Noviembre 2011] http://weblogs.asp.net/scottgu/ Silverlight 1 Introducción El desarrollo de aplicaciones se puede dividir en dos partes bien diferenciadas. Por un lado, se encuentra el desarrollo de la aplicación en sí, con toda la lógica necesaria para su correcto funcionamiento y navegación, al igual que la lógica necesaria para manipular, interpretar y validar los datos que se desean presentar. Por otro, se encuentra el esfuerzo necesario para que dicha aplicación presente al usuario final una interfaz usable y atractiva. En diciembre de 2006 Microsoft hacía pública la primera versión CTP de Silverlight, una nueva tecnología destinada a enriquecer las aplicaciones web. Desde aquel entonces la tecno- Taller de Formación.NET logía ha evolucionado contando con el soporte de la comunidad y, desde abril de 2010, está disponible la versión 4.0 de Silverlight que incorpora grandes avances y múltiples mejoras. [3] La capa que describe la agrupación lógica de las funcionalidades y componentes que brindan la interfaz hacia el usuario en una aplicación se conoce como la capa de presentación (presentation layer). La capa de presentación usualmente incluye UI components: elementos visuales usados para mostrar información y aceptar entrada de usuario. Presentation Logic Components: el código de la aplicación que define el comportamiento lógico y estructura de la aplicación (independiente de la implementación de la interfaz). Cuando se implementa el patrón Separeted Presentation, los componentes lógicos de presentación pueden incluir Presenter, Presentation Model y View Model. La capa de presentación puede incluir componentes de Presentation Layer Model que encapsulen los datos de la capa de negocios o componentes de Presentation Entity que encapsulen la lógica de negocios y datos. 607 1.2 Consideraciones de diseño para la capa de presentación Taller de Formación.NET Hay varios factores que se deben considerar en el diseño de la capa de presentación. Los siguientes principios ayudan a que el diseño de una aplicación siga las mejores prácticas y se cumplan los requisitos. [1] Elegir el tipo adecuado de aplicación: • Rich (smart) client. • Web client. • Rich Internet application (RIA). • Elegir la tecnología adecuada. • Usar patrones. • Modularizar. • Considerar guías de usabilidad. • Seguir principios “user design driven”. 608 2 Silverlight Microsoft Silverlight es una plataforma de desarrollo de Microsoft que permite desarrollar aplicaciones ricas. Silverlight funciona sobre varias plataformas y múltiples exploradores y proporciona una generación de experiencias de usuario basadas en .NET. Es necesaria la instalación del complemento plug-in libre, de unos 5Mb. Ofrece un modelo de programación compatible con lenguajes .NET como Visual Basic .NET, C# y F#, y otros como AJAX, Python, Ruby. Las aplicaciones Silverlight, en general, corren en el cliente y se comunican con servidores y servicios. [3] [4] La versión actual, recomendada y estable, es Silverlight 4 con la cual se trabajará en este curso. Silverlight 5 está disponible en su versión RC (Release Candidate). 2.1 ¿Cuándo utilizar Silverlight? Esta tecnología se debería considerar si se desea diseñar una RIA o determinadas características (ricas) a una aplicación Web. [1] Si desea construir una RIA para el navegador con alcance multiplataforma, buenos gráficos y soporte rich media: • Usar el patrón Presentation Model (Model-View-ViewModel). [11] • Variación de Model-View-Controler (MVC) pensado para plataformas de desarrollo donde la vista es responsabilidad de un diseñador en lugar del desarrollador. • Si se diseñara una aplicación que evolucionará, usar la Patterns & practices Composite Client Application Guidance. [12] Si se desea incluir en una aplicación Web islas con contenido rich media e interacciones considerar Controles Silverlight con ASP.NET. 2.2 ¿Para qué tipo de aplicaciones? 2.3 ¿Qué tipo de aplicaciones permite crear? Si bien su principal característica es crear experiencias atractivas, interactivas de usuario para aplicaciones web, entre otras, no solo se limita a aplicaciones de gráficos intensivos en la web sino que permite desarrollar todo tipo de aplicaciones en la web, el escritorio (gracias a sus características Out of the Browser - OOB), en dispositivos móviles y embebidos, cuando están en línea o fuera de línea. Se pueden crear aplicaciones para: La Web: aplicación Silverlight clásica multi-navegador; El Escritorio: Silverlight OOB en Windows, MAC OSX; Dispositivos móviles: Windows Phone 7; Dispositivos embebidos: Windows Embedded CE platform 7.0. Taller de Formación.NET Luego de identificar qué tipo de UI es adecuada para la aplicación a desarrollar es necesario seleccionar una tecnología para los componentes de UI. En general, esta decisión depende del tipo de UI seleccionada. A continuación se menciona para qué tipo de UI es apropiado utilizar Silverlight. [1] UI para clientes de dispositivos móviles. • Silverlight for mobile. Requiere la instalación del plug-in Silverlight en el dispositivo móvil. Esta tecnología es útil cuando se desea: •portar una aplicación Silverlight existente a un dispositivo móvil, •crear una UI más rica que la lograda con otras tecnologías: RIA UI. • Silverlight. Es un subconjunto de WPF (ver sección 3.1) que tiene soporte sobre varias plataformas y navegadores. Comparado con otras tecnologías (ej. XBAP) es más chico y rápido de instalar. Es una buena elección para aplicaciones graficas que no requieran: •tanto soporte gráfico como WPF, •instalación de la aplicación en el cliente, •Silverlight con AJAX. Silverlight soporta de forma nativa Asynchronous JavaScript and XML (AJAX). Se puede utilizar para permitir interacción entre componentes de la página Web y la aplicación Silverlight. • Aplicaciones Web: •ASP.NET Web Forms con controles Silverlight. Si se tiene una aplicación ASP.NET se pueden utilizar controles Silverlight para proveer mejor experiencia de usuario en cuanto visualización y capacidades de la UI, evitando escribir una aplicación Silverlight completamente nueva. Es una buena técnica para agregar soporte rich media a una aplicación Web existente. Los controles Silverlight y la página pueden interactuar en el cliente usando JavaScript. 609 Da soporte de gráficos vectoriales, archivos multimedia, textos, animaciones y capas superpuestas. Se integra con infraestructura y aplicaciones existentes que incluyen Apache, PHP, así como JavaScript y XHTML en el cliente. 2.4 Herramientas útiles Taller de Formación.NET Las principales herramientas para trabajar con Silverlight son Visual Studio y Microsoft Expression Blend. [8] Ambas permitirán diseñar y desarrollar aplicaciones Silverlight, aunque esto no quiere decir que sean iguales. Visual Studio es una herramienta más orientada a los desarrolladores y testers de aplicaciones, mientras que Expression Blend sería una herramienta pensada para diseñadores, sin embargo, para desarrolladores resulta útil también a la hora de trabajar con los estilos, animaciones y con las interfaces de usuario. [3] Para desarrollar con Silverlight se recomienda trabajar con Visual Studio 2010. Para instalar el runtime para el desarrollo de Silverlight 4, el soporte para proyectos Silverlight 4 en Visual Studio y el Silverlight 4 SDK, es necesario instalar las Silverlight Tools for Visual Studio 2010. [5] Para probar la aplicación en otra máquina que no sea en la cual se desarrolla, habrá que instalar el correspondiente runtime: Windows Runtime [6] o Mac Runtime [7]. Existe un Silverlight Toolkit [9] compuesto por numerosos controles, estando el código fuente disponible. Microsoft WCF RIA Services [10] simplifica el patrón tradicional de aplicaciones de ncapas para reunir a las plataformas de ASP.NET y Silverlight. Los servicios de RIA proporcionan un patrón para escribir la lógica de la aplicación y que se ejecute en el nivel intermedio, controlando el acceso a datos para las consultas, los cambios y operaciones personalizadas. También admite soporte para tareas comunes tales como la validación de datos, autenticación y roles mediante la integración con componentes de Silverlight en el cliente y ASP.NET en el nivel intermedio. 610 2.5 Posibilidades que ofrece Silverlight Es importante conocer el abanico de posibilidades que ofrece Silverlight a los desarrolladores. A continuación se verán, a grandes rasgos, los aspectos relativos a la arquitectura de Silverlight. La siguiente imagen ilustra dicha arquitectura: Silverlight soporta dos modelos de programación unificados en un solo plug-in, el modelo de desarrollo en JavaScript y el desarrollo, haciendo uso de la API de .NET. [3] 2.6 Componentes de Silverlight Taller de Formación.NET Entre los componentes del núcleo de presentación de Silverlight se encuentran los siguientes: • La gestión de entrada desde dispositivos de hardware como, por ejemplo, el ratón, el teclado, el lápiz de dibujo, entre otros. • El motor de dibujo (Render) que se encarga de mostrar y actualizar los elementos que son mostrados en la pantalla, como pueden ser gráficos vectoriales, imágenes, videos, textos, entre otros. • Las características de gestión de archivos multimedia de audio y video. • El modelo de controles extensibles que se puede personalizar mediante estilos y plantillas. • Una gestión de “lienzos” (Layout) que permite controlar dinámicamente la posición en pantalla de los elementos que son mostrados como parte de la interfaz de usuario. • La gestión de derechos de medios digitales (DRM). • El motor de enlace a datos es una pieza muy importante de este núcleo, ya que habilita crear enlaces a datos desde objetos (Data Objects) a controles de la interfaz de usuario (UIElements). • El parser de XAML. • Todos estos componentes forman parte de un núcleo sobre el que se asientan las demás características que proporciona Silverlight y, por sí solas, proporcionan una serie de herramientas para la creación de interfaces de usuario ricas y usables, así como de aplicaciones de 611 línea de negocio clásicas y aplicaciones para dispositivos móviles y embebidos. 3 ¿Silverlight OOB o WPF? Históricamente cuando pensamos en una aplicación de escritorio tomamos como referente tecnologías como WinForms o Windows Presentation Foundation (WPF). WPF es la tecnología padre de Silverlight y, por lo tanto, tiene la mayoría de equivalencias en desarrollo. [3] 3.1 ¿Qué es WPF? Taller de Formación.NET Windows Presentation Foundation (WPF) es un subsistema de presentación unificado para Windows expuesto mediante WinFX, el modelo de programación de código administrado para Windows Vista que extiende Microsoft .NET Framework. WPF se compone de un motor de visualización y un marco de código administrado. WPF unifica la forma en que Windows crea, muestra y manipula documentos, elementos multimedia e interfaces de usuario (UI), lo que permite a programadores y diseñadores crear experiencias de usuario diferenciadas. Windows Presentation Foundation se basa en el código administrado, pero usa un lenguaje de marcado, el lenguaje de marcado de aplicaciones extensible (XAML), para que la generación de aplicaciones sea más simple para los diseñadores. Las aplicaciones basadas en XAML son compatibles actualmente con C# y Visual Basic .NET. Si escribe una aplicación WPF entera con código procedural puede usar cualquier lenguaje CLR (Common Language Runtime). WPF solo permite la ejecución en plataformas Windows a partir de la versión SP2 de Windows XP, lo que limita la cantidad de plataformas soportadas por esta tecnología. En contraposición, WPF tiene una implementación completa de todas las API comunes de desarrollo de aplicaciones, incluidas las API de acceso a datos, por ejemplo. [3] 612 3.2 Consideraciones generales de Silverlight Microsoft está apostando en posicionar Silverlight como la tecnología de referencia para aplicaciones que se ejecuten tanto en Web como en el escritorio, en dispositivos móviles (Windows Phone 7) y en dispositivos embebidos (Televisores, reproductores multimedia, entre otros). Silverlight, al ser un subconjunto de las funcionalidades de WPF, no proporciona todas las API de desarrollo comunes, como puede ser el caso de las API de ADO.Net y similares para el trabajo con bases de datos, así como las funcionalidades comunes para el trabajo con el sistema de archivos. El modelo de acceso a datos de una aplicación Silverlight OOB pasa por una arquitectura basada en servicios. [3] 3.3 ¿Cuál escoger? Como resumen general, se puede concluir que, si la aplicación a desarrollar utilizará una base de datos local o un trabajo intensivo con el sistema de archivos, la opción lógica será WPF; mientras que, si la aplicación se basa en un modelo de servicios y no se hacen trabajos con el sistema de archivos (salvo carpetas de usuario), la opción más fuerte será Silverlight. La siguiente tabla muestra en detalle estas diferencias. 4 Silverlight para escritorio El primer paso para trabajar con una aplicación fuera del navegador consiste en habilitar dicha característica. Se deberá abrir la pestaña de propiedades del proyecto Silverlight en Visual Studio y dirigirnos a la sección “Silverlight” de la misma. Taller de Formación.NET Marcar la opción “Enable running application out of the browser” agregará un nuevo archivo en la carpeta “Properties” del proyecto llamado “OutOfBrowserSettings.xml” donde se almacenarán las características propias de la aplicación tales como el título de la ventana, 613 el tamaño de la misma, los iconos que usará la aplicación una vez desplegada en el escritorio, entre otras. Taller de Formación.NET El botón “Out-of-Browser Settings” de la pestaña “Silverlight” brinda acceso al editor de las características de la aplicación como se muestra en la siguiente Figura. 614 Las opciones que marquemos en dicha ventana se traducirán en el documento XML que se muestra a continuación, como ejemplo de configuración, archivo OutOfBrowserSettings. xml: 4.1.1 Instalar aplicaciones OOB Silverlight incluye un mecanismo que gestiona el proceso de instalación y desinstalación de las aplicaciones en el escritorio. Para instalar una aplicación Silverlight en el escritorio se puede hacer clic con el botón secundario del ratón sobre la aplicación dentro del Navegador Web y pulsar sobre la opción “Install MyAPP Application onto this computer”. Esta acción mostrará un diálogo que preguntará por las localizaciones en las que el usuario desea crear un acceso directo a la aplicación. Confirmando dicha acción la aplicación Silverlight quedará instalada y lista para ser usada desde el escritorio. Esto mismo se puede realizar por código: Taller de Formación.NET Haciendo uso del método de instancia de la aplicación actual App.Current.Install() se puede instalar de forma procedural la aplicación. En el ejemplo anterior, la instancia del objeto aplicación actual también informa del estado actual de la misma, esto permite validar si la aplicación ya se encuentra instalada o si la instalación ha fallado antes de proceder a su instalación. Esto se realiza consultando el valor de InstallState (App.Current.InstallState). Se cuenta con cuatro valores correspondiente a los estados. El evento al que hay que responder es App.Current.InstallStateChanged. A continuación se muestra un ejemplo de uso: 615 De forma similar se puede comprobar si existen versiones actualizadas de la aplicación actual. La instancia actual del objeto aplicación también dispone de un método que permite realizar dicha comprobación. Dicho método es App.Current.CheckAndDownloadUpdateAsync(). Este método realiza la comprobación de si existe en el servidor una versión más reciente de la aplicación y, si así fuese, descarga esa nueva versión. La ejecución de App.Current.CheckAndDownloadUpdateCompleted permite descubrir errores o informar de la existencia y actualización a una nueva versión. Para comprobar si existe una versión más reciente de la aplicación: Para verificar el resultado de dicha operación: Taller de Formación.NET Para realizar la suscripción a los eventos mencionados con anterioridad: 616 Para desinstalar la aplicación se puede hacer clic con el botón derecho del ratón sobre la aplicación y pulsar sobre la opción “Remove this application...”. Esto eliminará completamente la aplicación del sistema. 4.1.2 Ejecución Una aplicación ejecutada fuera del navegador se ejecuta en una parcela de seguridad al igual que ocurre cuando se ejecuta dentro del navegador. Al ejecutarse en un contexto de seguridad de Internet no es posible disponer de acceso completo a todos los recursos del sistema, por lo que una aplicación Silverlight en ningún caso puede sustituir a una aplicación de escritorio, como puede ser el caso de una aplicación creada con WPF. No es necesario disponer de permisos de administrador en el equipo para poder proceder a la instalación de una aplicación Silverlight. 5 Bibliografía Taller de Formación.NET Microsoft, Microsoft Application Architecture Guide, 2nd Edition. Patterns & Practices, 2009. Sitio Web de la MSDN. [Online]. Available: http://msdn.microsoft.com. [Accessed: 01Oct-2011]. MSDN - Centro de desarrollo de Silverlight [Online]. Available: http://msdn.microsoft. com/es-es/silverlight [Accessed: 20-Aug-2011]. Sitio de Silverlight [Online]. Available: http://www.silverlight.net/ [Accessed: 15-Nov2011]. Silverlight Tools for Visual Studio 2010. [Online]. Available: http://www.microsoft.com/downloads/es-es/details.aspx?FamilyID=b3deb194-ca86-4fb6-a716b67c2604a139&displayLang=es [Accessed: 20-Nov-2011]. Windows Runtime. [Online]. Available: http://silverlight.dlservice.microsoft.com/ download/F/6/5/F653F7FD-AD4D-411D-8B1F-9C4B1BD69881/Silverlight_Developer. exe [Accessed: 19-Nov-2011]. Mac Runtime. [Online]. Available: http://silverlight.dlservice.microsoft.com/ download/F/6/5/F653F7FD-AD4D-411D-8B1F-9C4B1BD69881/Silverlight_Developer. dmg [Accessed: 19-Nov-2011]. Expression Blend. [Online]. Available: http://www.microsoft.com/expression/products/blend_overview.aspx [Accessed: 19-Nov-2011]. Silverlight Toolkit. [Online]. Available: http://silverlight.codeplex.com [Accessed: 19Nov-2011]. WCF RIA Services. [Online]. Available: http://www.silverlight.net/learn/advanced-techniques/wcf-ria-services/get-started-with-wcf-ria-services [Accessed: 19-Nov-2011]. Martin Fowler, Presentation Model, 13 Julio 2004 [Online]. Available: http://martinfowler.com/eaaDev/PresentationModel.html [Accessed: 20-Nov-2011]. Microsoft, Prism, Noviembre 2010 [Online]. Available: http://msdn.microsoft.com/enus/library/cc707819.aspx [Accessed: 20-Nov-2011]. 617 618 Taller de Formación.NET Laboratorio de Integración de Sistemas Introducción a .NET Framework Agenda ¿ Qué es .NET Framework? • Componentes Fundamentales • Funcionamiento Interno del CLR • Bibliotecas Principales • Características de .NET • Herramientas de Desarrollo .NET • Lab. Punto de venta ¿Qué es .NET Framework? Tecnología de desarrollo de aplicaciones empresariales, compuesta de: • Entorno de Ejecución (Runtime). • Bibliotecas de Funcionalidad (Class Library). • Lenguajes de Programación. • Visual Basic. • C#. • F#. • C++. • Compiladores. • Herramientas de Desarrollo (IDE VS2010 & Tools). • Guías de Arquitectura. Plataforma de Ejecución Intermedia Taller de Formación.NET Agenda 619 ¿Qué es .NET Framework? • Componentes Fundamentales • Arquitectura • Common Language Runtime (CLR) • Microsoft Intermediate Language (MSIL) • Assemblies • .NET Class Library • Common Language Specification (CLS) CLR - Arquitecturas de Ejecución de Aplicaciones Taller de Formación.NET Arquitectura del .NET Framework 620 CLR – Common Language Runtime • El CLR es el motor de ejecución (runtime) de .NET. • Características. • Compilación Just-In-Time (JIT). • Gestión automática de memoria (Garbage Collector). • Gestión de errores consistente (Excepciones). • Ejecución basada en componentes (Assemblies). • Gestión de Seguridad. • Multithreading. CLR – Componentes Internos CLR – Proceso de Compilación CLR - MSIL • Un Assembly es la unidad mínima de ejecución, distribución, instalación y versionado de aplicaciones .NET Taller de Formación.NET ¿Qué es un “Assembly”? 621 Assemblies - Aplicaciones .NET • Uno o más Assemblies (.dll, .exe). • Al ejecutar una aplicación, ¿cómo ubico los assemblies necesarios? • El Class Loader busca en el directorio local (preferido). • Global Assembly Cache (GAC). • Diferentes aplicaciones pueden usar diferentes versiones. • Actualizaciones más simples. • Desinstalación más simple. NET Framework Class Library • Conjunto de Tipos básicos (clases, interfaces, etc.) que vienen incluidos en el .NET Framework. • Los tipos están organizados en jerarquías lógicas de nombres denominados NAMESPACES. • Los tipos son INDEPENDIENTES del lenguaje de desarrollo. • Es extensible y totalmente orientada a objetos. Taller de Formación.NET .NET Framework Class Library 622 Agenda ¿ Qué es .NET Framework? • Componentes Fundamentales • Funcionamiento Interno del CLR • Modelo de Ejecución • Common Type System Modelo de Ejecución del CLR CTS (Common Type System) • Define un conjunto común de “tipos” de datos orientados a objetos. • Todo lenguaje de programación .NET debe implementar los tipos definidos por el CTS. • Todo tipo hereda directa o indirectamente del tipo System.Object. • Define Tipos de VALOR y de REFERENCIA. La Memoria y los Tipos de Datos Taller de Formación.NET El CLR administra dos segmentos de memoria: Stack (Pila) y Heap (Montón). • El Stack es liberado automáticamente y el Heap es administrado por el GC (Garbage Collector). La Memoria y los Tipos de Datos. • Los tipos VALOR se almacenan en el Stack. • Los tipos REFERENCIA se almacenan en el Heap. 623 Agenda ¿ Qué es .NET Framework? • Componentes Fundamentales • Funcionamiento Interno del CLR • Bibliotecas Principales • Características de .NET Características de .NET Entorno de Ejecución robusto y seguro: • Gestión automática de memoria. • Manejo de excepciones. Independiente del lenguaje de programación. • Libertad en la elección del lenguaje (o mixto). • Herramientas de desarrollo compartidas. Interoperabilidad con código existente: • Unmanage code .COM. Simplifica la instalación y administración de las aplicaciones: • GAC, múltiples versiones. Extensible: • Las clases pueden ser extendidas usando herencia. • Herencia entre distintos lenguajes. Taller de Formación.NET Interoperabilidad 624 ¿ Qué es .NET Framework? • Componentes fundamentales • Funcionamiento interno • Bibliotecas Principales • Ventajas de .NET Herramientas de Desarrollo .NET • Visual Studio 2010. • SQL Server 2010 Express. • SQL Server Managment Studio. • IIS7. Microsoft Visual Studio 2010 • “Solución” es un contenedor de proyectos. • “Proyecto” es un contenedor de: archivos fuente, conexiones a base, recursos, etc. • Diferentes tipos de proyectos (VS Projects Templates). • Área editor o diseñador, depende del tipo de archivo que se está usando. Taller de Formación.NET SQL Server Management Studio 625 • SQL Server Management Studio es un entorno integrado para obtener acceso a todos los componentes de SQL Server, configurarlos, administrarlos y desarrollarlos. • Con SQL Server Management Studio el programador y el administrador de bases de datos pueden desarrollar o administrar cualquier componente del Motor de base de datos. Agenda ¿ Qué es .NET Framework? • Componentes Fundamentales • Funcionamiento Interno del CLR • Bibliotecas Principales • Características de .NET • Herramientas de Desarrollo .NET • Lab. Punto de venta Lab 0 Invocamos al compilador C# con: >csc Holamundo.cs Taller de Formación.NET Lab. Punto de venta 626 • La aplicación “Punto de venta” posee una arquitectura en tres capas (presentación, reglas de negocios y acceso a datos). Funcionalmente, la aplicación permite: • Listar una serie de productos disponibles para vender. • Iniciar una nueva venta. • Agregar un ítem a la venta (se agrega un producto al carrito de compras). • Listar los productos contenidos en el carrito. • Confirmar la venta (obteniéndose el total a pagar). • Cancelar la venta (vaciando el carrito de compras). • Salir (cancelando las ventas no confirmadas). Lab. POS. Presentación • Assembly .EXE, proyecto de consola. • Main(), punto de entrada a la aplicación. • Utiliza el patrón command para las opciones del menú. • Este proyecto contiene App.config (Cadenas de conexión, variables, etc.). Presentación: (Proyecto de consola) Lab. POS. Reglas de negocio • Assembly .dll, librería. • Clases que representan Entidades (Venta producto, ItemVenta). • Clases que representan maestros de las entidades (CatalogoProductos, CatalogoVentas). Reglas de negocio Lab. POS. Acceso a datos Acceso a datos SQL SERVER Taller de Formación.NET • Assembly .dll, librería. • Contiene una clase que encapsula y simplifica el acceso a datos con ADO.NET (BaseDatos). • Clase que representa un error (BaseDatosexception). 627 Lab. Punto de venta Bibliografía Taller de Formación.NET MSDN .NET Framework 4 ohttp://msdn.microsoft.com/es-es/library/w0x726c2.aspx DCE ohttp://mslatam.com/latam/msdn/comunidad/dce2005/ SQL Server Managment Studio ohttp://msdn.microsoft.com/en-us/library/ms174173.aspx 628