9. Taller de Formación.NET

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