+ All Categories
Home > Documents > capitulo9

capitulo9

Date post: 12-Oct-2015
Category:
Upload: evelyn-monica-vargas-gamboa
View: 5 times
Download: 0 times
Share this document with a friend
Popular Tags:

of 76

Transcript
  • 5/21/2018 capitulo9

    1/76

    9. Taller de Formacin.NET

    Ing. Gustavo Guimerans

    A/C. Nicols Sampietro

    A/C. Emiliano Martnez

  • 5/21/2018 capitulo9

    2/76

    554

    TallerdeFormacin.N

    ET

    Capa de acceso a datos

    1 Introduccin

    La capa que describe la agrupacin lgica de las funcionalidades y componentes que ac-ceden a los datos (fuentes de datos, como bases de datos relacionales o servicios web) en unaaplicacin se conoce como la capa de datos (data layer).

    1.1 Descripcin General

    Esta capa provee acceso a la informacin dentro del sistema y datos expuestos en la red.Expone interfaces genricas que la capa de negocio puede consumir.

    La capa de datos usualmente incluye: Data Access components: estos componentes abstraen la lgica requerida para acceder

    a los almacenes de datos. Centralizan las funcionalidades comunes de acceso a datos con elobjetivo de lograr una aplicacin ms simple de congurar y mantener.

    Este documento est basado en la segunda edicin del libro Mi-crosoft Application Architecture Guide [1]. Su lectura brinda unacompleta gua sobre el uso de las distintas tecnologas.

  • 5/21/2018 capitulo9

    3/76

    555

    TallerdeFormacin.NET

    Service agents: cuando un componente de negocio necesita acceder a datos que proveeun servicio externo, es necesario implementar cdigo. Los componentes que implementanesta actividad son los service agents. Permiten aislar la diversidad de requerimientos que im-ponen la llamada a estos servicios y brindan otros servicios como caching, soporte ofine yun mapeo entre el formato de quien expone el servicio y la aplicacin.

    2 Consideraciones generales de diseo

    La capa de acceso a datos debe cumplir con los requerimientos de la aplicacin: ser e-ciente y segura, fcil de mantener y extender cuando hay cambios en los requerimientos dela capa de negocio. En este captulo se describen los principales puntos generales a tener encuenta al momento de disear la capa de acceso a datos. Elegir el tipo adecuado de tecnologadepende de:

    el tipo de datos que se tengan que manejar, cmo 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 adatos.

    La capa debe: Ocultar detalles de acceso a la fuente de datos. Ser responsable de: manejar las conexiones, generar consultas, mapear entidades de la

    aplicacin a estructuras de datos. Decidir como mapear entidades de la aplicacin a estruc-turas de datos.

    Depender bsicamente del tipo de entidad que se use en la aplicacin. Diseos comunessiguen enfoques:

    Patrones Domain Model Table Module. Frameworks Object/Relational Mapping (O/RM). Considerar estructuras de datosconsolidadas.

  • 5/21/2018 capitulo9

    4/76

    556

    TallerdeFormacin.N

    ET

    Ej. Si se estn exponiendo datos a travs de servicios considerar Data Transfers Objects(DTOs). Decidir cmo se manejarn las conexiones.

    La capa de acceso a datos deber crear y manejar todas las conexiones a fuentes de datosque requiera la aplicacin. Es necesario elegir el mtodo apropiado para almacenar y protegerla informacin de conexin, eventualmente mediante secciones encriptadas de archivos de

    conguracin. Determinar cmo se manejarn 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 deseguridad. Reducir trco muchas idas y vueltas.

    Considerar operaciones por lotes (batch) en simples sentencias SQL. Considerar los objetivos de escalabilidad y de performance.

    3 Consideraciones especicas de diseo

    Al momento de desarrollar el diseo hay varios problemas comunes a considerarse. Es-tos problemas pueden categorizarse en areas especicas de diseo. Las areas donde msproblemas existen son: Procesamiento por lotes (batch), Binary Large Objects (BLOBs), Co-nexiones, 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 areas, mencionadas anteriormente, existen varios puntos a conside-

    rar. A continuacin se mencionan algunos ejemplos asociados a tecnologas especcas. Enel captulo 8 del libro [1] se describen cada uno de esos puntos.

    3.1 Transacciones

    Microsoft SQL Server cada SQL ejecuta como una transaccin individual (auto-com-mit transaction mode).

    Para clases del namespace System.Transactions, considerar usar el modo implcito pro-visto por el objeto TransactionScope.

    3.2 XML

    Considerar usar XML readers y writers para acceder a datos XML (especialmente cuan-do sea mucho volumen). Si se desea interactuar con una base relacional, considerar usarobjetos que soporten esa funcionalidad tales como ADO.NET DataSet.

    4 Consideraciones tecnolgicas

    Una de las decisiones ms importantes a tomar, al momento de implementar un sistema,pasa por la eleccin de la tecnologa. La tecnologa adecuada depender del tipo de aplicaciny los requerimientos. A continuacin, se mencionan casos concretos que ayudan a tomar una

    correcta decisin. Si se requiere soporte bsico para consultas y parmetros, considerar directamente ob-jetos ADO.NET.

  • 5/21/2018 capitulo9

    5/76

    557

    TallerdeFormacin.NET

    Si se requiere soporte para escenarios de acceso a datos ms complejos o simplicar elcdigo de acceso a datos, considerar utilizar el Enterprise Library Data Access ApplicationBlock.

    Para aplicaciones Web data driven con pginas basadas en el modelo de datos de la basede 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 mxi-

    ma performance de renderizado. Ideales para operaciones read-only, forward-only. Para acceder a SQL Server, considerar ADO.NET la namespace SqlClient para maxi-

    mizar performance. En SQL Server 2008, considerar FILESTREAM para una mayor exibilidad en el alma-

    cenamiento y para acceder a datos BLOB. Si se disea una capa de negocio orientada a objetos en el patrn Domain Model, con-

    siderar un framework Object/Relation Mapping (O/RM), tal como el ADO.NET Entity

    Framework o el NHibernate framework de cdigo libre.5 Diseando componentes de datos

    En lo que resta de la leccin se revisarn los pasos para el diseo de componentes aso-ciados a datos. El primer paso es identicar las restricciones asociadas a los datos que seaccedern, lo cual ayudar a identicar la tecnologa de acceso a datos adecuada. El siguientepaso consiste en decidir la estrategia de mapeo y el enfoque de acceso a datos que se deseaimplementar, esto consiste en identicar las entidades de negocio y la forma de represen-tarlas. Luego se puede determinar cmo los componentes de acceso a datos se conectarn a

    la fuente de datos. Finalmente, se determina la estrategia para manejo de excepciones en elacceso a datos.Es importante conocer con cules tecnologas se cuenta en la plataforma y para qu es-

    cenarios es mejor una que otra. De esta manera, se pueden tomar otras decisiones necesarias(por ejemplo: capacitacin sobre determinada tecnologa). Por tal motivo, se incluye en estagua una descripcin de las tecnologas disponibles.

    El sitio web de la Microsoft Developer Network (MSDN) [2] es el lugar indicado parautilizar como referencia en todo momento de un proyecto en la plataforma Microsoft, prin-cipalmente al momento de desarrollar, en particular para la plataforma .NET Framework, yaque, por ejemplo, cuenta con documentacin y ejemplos.

    5.1 Paso 1 Seleccionar la tecnologa de acceso a datos

    En este paso es que se hace necesario conocer las tecnologas disponibles en la plataformaMicrosoft, cundo es recomendable su uso, escenarios comunes, as como sus ventajas y con-sideraciones. A continuacin se pretende llegar a cubrir estos puntos. Dada la importanciaque tienen hoy en da ADO.NET Entity Framework (EF) y LINQ se profundizar.

    ADO.NET Core. Brinda facilidades para recuperar, alterar y administrar informacin.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 informacinde cualquier fuente de datos Linq, tpicamente un Entity Data Model, mediante REST sobreHTTP. La informacin puede direccionarse mediante Uniform Resource Identiers (URIs).

  • 5/21/2018 capitulo9

    6/76

    558

    TallerdeFormacin.N

    ET

    Los servicios Web pueden congurarse para que retornen los datos con formato Atom yJavaScript Object Notation (JSON).

    ADO.NET Entity Framework (EF): es un conjunto de tecnologas ADO.NET quepermiten el desarrollo de aplicaciones orientadas a datos. Brinda una experiencia de accesofuertemente tipada sobre base de datos relacionales. Mueve datos desde el modelo de alma-

    cenamiento o lgico (las estructuras fsicas de las tablas relacionales) al modelo conceptual(que reeja los objetos de negocio). Introduce Entity Data Model a ADO.NET [4]. SoportaLINQ to Entities. Permite que los programadores trabajen:

    con datos en forma de objetos y propiedades especcos del dominio; por ejemplo,con clientes y direcciones, sin tener que pensar en las tablas y columnas de las bases en lasque 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 especcos del origen.El modelo conceptual, el modelo de almacenamiento y las asignaciones entre los dos se

    expresan en esquemas basados en XML y se denen en archivos de extensiones correspon-

    dientes: El Conceptual Schema Denition Language (CSDL) dene el modelo conceptual.Es la implementacin de EF del Entity Data Model. La extensin de archivo es .csdl. El StoreSchema Denition Language (SSDL) dene el modelo de almacenamiento. La extensin dearchivo es .ssdl. El Mapping Specication Language (MSL) dene las asignaciones entre losmodelos conceptual y de almacenamiento. La extensin de archivo es .msl.

    Estos modelos y archivos de asignacin permiten a EF transformar las operaciones decreacin, lectura, actualizacin y eliminacin de las entidades y relaciones del modelo con-ceptual en las operaciones equivalentes en el origen de datos [4].

    A continuacin se muestra un ejemplo de cmo se pueden consultar tanto entidadescomo asociaciones [5].

  • 5/21/2018 capitulo9

    7/76

    559

    TallerdeFormacin.NET

    ADO.NET Sync Services. Es un proveedor incluido en el Microsoft Sync Framework y seutiliza para implementar sincronizacin en bases de datos embebidas en ADO.NET.

    Language Integrated Query (LINQ). Brinda libreras para extender C# y Visual Basic conlenguaje nativo para consultas. Es, primero que nada, una tecnologa de consultas soportada

    por diferentes assemblies a travs 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 solucin a consultas fuertemente tipada para SQL Server.Todas las operaciones de consulta LINQ se componen de tres acciones distintas.[6] Obtencin del origen de datos. Creacin de la consulta. Ejecucin de la consulta.

  • 5/21/2018 capitulo9

    8/76

    560

    TallerdeFormacin.N

    ET

    5.1.1 Escenarios de uso de aplicaciones

    La siguiente gua pretende ser til al momento de mapear escenarios de uso de aplicacio-nes con las soluciones tecnolgicas de acceso a datos disponibles. ADO.NET Entity Fra-mework (EF). Si se desea:

    crear un modelo de datos y mapearlo a una base de datos relacional, mapear una clase a mltiples 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 exible, y se necesita la exibilidad de separar el esquema ma-peado 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 aplicacin 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 lgico a la base de datos.Es apropiado si no se necesita de las funcionalidades que ofrecen las otras tecnologas

    de acceso a datos o se est implementando una aplicacin que debe soportar experiencia deacceso a datos sin conexin.

    ADO.NET Sync Services. Considerarla si se est diseando una aplicacin que: Debe soportar eventuales escenarios de conexin. Requiere colaboracin 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 va REST. LINQ to DataSets. Si se desea: ejecutar consultas sobre un DataSet, incluyendo consultas que realicen joins de tablas; usar un lenguaje de consultas comn en vez de cdigo iterativo.LINQ to Entities. Si se est utilizando: ADO.NET Entity Framework.

    Consultas sobre entidades fuertemente tipadas.

    La eleccin de una apropiada tecnologa de acceso a datos debetomar en cuenta el tipo de datos y cmo se manipularn. Ciertastecnologas son mejores para determinados escenarios.

  • 5/21/2018 capitulo9

    9/76

    561

    TallerdeFormacin.NET

    consultas sobre datos relacionales usando sintaxis LINQ. LINQ to Objects. Consultassobre:

    una coleccin, directorio de archivos, objetos en memoria usando sintaxis LINQ.

    LINQ to SQL.LINQ to Entities es la solucin 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 inno-vacin o mejoras. Si ya se est utilizando LINQ to SQL se puede seguir usando. Para nuevassoluciones 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 Benecios y consideraciones de cada tecnologa

    Acceso a datos Objeto-Relacional

    ADO.NET Entity Framework (EF)

    Benecios

    Desacopla la estructura de datos del modelo de datos lgico. Entity SQL brinda un len-guaje consistente sobre todas las fuentes de datos y tipos de base de datos.

    Separa la metadata en capas de la arquitectura bien denidas. Brinda a los desarrolladores

    de la capa de negocios acceso a los datos sin necesidad de conocer particularidades (especi-caciones) de la base de datos. Permite que el modelo sea mapeado a otras bases de datos.

    Consideraciones

    Requiere un cambio en el diseo de entidades y consultas si se trabajaba con un mtodotradicional.

    Tiene ms niveles de abstraccin 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 yre-deployar las libreras del EF.

    LINQ to Entities

    Benecios

    Una solucin 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 SQLBenecios

  • 5/21/2018 capitulo9

    10/76

    562

    TallerdeFormacin.N

    ET

    Lectura y escritura de modelo de datos como objetos cuando estos modelos coinciden.Brinda acceso LINQ fuertemente tipado. Procesamiento del lado del servidor.

    ConsideracionesEn .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 conexin.

    LINQ to DataSet

    Benecios

    Permite realizar todo tipo de consultas sobre un DataSet.ConsideracionesTodo el procesamiento se da en el cliente.

    ADO.NET Sync Services

    Benecios

    Brinda sincronizacin entre bases de datos, escenarios de colaboracin y sin conexin.La sincronizacin puede ejecutar en background.ConsideracionesHay que implementar el traqueo de cambios.Las grandes cantidades de datos pueden degradar notoriamente la performance.

    SOA/Services

    ADO.NET Data Services Framework

    Benecios

    Los datos pueden ser accedidos directamente mediante una URI usando un esquemaREST y retornados tanto en formato Atom o JSON.

    El .NET Framework, Silverlight y las bibliotecas de cliente AJAX permiten trabajar di-rectamente con objetos dando acceso LINQ a ADO.NET Data Services, as como una APIpara Windows Azure Tables, SQL Data Services, etc.

    ConsideracionesIdeado para escenarios orientados a servicios.

    LINQ to Data Services

    Benecios

    Permite crear consultas LINQ del lado del cliente y los datos se retornan de ADO.NETData Services.

    Soporta consultas LINQ sobre datos REST.ConsideracionesRequiere ADO.NET Data Services del lado del cliente.

    N-capas y genricasADO.NET Core

    Benecios

  • 5/21/2018 capitulo9

    11/76

    563

    TallerdeFormacin.NET

    Incluye cdigo manejado de proveedores para acceder a varios almacenes de datos.Brinda facilidades para manipulacin de datos.Consideraciones

    El cdigo se escribe directamente para determinados proveedores, reduciendo la reusabi-lidad. La estructura de la base de datos puede implicar la creacin de un modelo nuevo.

    LINQ to Objects

    Benecios

    Permite crear consultas LINQ sobre objetos en memoria.Puede ser utilizado: Sobre cualquier coleccin que soporte IEnumerable o

    IEnumerable. Para consultar strings, metadata basada en reection y directorio de ar-chivos.

    ConsideracionesSoporte para objetos que implementen IEnumerable.

    LINQ to XML

    Benecios

    Permite crear consultas LINQ sobre datos XML.Se compara con Document Object Model (DOM).

    ConsideracionesNo est optimizado para dar soporte a seguridad.

    5.1.3 Consideraciones generales. Si se necesita o se est buscando mxima Flexibili-

    dad y Performance, considerar usar ADO.NET Core.

    Una solucin basada en O/RM o con soporte a mltiples bases de datos, considerar elEntity Framework,

    escenarios sin conexin, 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).

    SOA Exponiendo la base de datos como un servicio, ADO.NET Data Services, almacenando la informacin 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 informacin en el dispositivo mvil y sincroni-zarla con un mecanismo basado en el servidor.

  • 5/21/2018 capitulo9

    12/76

    564

    TallerdeFormacin.N

    ET

    5.2 Paso 2 Seleccionar como recuperar y persistir objetos de negocio desde un al-

    macn de datos

    Luego de identicar los requerimientos de la fuente de datos, el prximo paso consiste enseleccionar la estrategia para poblar los objetos o entidades de negocio desde los almacenes

    de datos y persistirlos en las fuentes de datos. El enfoque ms comn usa herramientas oframeworks Object/Relational Mapping (O/RM). Al momento de mapear esas entidades aestructuras de datos, el principal factor para decidir cmo realizar ese mapeo es el tipo deentidades que utiliza la aplicacin.

    5.3 Paso 3 Determinar cmo conectarse a la fuente de datos

    Una vez que se tiene el mapeo, es necesario identicar como conectarse a la fuente dedatos, proteger las credenciales de los usuarios y realizar transacciones. A continuacin, se

    muestran los principales puntos a considerar (cada uno incluye varias consideraciones paralograr el enfoque adecuado).

    5.3.1 Conexiones

    Conexiones a fuentes de datos son una parte fundamental de la capa de datos. Debe coor-dinar todas las conexiones a la fuente de datos. Asegurarse de abrir las conexiones a la fuentede 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 paraotro proceso. Si no se tienen datos voltiles, usar concurrencia optimista para mitigar el cos-to de bloquear datos en la base (evitando overhead). Realizar transacciones a travs de unaconexin cuando sea posible. Esto permite caractersticas de ADO.NET sin la necesidad deservicios coordinadores de transacciones distribuidas. Si se usa un pool, realizar una pruebade carga con escenarios simultneos y tunear la performance basado en los resultados. Porrazones de seguridad, evitar el uso de System o User Data Source Name (DSN) para alma-cenar la informacin de conexin. Disear la lgica de re-intento para manejar situacionesdonde la conexin 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 trco excesivo (idasy vueltas).

    Otro aspecto importante a considerar son los requerimientos de seguridad para accedera la fuente de datos. En otras palabras: cmo se autenticarn los componentes de acceso adatos con la fuente de datos? Y cules son los requerimientos de seguridad? Preferible Au-tenticacin Windows que SQL Server.

    Si se utiliza Microsoft SQL Server considerar utilizar autenticacin Windows con sub-sistema conable.

    5.3.2 Pooles de Conexin

    Los pooles de conexin permiten que aplicaciones vuelvan a usar conexiones de un pool,o crear una nueva y agregarla al pool si no hay una conexin disponible. Cuando una aplica-cin cierra la conexin esta se devuelve al pool, pero la conexin permanece abierta. Esto

  • 5/21/2018 capitulo9

    13/76

    565

    TallerdeFormacin.NET

    signica que ADO.NET no necesita crear una nueva conexin y abrirla contra la fuente dedatos todo el tiempo. Si bien consumen recursos, reducen los delays asociados al acceso adatos y hacen que las aplicaciones corran ms ecientes cuando hay conexiones disponibles.

    5.3.3 Transacciones y concurrencia

    Considerar formar transacciones con las operaciones crticas 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 transaccionesimplcitas y explicitas. Considerar su uso si se est desarrollando una aplicacin nueva querequiera soporte de transacciones. Para la mayora de las transacciones, el enfoque recomen-dado es usar el modelo implcito que brinda el objeto TransactionScope en el namespaceSystem.Transaction. Si bien no son tan rpidas como las manuales, o explicitas, son msfciles de desarrollar y se logran soluciones exibles y mantenibles. ADO.NET Transactionsbasadas en una conexin simple. Este es el enfoque ms eciente para transacciones con-

    troladas por clientes en un nico almacn de datos. Considerar su uso si se est extendiendouna aplicacin que ya utilizaba esta tecnologa o se est desarrollando para un entorno queno soporte la versin 2.0 del Framework .NET T-SQL (Database) Transactions controladaspor comandos ejecutados en la base de datos. Son ms ecientes para transacciones contro-ladas por el servidor en un nico almacn de datos, donde la base de datos gestiona toda latransaccin. Considerar esta tecnologa en el desarrollo de stored procedures que encapsulantodos los cambios que debe manejar la transaccin o que usan varias aplicaciones, y los re-querimientos de la transaccin se pueden encapsular en l.

    5.4 Paso 4 Determinar la estrategia para manejo de errores en el acceso a fuentes

    de datos

    No deberan pasar para otra capa, salvo que afecten a la aplicacin o alguna funcionalidad.

    5.5 Paso 5 Disear Service Agent Objetcts (opcional)

    Objetos que manejan la semntica de comunicacin con servicios externos.

    6 Bibliografa

    Microsoft, Microsoft Application Architecture Guide, 2nd Edition. Patterns & Practices,2009.

    Sitio Web de la MSDN. [Online]. Available: http://msdn.microsoft.com. [Accessed: 01-Oct-2011].

    Tutorial rpido (Entity Framework) [Online]. Available: http://msdn.microsoft.com/es-es/library/bb399182.aspx [Accessed: 5-Aug-2011].

    Informacin 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/es-es/library/bb386884.aspx [Accessed: 22-Aug-2011].

    Introduccin a las consultas LINQ. [Online]. Available: http://msdn.microsoft.com/es-es/library/bb397906.aspx [Accessed: 1-Jul-2011].

  • 5/21/2018 capitulo9

    14/76

    566

    TallerdeFormacin.N

    ET

    WindowsCommunication

    Foundation

    Qu es Windows Comunication Foundation (WCF)

    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: se-

    guridad, coordinacin de transacciones distribuidas y comunicaciones conables. WindowsCommunication Foundation (WCF) esta diseado para ofrecer un enfoque administrable ala computacin distribuida, la interoperabilidad y, en denitiva, la arquitectura orientada aservicios.

    En otras palabras Windows Communication Foundation (WCF) es un framework1para lacreacin de aplicaciones basadas en servicios. Utilizando WCF se puede enviar informacincomo mensajes asncronos desde un lugar a otro. Este lugar se denomina endpoint. Unendpoint son lugares donde los mensajes son enviados o recibidos (o ambos) y denen todala informacin necesaria para el intercambio de mensajes. Un endpoint puede ser parte deun servicio alojado en el Internet Information Server (IIS) o puede ser un servicio alojadoen una aplicacin. Un endpoint puede ser un cliente de un servicio que solicita informacina otro endpoint. Los mensajes pueden ser tan simples como un nico carcter o palabraenviado 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 informacin a otros servicios, como ser reportes de trco o

    algn otro servicio de monitoreo. Un servicio de chat que permite a dos personas comunicarse o intercambiar informa-

    cin en tiempo real. La inclusin de esta tecnologa no implica que antes de su existencia nose podan desarrollar este tipo de servicios, todo lo contrario, pero WCF hace que el desarro-llo de los endpoints sea mucho ms sencillo.

    En resumen, WCF esta diseado para ofrecer un enfoque ms sencillo a la creacin de

    Web Services (servicios web) y clientes de Web Services.

    Ejemplo ilustrativo de la utilizacin de WCF

    El siguiente ejemplo ilustra algunos de los problemas que WCF aborda. Una compaa derenta de autos decide crear una nueva aplicacin de reservas. Los diseadores de esta nuevaaplicacin saben que la lgica de negocio debe ser accedida por otras aplicaciones ejecutadas

    1 En el desarrollo de software, un framework o infraestructura digital, es una estructura conceptual y tecnolgica de soportedenido, normalmente con artefactos o mdulos de software concretos, con base a la cual otro proyecto de software puedeser ms fcilmente organizado y desarrollado.

  • 5/21/2018 capitulo9

    15/76

    567

    TallerdeFormacin.NET

    dentro y afuera de la compaa. En consecuencia, deciden disear una arquitectura orientadaa servicios, con la lgica de la aplicacin expuesta a travs de un conjunto bien denido deservicios.

    Los diseadores saben que, al momento de crear la aplicacin, la misma ser accedida por,al menos, otras tres aplicaciones.

    1. Una aplicacin cliente de call center que se ejecuta en mquinas cuyo sistema ope-rativo es Windows y es usada por empleados dentro de la organizacin. Esta aplicacin sercreada especialmente para el nuevo sistema de reserva y usar tambin el framework .NETy WCF.

    2. Una aplicacin existente de reservas hecha en J2EE ejecutando en un servidor Win-dows dentro de la compaa. Debido a una reciente asociacin con otra rma de renta deautos la aplicacin existente debe poder acceder a la lgica de la nueva aplicacin y proveer alos clientes una experiencia unicada.

    3. Aplicaciones de rmas de socios ejecutando en un conjunto variado de plataformas,esto incluye: agencias de viaje, aerolneas y cualquier compaa que tenga la necesidad decrear reservas de renta de autos.

    Este es un escenario perfectamente realista y representa algunos desafos. Para la interac-cin con el Call Center, por ejemplo, la velocidad de respuesta es importante, mientras que lainteroperabilidad es directa (comunicacin .NET a .NET).

    Para la comunicacin con la aplicacin existente de reservas hecha en J2EE o las aplica-ciones de las rmas socios, la interoperabilidad se convierte en el objetivo primario.

    Los requerimientos de seguridad son tambin muy diferentes, desde una comunicacinentre mquinas en una intranet Windows (Active Directory) a mquinas ejecutando en lu-gares remotos en otros sistemas operativos. WCF esta diseado para abordar ste y otrosescenarios diversos pero realistas.

  • 5/21/2018 capitulo9

    16/76

    568

    TallerdeFormacin.N

    ET

    Arquitectura de una aplicacin tpica WCF

    Arquitectura tpica de una aplicacin empresarial, mostrando la capa de servicios.La capa de servicios comnmente debe incluir:

    Interfaz de servicios. El servicio expone una interfaz donde los mensajes entrantes sonenviados. La interfaz de servicios se puede pensar como una fachada que expone la lgica denegocio implementada en la aplicacin.

    Tipos de mensajes. Cuando se intercambian datos a travs de la capa de servicios las es-tructuras de datos son empaquetados en mensajes que soportan distintos tipos de operacin.La capa de servicios, tpicamente, va a denir 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 necesitanpara crear aplicacines WCF y sus clientes.

    Un servicio es una entidad que expone uno o mas endpoints cada uno de los cualesexpone una o ms operaciones de servicio. El endpoint de un servicio especica la direccin(Address) donde el servicio puede ser ubicado, un elemento (Binding) que indica el tipo de

    comunicacin que se va a establecer y un contrato (Contract) que dene la funcionalidad queprovee el servicio a sus clientes.

  • 5/21/2018 capitulo9

    17/76

    569

    TallerdeFormacin.NET

    Esto es comnmente llamado el ABC: Address Binding Contract

    Veamos ahora cmo denir un servicio WCF con un contrato, cmo implementar elservicio, cmo congurarlo y, por ltimo, cmo ejecutarlo. Esto se desarrollar en seis pasos.

    1. Cmo denir un contrato de un servicio WCF

    Cuando se crea un servicio bsico en WCF la primera tarea es denir el contrato. El con-trato especica cules operaciones tendr el servicio. Los contratos son creados deniendouna interfaz en C++, C# o Visual Basic. Cada mtodo en la interfaz corresponde a unaoperacin especca del servicio. Cada interfaz debe contener el atributo ServiceContrac-

    tAttribute y cada operacin debe contener el atributo OperationContractAttribute. Si unmtodo dentro de una interfaz no contiene el atributo antes mencionado, dicho mtodo noser expuesto por el servicio.

    Los pasos para la creacin del contrato son los siguientes:

    1. Abra Visual Studio 2010 como administrador haciendo clic con el botn secundarioen el programa en el men Inicio y seleccionando Ejecutar como Administrador.

    2. Cree un nuevo proyecto de aplicacin de consola. Haga clic en el men Archivo yseleccione Nuevo, Proyecto. En el cuadro de dilogo Nuevo proyecto, seleccione Visual C#.

    Elija la plantilla Aplicacin de consola y denomnela Service. Use la ubicacin predetermi-nada.3. En un proyecto, Visual Studio crea un archivo denominado Program.cs. Esta clase

    contendr un mtodo vaco denominado Main().4. Cambie el espacio de nombres (namespace) Service predeterminado a Microsoft.Ser-

    viceModel.Samples. Para ello, haga clic con el botn secundario en el proyecto en el Explo-rador de soluciones y seleccione Propiedades. Asegrese de que est seleccionada la pestaaAplicacin situada a la izquierda del cuadro de dilogo Propiedades. Luego, escriba Micro-soft.ServiceModel.Samples en el cuadro de edicin que tiene la etiqueta Espacio de nombrespredeterminado. Haga clic en el men Archivo y seleccione Guardar todo para guardar loscambios.

    5. Luego, cambie el espacio de nombres en el archivo Program.cs generado a Microsoft.

    ServiceModel.Samples como se muestra en el siguiente ejemplo:

  • 5/21/2018 capitulo9

    18/76

    570

    TallerdeFormacin.N

    ET

    6. Agregue una referencia a System.ServiceModel.dll al proyecto.a. En el Explorador de soluciones, haga clic con el botn secundario en la carpeta Refe-

    rencias bajo la carpeta del proyecto y elija Agregar referencia.b. Seleccione la pestaa .NET en el cuadro de dilogo Agregar referencia y desplcese

    hacia abajo hasta que vea System.ServiceModel (versin 4.0.0.0), seleccinelo y haga clic en

    Aceptar.7. Agregue una instruccin using para el espacio de nombres System.ServiceModel.usingSystem.ServiceModel.

    8. Dena una nueva interfaz denominada ICalculator y aplique el atributo ServiceCon-tractAttribute a la interfaz con un valor de Namespace de http://Microsoft.ServiceModel.Samples. Especicar el espacio de nombres explcitamente es un procedimiento recomen-dado porque evita que el valor de espacio de nombres predeterminado se agregue al nombredel contrato.

    9. Declare un mtodo para cada una de las operaciones que el contrato ICalculator ex-pone (suma, resta, multiplicacin y divisin) dentro de la interfaz y aplique el atributo Ope-rationContractAttribute a cada mtodo que desee exponer como parte del contrato pblicode WCF.

    El siguiente cdigo unicar el resultado obtenido al realizar cada uno de los pasos deta-llados anteriormente:

  • 5/21/2018 capitulo9

    19/76

    571

    TallerdeFormacin.NET

    2. Cmo implementar un contrato de servicio de Windows Communica-

    tion Foundation

    sta es la segunda de las seis tareas que son necesarias para crear un servicio bsico enWindows Communication Foundation (WCF) y un cliente que llame al servicio.

    La creacin de un servicio WCF requiere que se cree primero el contrato, que se de-ne mediante una interfaz, esta tarea fue realizada en la seccin anterior. El siguiente paso,mostrado en este ejemplo, es implementar la interfaz. Esto implica la creacin de una clasedenominada CalculatorService que implemente la interfaz ICalculator denida por el usuario.

    Los pasos para la implementacin de la interfaz son los siguientes:1. Cree una nueva clase denominada CalculatorService en el mismo archivo donde deni

    la interfaz ICalculator. CalculatorService implementa la interfaz ICalculator.public class CalculatorService: ICalculator

    2. Implemente cada mtodo denido en la interfaz ICalculator dentro de la clase Calcu-latorService.

    El siguiente ejemplo de cdigo muestra la interfaz que dene el contrato de servicio yla implementacin de la interfaz. Es decir, se despliega tanto el cdigo escrito en la seccinanterior como en la presente:

  • 5/21/2018 capitulo9

    20/76

    572

    TallerdeFormacin.N

    ET

    Ahora, el contrato de servicio se ha creado e implementado. Compile la solucin para ase-gurarse de que no hay ningn error de compilacin y, a continuacin, contine en Procedi-miento para hospedar y ejecutar un servicio bsico de Windows Communication Foundationpara ejecutar el servicio.

    Para compilar el cdigo dirjase al men Generar, haga clic en Generar solucin.

  • 5/21/2018 capitulo9

    21/76

    573

    TallerdeFormacin.NET

    3. Procedimiento para hospedar y ejecutar un servicio bsico de Win-

    dows Communication Foundation

    sta es la tercera de las seis tareas necesarias para crear un servicio Windows Communi-cation Foundation (WCF) bsico y un cliente que pueda llamar al servicio.

    En este tema se describe cmo ejecutar un servicio bsico de Windows CommunicationFoundation (WCF). Este procedimiento consta de los siguientes pasos:

    Crear una direccin 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 despus del procedimiento se proporciona una lista completa

    del cdigo escrito en esta tarea. Agregue el cdigo siguiente al mtodo Main() denido en laclase Program. Esta clase se gener al crear la solucin Service.

    Conguracin de una direccin base para el servicio

    1. Cree una instancia de Uri para la direccin base del servicio. Este identicador URIespecica el esquema HTTP, su equipo local, el nmero de puerto 8000 y la ruta de accesoServiceModelSample/Service correspondiente al servicio que se especic para el espacio denombres del servicio del contrato.

    Para hospedar el servicio

    1. Importe el espacio de nombres System.ServiceModel.Description. Esta lnea de cdigose debera colocar en la parte superior del archivo Program.cs con el resto de las instruccio-nes using o imports.

    2. Cree una nueva instancia de ServiceHost para hospedar el servicio. Debe especicar eltipo que implementa el contrato de servicios y la direccin base. En este ejemplo, la direccinbase es http://localhost:8000/ServiceModelSamples/Service y Calculator. Service es el tipoque implementa el contrato de servicio.

    3. Agregue una instruccin try-catch que detecte una CommunicationException y agre-gue el cdigo en los tres pasos siguientes al bloqueo de intentos. La clusula catch deberamostrar un mensaje de error y, a continuacin, llamar a selfHost.Abort().

  • 5/21/2018 capitulo9

    22/76

    574

    TallerdeFormacin.N

    ET

    4. Agregue un endpoint que exponga el servicio. Para ello, debe especicar el contrato queel endpoint est exponiendo, un enlace y la direccin del endpoint. Para obtener este ejemplo,especique ICalculator como el contrato, WSHttpBinding como el enlace y CalculatorSer-vice como la direccin. Observe que la direccin del endpoint es una direccin relativa. Ladireccin completa del endpoint es la combinacin de la direccin base y la direccin del en-dpoint. En este caso la direccin completa es http://localhost:8000/ServiceModelSamples/Service/CalculatorService.

    5. Habilite el intercambio de metadatos. Para ello, agregue un comportamiento de me-tadatos de servicio. Primero, cree una instancia de ServiceMetadataBehavior, establezca lapropiedad HttpGetEnabled en true y, a continuacin, agregue el nuevo comportamiento alservicio.2

    6. Abra el ServiceHost y espere a los mensajes entrantes. Cuando el usuario presione latecla Entrar, cierre el ServiceHost.

    2Para obtener ms informacin sobre los problemas de seguridad al publicar metadatos, vea Security Considerations withMetadata.

  • 5/21/2018 capitulo9

    23/76

    575

    TallerdeFormacin.NET

    Para comprobar si el servicio funciona

    1. Ejecute service.exe desde dentro de Visual Studio. Al ejecutarse en Windows Vista, elservicio se debe ejecutar con privilegios de administrador. Dado que Visual Studio se ejecutcon privilegios de administrador, service.exe tambin se ejecuta con dichos privilegios. Tam-

    bin puede iniciar un nuevo smbolo del sistema con privilegios de administrador y ejecutarservice.exe desde all.

    2. Abra Internet Explorer y vaya a la pgina de depuracin del servicio en http://local-host:8000/ServiceModelSamples/Service.

    El siguiente ejemplo incluye la implementacin de los pasos anteriores del tutorial y hos-peda el servicio en una aplicacin de consola.

    4. Creacin de un cliente de Windows Communication Foundation

    sta es la cuarta de las seis tareas que son necesarias para crear un servicio de WindowsCommunication Foundation (WCF) bsico y un cliente que puede llamar al servicio.

    En este tema se describe cmo se pueden recuperar metadatos desde un servicio WCF yusarlos para crear un proxy WCF que pueda obtener acceso al servicio. Esta tarea se comple-

    ta con ayuda de la Herramienta de utilidad de metadatos de ServiceModel (Svcutil.exe) queWCF proporciona. Esta herramienta obtiene los metadatos del servicio y genera un archivode cdigo fuente administrado para un proxy en el lenguaje elegido. Adems de crear el proxy

  • 5/21/2018 capitulo9

    24/76

    576

    TallerdeFormacin.N

    ET

    de cliente, la herramienta tambin crea el archivo de conguracin para el cliente que permiteque la aplicacin cliente se conecte al servicio en uno de sus endpoints.

    Creacin de un cliente de Windows Communication Foundation

    1. Siga estos pasos para crear en la solucin actual un nuevo proyecto para el cliente enVisual Studio 2010:

    a. En el Explorador de soluciones (en la esquina superior derecha) de la misma solucinque contiene el servicio, haga clic con el botn secundario en la solucin actual (no el proyec-to) y seleccione Agregar y, a continuacin, Nuevo proyecto.

    b. En el cuadro de dilogo Agregar nuevo proyecto, seleccione Visual C# y elija la plantillaAplicacin de consola y denomnela Cliente. Utilice la ubicacin predeterminada.

    c. Haga clic en Aceptar.2. Agregue una referencia a System.ServiceModel.dll para el proyecto.

    3. Agregue una instruccin using para el espacio de nombres System.ServiceModel en elarchivo 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

    modicadores adecuados para crear el cdigo de cliente y un archivo de conguracin reali-zando los siguientes pasos:

    a. En el men Inicio, haga clic en Todos los programas y, a continuacin, en Visual Studio2010. Haga clic en Visual Studio Tools y, a continuacin, en Smbolo del sistema de VisualStudio 2010.

    b. Explore hasta el directorio donde desea colocar el cdigo de cliente.Si cre el proyecto de cliente con la conguracin predeterminada, el directorio es C:\

    Users\\My Documents\Visual Studio 10\Projects\Service\Client.c. Utilice la herramienta de lnea de comandos Herramienta de utilidad de metadatos de

    ServiceModel (Svcutil.exe) con los modicadores adecuados para crear el cdigo de cliente.El siguiente ejemplo genera un archivo de cdigo y un archivo de conguracin para el ser-vicio.

    De forma predeterminada, el cdigo de proxy de cliente se genera en un archivo con nom-

    bre despus del servicio (en este caso, por ejemplo, CalculatorService.cs) con una extensinadecuada al lenguaje de programacin: .cs para C#. El modicador /out cambia el nombredel archivo proxy de cliente a GeneratedProxy.cs. El modicador /cong cambia el nombrepredeterminado del archivo de conguracin de cliente, Output.cong, por App.cong.

    Observe que los dos archivos se generan en el directorio C:\Users\\My Documents\Visual Studio 10\Projects\Service\Client.

    6. Agregue el proxy generado al proyecto de cliente en Visual Studio, haga clic con el bo-tn secundario en el proyecto de cliente en el Explorador de soluciones y seleccione Agregary Elemento existente. Seleccione el archivo generatedProxy generado en el paso anterior.

    Ahora ha creado un cliente Windows Communication Foundation (WCF).

  • 5/21/2018 capitulo9

    25/76

    577

    TallerdeFormacin.NET

    5. Conguracin de un cliente bsico de Windows Communication

    Foundation

    sta es la quinta de las seis tareas necesarias para crear un servicio de Windows Commu-nication Foundation (WCF) bsico y un cliente que pueda llamar al servicio.

    En este tema se agrega el archivo de conguracin del cliente generado mediante la He-rramienta de utilidad de metadatos de ServiceModel (Svcutil.exe) en el proyecto del clientey se explica el contenido de los elementos de conguracin del cliente. La conguracin delcliente consiste en especicar el endpoint que utiliza el cliente para obtener acceso al servicio.

    Un endpoint tiene una direccin, un enlace y un contrato, y cada uno de estos elementosdebe especicarse en el proceso de conguracin del cliente.

    Conguracin de un cliente de Windows Communication Foundation

    1. Agregue el archivo de conguracin App.cong generado en la seccin anterior al pro-yecto del cliente en Visual Studio. Haga clic con el botn secundario en el proyecto de clienteen el Explorador de soluciones, seleccione Agregar y, a continuacin, Elemento existente.A continuacin, seleccione el archivo de conguracin App.cong en el directorio desde elque ejecut SvcUtil.exe en el paso anterior. (El archivo se llama App.cong porque se usel modicador /cong:app.cong al generarlo con la herramienta Svcutil.exe.) Haga clic enAceptar. De forma predeterminada, el ltro del cuadro de dilogo Agregar elemento exis-tente descarta todos los archivos con extensin .cong. Para ver estos archivos, seleccioneTodos los archivos (*.*) en el cuadro de lista desplegable situado en la esquina inferior dere-

    cha del cuadro de dilogo.Agregar elemento existente.

    2. Abra el archivo de conguracin generado. Svcutil.exe genera valores para cada ajustedel enlace. El siguiente ejemplo es una vista del archivo de conguracin generado.

    Bajo la seccin , busque el elemento . El siguiente

    archivo de conguracin es una versin simplicada del archivo generado.Este ejemplo congura el endpoint que utiliza el cliente para tener acceso al servicio que

    se ubica en la siguiente direccin: http://localhost:8000/ServiceModelSamples/service.El elemento de endpoint especica que el contrato Microsoft.ServiceModel.Samples.

    ICalculator se utiliza para la comunicacin que est congurada con el WsHttpBinding pro-

  • 5/21/2018 capitulo9

    26/76

    578

    TallerdeFormacin.N

    ET

    porcionado por sistema. Este enlace especica HTTP como el transporte, la seguridad inte-roperable y otros detalles de conguracin.

    Ahora se ha congurado el cliente.

    6. Cmo usar un cliente de Windows Communication Foundation

    Esta es la ltima de las seis tareas necesarias para crear un servicio de Windows Commu-nication Foundation (WCF) bsico y un cliente que pueda llamar al servicio.

    Una vez creado y congurado un proxy de Windows Communication Foundation (WCF)se puede crear una instancia de cliente, y la aplicacin de cliente se puede compilar y utilizarpara comunicar con el servicio WCF. En este tema se describen los procedimientos paracrear 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 operacin. El cdigo de esta tarea sedebera colocar en el mtodo Main() de la clase Program generada en el proyecto de cliente.

    Uso de un cliente de Windows Communication Foundation

    Asegrese de que el servicio se est ejecutando antes de intentar utilizar el cliente.

  • 5/21/2018 capitulo9

    27/76

    579

    TallerdeFormacin.NET

    Para ejecutar el cliente, haga clic con el botn secundario en Cliente en el Explorador desoluciones y elija Depurar, Iniciar nueva instancia.

    Bibliografa

    Application Architecture Guide v2apparchguide.codeplex.com/What is Windows Communication Foundation? Framework 3.5 [Online]http://msdn.microsoft.com/en-us/library/ms731082(v=vs.90).aspxWhat is Windows Communication Foundation? Framework 4.0 [Online]http://msdn.microsoft.com/en-us/library/ms731082.aspxGetting Started Tutorial [Online]http://msdn.microsoft.com/en-us/library/ms734712(v=VS.90).aspx

  • 5/21/2018 capitulo9

    28/76

    580

    TallerdeFormacin.N

    ET

    ASP.NET MVC

    1 Introduccin

    ASP.NET MVC es un framework para la construccin y desarrollo de aplicaciones webque aplica el patrn general MVC (Model View Controller) al framework de ASP.NET.

    En el ao 2002 se realiz el primer lanzamiento del framework de ASP.NET, y por mu-chos aos fue muy fcil pensar en ASP.NET y Web Forms (una de las tecnologas de pre-sentacin utilizada por ASP.NET) como si fueran realmente la misma cosa. La realidad esque ASP.NET es, en s mismo, un complejo framework extensible para el desarrollo deaplicaciones web.

    No fue sino hasta el ao 2007 que se anunci ASP.NET MVC, y ya en ese momento elpatrn MVC se estaba convirtiendo en una de las formas ms utilizadas para la construccinde web frameworks.

    1.1 El patrn MVC

    Es uno de los patrones arquitectnicos de software ms importantes en la actualidad ylo viene siendo desde hace muchos aos. Es una poderosa y elegante forma de separar losdistintos aspectos concernientes a una aplicacin. Si bien es cierto que agrega una pequeacantidad de complejidad al diseo de una aplicacin, los benecios que otorga hacen que elesfuerzo sea ampliamente recompensado.

    El patrn MVC separa la interface de usuario de una aplicacin en tres aspectos princi-pales:

    1. El modelo: Un conjunto de clases que describen los datos con los cuales se estn traba-jando, as como tambin las reglas de negocio sobre cmo estos datos pueden ser cambiadosy manejados.

    2. La vista: Dene cmo la interface de usuario (UI) ser desplegada.3. El controlador: Un conjunto de clases que maneja la comunicacin del usuario, sobre

    todo el ujo de la aplicacin y la lgica especca de la aplicacin.

    1.2 El patrn MVC aplicado a Web Frameworks

    El patrn MVC se ha vuelto, en los ltimos tiempos, extremadamente popular aplicadoa distintos web frameworks en distintas plataformas de ejecucin. En ASP.NET MVC sepuede 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, ascomo tambin el cdigo necesario para la manipulacin de los datos. En ASP.NET MVC setraduce generalmente a una capa de acceso a datos (Data Access Layer) de algn tipo utili-zando alguna herramienta como ser Entity Framework o NHibernate.

    2. Vista: Se representa mediante algn template para generar HTML de forma dinmica.Se detallar esto ms adelante.

  • 5/21/2018 capitulo9

    29/76

    581

    TallerdeFormacin.NET

    3. Controlador: Es una clase especial que maneja la relacin entre la vista y el modelo. Res-ponde 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 convencin, esta clase se denota mediante elsujo Controller.

    Es importante destacar que el patrn MVC es un patrn arquitectnico de alto nivel y su

    aplicacin depende mucho de su uso particular. ASP.NET MVC es contextualizado dentrodel problema que quiere resolver, es decir, un ambiente carente de estado (stateless) como loes el ambiente web, y ASP.NET como plataforma subyacente.

    2 Creando una aplicacin ASP.NET MVC

    Para crear una nueva aplicacin ASP.NET MVC se deben seguir los siguientes pasos: En el Visual Studio 2010, ir al men Archivo Nuevo Proyecto:

    En Installed Templates seleccionamos Visual C# Web ASP.NET MVC 3 WebApplication:

  • 5/21/2018 capitulo9

    30/76

    582

    TallerdeFormacin.N

    ET

    En la siguiente ventana seleccionamos Internet Application:

    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, seleccionaremosRazor.b. Una opcin para indicar si se va a utilizar las caractersticas de marcado semntico de

    HTML5, la cual marcamos.c. Una ltima opcin para indicar si deseamos crear junto a nuestro proyecto un proyecto

    para la realizacin de testeos unitario, la cual vamos a dejar desmarcada en esta ocasin.

    Listo, en este momento ya tenemos nuestra primera aplicacin 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:

  • 5/21/2018 capitulo9

    31/76

    583

    TallerdeFormacin.NET

    Y en el navegador se abrir la pgina principal de nuestra nueva aplicacin:

    3 Entendiendo la estructura de la aplicacinASP.NET MVC

    Una vez creada la aplicacin podemos observar que en el Visual Studio, debajo de nuestrasolucin, se cre toda una estructura de directorios muy particular:

    La siguiente tabla detalla los distintos directorios y su funcin:

  • 5/21/2018 capitulo9

    32/76

    584

    TallerdeFormacin.N

    ET

    Esta estructura tiene su razn de ser y est enmarcada en algo llamado Convention overConguration, un tema que retomaremos un poco ms adelante, pasando primero a mostraren nuestra aplicacin el contenido creado en cada uno de los distintos directorios, y su fun-cin.

    Cuando expandimos el directorio /Controllers, vemos que Visual Studio agreg dos cla-

    ses Controller: HomeController y AccountController. El HomeController es el controladorde la pgina principal, el encargado de mostrar la(s) vista(s) principal(es) de nuestra aplicaciny responder a los pedidos que el usuario realice desde all. El AccountController es, por suparte, el encargado de mostrar las vistas correspondientes a lo que es el login de nuestra apli-cacin, as como tambin de realizar las acciones de Login, Crear Usuario, etc.

    En el directorio /Views se crearon tres subdirectorios: /Account, /Home y /Shared,as como tambin varios templates (archivos con extensin cshtml) que corresponden a lasdistintas vistas creadas por el proyecto por defecto (Figura 9).

  • 5/21/2018 capitulo9

    33/76

    585

    TallerdeFormacin.NET

    En el directorio /Content se encuentra un archivo CSS, Site.css, que es utilizado paraagregar estilos css a todo el sitio. Por su parte, en el directorio /Scripts se agregaron variaslibreras javascript que pueden resultar muy tiles al momento de desarrollar nuestra aplica-cin 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 per-mite que los desarrolladores no tengan que estar congurando y especicando cosas que yapueden ser inferidas basadas en convenciones, es decir, acuerdos sobre distintos aspectoscomo ser nombres, directorios, etc., de nuestra aplicacin.

    Por ejemplo, para resolver las vistas, ASP.NET MVC utiliza una convencin basada en losdirectorios de la estructura, lo que permite omitir la localizacin exacta de la vista cuando sereferencia una vista desde un controlador. Por defecto, ASP.NET MVC busca el template de

    la vista en el directorio /Views/[Controller Name]/.

    4.1 Convention over conguration

    El concepto de Convention over conguration se hizo popular gracias a otro frameworkpara 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 for-ma, no se malgasta tiempo en tareas repetitivas en cada desarrollo de una nueva aplicacin.

    Este concepto es fcilmente visible en ASP.NET MVC observando la estructura de direc-torios creada en la aplicacin por defecto:

    Controllers Models ViewsEstos nombres no necesitan ser congurados en el archivo de conguracin de la aplica-

    cin, el archivo web.cong, estos nombres se espera que sean esos, por convencin.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 aplicacin, de nombre

    Views. Todas las clases de los controladores terminan con Controller (por ejemplo, HomeCon-

    troller, ProductosController) y estos se encuentran ubicados en el directorio Controllers. Las vistas que utiliza un controlador determinado se encuentran ubicadas en un subdi-

    rectorio del directorio Views, y este es nombrado de acuerdo al nombre del controlador (conexcepcin del sujo Controller). Por ejemplo, las vistas para el controlador ProductosCon-troller se encontrarn en el directorio /Views/Productos/.

    5 Desarrollando nuestra aplicacin ASP.NET

    MVC

    A modo de prctica, vamos a desarrollar una aplicacin muy sencilla que sirva para rea-lizar el ABM (Alta, Baja y Modicacin) de Productos almacenados en una base de datos.

    Por simplicidad, vamos a acceder a la base de datos utilizando Linq To SQL.

  • 5/21/2018 capitulo9

    34/76

    586

    TallerdeFormacin.N

    ET

    5.1 Modelo

    En nuestra carpeta de modelos creamos una clase llamada ProductosModels, que va a serla 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 siguienteestructura:

    Para manejar de forma ms sencilla los datos, implementamos una clase, ProductoDTO(DTO: Data Transfer Object, ver referencias). La misma se implementa de la siguiente for-ma:

    Ahora nos queda implementar nuestro modelo, ProductosModels, de forma de completarel acceso a los datos.

  • 5/21/2018 capitulo9

    35/76

    587

    TallerdeFormacin.NET

    Para ello, por el momento vamos a ofrecer dos mtodos: uno para obtener todos los pro-ductos de la base de datos, y otro para crear un nuevo producto:

    Estos mtodos podrn ser utilizados por el controlador para obtener los productos ycrear un nuevo producto, por ejemplo.

    5.2 Controlador

    Para agregar un nuevo controlador tenemos que realizar un click derecho sobre el direc-torio Controllers Add Controller. All veremos una nueva ventana donde tendremos

  • 5/21/2018 capitulo9

    36/76

    588

    TallerdeFormacin.N

    ET

    que ingresar el nombre del controlador, ProductosController en nuestro caso, y veremos enla parte inferior algo llamado Scaffolding options. Scaffolding es una tcnica muy popularen los frameworks MVC y, bsicamente, sirve para automatizar en cierta medida algunos delos pasos comunes al momento de realizar el alta, baja y modicacin de una determinadaentidad de software. En nuestro caso elegiremos Controller with empty read/write actions:

    Luego de realizada esta accin tendremos nuestro propio controlador, con cierto cdigogenerado por el propio Visual Studio, como se muestra a continuacin:

  • 5/21/2018 capitulo9

    37/76

    589

    TallerdeFormacin.NET

  • 5/21/2018 capitulo9

    38/76

    590

    TallerdeFormacin.N

    ET

    Es necesario en este momento detenerse a analizar el cdigo que obtuvimos. Como seobserva, el controlador en cierta medida no vara demasiado de cualquier otra clase que po-damos implementar nosotros, lo nico que se nota en principio es que implementa la claseabstracta Controller.

    Pero hay una particularidad: cada uno de los mtodos de esta clase que retorna un Action-Result recibe un nombre especial: Action.

    Cada Action tiene la responsabilidad de responder a los pedidos del usuario, realizandolas tareas apropiadas y retornando la vista generada al usuario (navegador, cliente, etc.) queinvoc la accin.

    En general, una accin 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, lametadata [HttpPost] en la parte superior de la declaracin de la accin. Esto permite, porejemplo, separar los casos en los cuales se quiere visualizar los datos existentes mediante unpedido GET del caso que se quiera modicar los datos mediante un POST.

    Vamos ahora a completar el controlador implementando dos acciones: Index y Create. Enel caso de la accin Index, lo que se har es obtener todos los productos para desplegarlos en

    un listado en la vista, y en el caso de la accin Create, insertar un nuevo producto en la basede datos, enviando los datos desde la vista hacia el modelo.

  • 5/21/2018 capitulo9

    39/76

    591

    TallerdeFormacin.NET

    Si observamos detalladamente el mtodo 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 ms complejos podra, por ejemplo, agregar validaciones, tomar decisionesdependiendo de ciertas entradas (por ejemplo, usario, rol, etc.).

    En el caso del mtodo Create podemos observar que recibe como parmetro una For-mCollection. Este parmetro representa una coleccin muy particular, ya que su contenidoes todos aquellos valores que se ingresaron en el formulario por parte del usuario. De estaforma, el controlador obtiene esos valores (pudiendo, otra vez, realizar las acciones que creaconveniente) y crea un ProductoDTO para poder enviar al modelo, que va a ser el encargado

    en denitiva de efectivamente ingresar los datos en la base de datos.

  • 5/21/2018 capitulo9

    40/76

    592

    TallerdeFormacin.N

    ET

    5.3 Vistas

    Por ltimo, para concluir nuestra aplicacin, una parte no menor, la creacin de las dis-tintas vistas. Recordemos que las vistas van a ser las responsables de mostrar desplegar lainformacin al usuario, y aqu radica la importancia de las mismas.

    Para seguir nuestro ejemplo, vamos otra vez a aprovechar las ventajas del scaffolding almomento de crear nuestras vistas.

    Empecemos con la vista principal de nuestra aplicacin, que en nuestro caso va a ser elIndex, y lo que va a realizar es mostrar un listado de los distintos productos con los que con-tamos en nuestra base de datos.

    Para crear la vista, primero creamos el subdirectorio Productos debajo del directorioViews (recordemos la seccin de las convenciones). En el subdirectorio Productos, hacemosclick derecho y seleccionamos Add View

    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 visualizacin. 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 enla vista, como se explic en el punto anterior.

    En Scaffold Template podemos elegir entre varias opciones para el tipo de template autilizar, 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.

  • 5/21/2018 capitulo9

    41/76

    593

    TallerdeFormacin.NET

    En este momento ya tenemos creada nuestra vista, si presionamos F5 podremos corrernuestra aplicacin y dirigirnos a http://localhost:[puerto]/Productos/Index para acceder allistado de productos de nuestra aplicacin:

    Como se observa, en este momento el listado se encuentra vaco, por lo que es necesarioagregarle nuevos datos. Para ello, necesitamos crear la vista Create. Siguiendo los pasos comose describieron anteriormente podemos generar la siguiente vista:

  • 5/21/2018 capitulo9

    42/76

    594

    TallerdeFormacin.N

    ET

    Con la que podremos ahora s crear nuestros datos. Para ello, ingresamos los distintosdatos y presionamos el botn Create, el cual llamar a la accin del controlador Create, quese comunicar con el modelo para crear el producto correctamente.

    Para nuestro ejemplo ingresamos nicamente dos datos, con lo cual nuestro listado severa de la siguiente forma:

    Solamente quedara agregar, entonces, las vistas para la edicin, los detalles y el borrado deun producto, ya que el template, por defecto, cre los links para estas acciones en el listado.

    6 Referencias

    ASP.NET MVC 3 [ltima visita: Noviembre 2011]http://www.asp.net/mvc/mvc3Creating Model clases with Linq To SQL [ltima visita: Noviembre 2011]http://www.asp.net/mvc/tutorials/creating-model-classes-with-linq-to-sql-csScott 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_objectScaffolding [ltima visita: Noviembre 2011]http://en.wikipedia.org/wiki/Scaffold_%28programming%29

  • 5/21/2018 capitulo9

    43/76

    595

    TallerdeFormacin.NET

    ASP.NET MVC

    1 Introduccin

    Ya hemos visto el funcionamiento y la arquitectura general de una aplicacin ASP.NETMVC. Ahora vamos a enfocarnos en entender ms en profundidad a los controladores y lasvistas y, ms particularmente, su implementacin en ASP.NET, as como tambin las caracte-rsticas y facilidades que nos ofrecen. En cuanto al modelo, se puede ver ms en profundidaden lo que reere al acceso a datos.

    2 Controladores

    Como ya se mencion, los controladores en el marco del patrn MVC son los responsa-bles de responder a las acciones del usuario, en general, esto implica realizar los cambios enel modelo apropiadamente a la entrada realizada por el usuario.

    De esta forma, los controladores manejan el ujo de la aplicacin, trabajan con los datosingresados y retornan los datos a la vista acorde a la accin realizada por el usuario.

    Con anterioridad, los servidores web tan solo entregaban como respuesta a un pedidopor parte del usuario, pginas HTML estticas alojadas en el propio servidor. Luego de untiempo fueron ganando terreno las llamadas pginas dinmicas, o sea, pginas generadas en

    el momento a travs de scripts tambin alojados en el propio servidor web.En el caso de MVC, el funcionamiento es un poco distinto. Mediante la URL del pedidorealizado se identica qu controlador y qu accin del mismo es necesario instanciar1y pro-vee los argumentos necesarios para instanciar dicho mtodo. Es este mtodo el que decidequ vista entregar al usuario, y la vista es la que despliega la informacin al usuario.

    Es claro que, en vez de tener una relacin directa entre la URL y un archivo existente enel servidor web, tenemos una relacin entre la URL y un mtodo en un controlador.

    Por eso es bueno pensar en ASP.NET MVC como un escenario web donde el frameworkretorna el resultado de llamada a acciones realizada sobre controladores, y no pginas exis-tentes fsicamente en el servidor.

    2.1 Implementando controladores en ASP.NET MVC

    Ya hemos visto que la forma de agregar un controlador es mediante la interfaz del propioVisual Studio 2010; la idea ahora es ver con ms profundidad qu implica realizar esta accin.

    Vamos a recordar el HomeController creado por defecto por el Visual Studio 2010:El HomeController (as como tambin cualquier controlador que implementemos) im-

    plementa la clase abstracta Controller. Esta clase abstracta provee una implementacin basepara todas las caractersticas necesarias para que un desarrollador implemente un controla-

    dor, sin preocuparse de cosas como el ruteo, por ejemplo.

    1Este comportamiento se conoce como Routing (mecanismo de ruteo), y se ver ms detalladamente un poco ms adelante.

  • 5/21/2018 capitulo9

    44/76

    596

    TallerdeFormacin.N

    ET

    Adems, provee dos caractersticas clave: Action methods: Son los mtodos del controlador, que responde a las acciones del usua-

    rio. Cada action method es expuesto en una URL distinta y se invoca mediante parmetrosextrados del pedido entrante (o sea, los parmetros forman parte del Request de la accin). Action results: Se pueden retornar objetos que describan el resultado de una accin (por

    ejemplo, desplegar una vista o redirigir al usuario a otra URL).

    2.2 Recibiendo datos

    En los controladores, en algn momento de la implementacin de algn action method,va a ser necesario poder acceder a los datos ingresados por el usuario en la vista, como serlos 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 parmetros en el action method.

    2.2.1 Objetos de contexto

    Es la forma ms directa de obtener los datos necesarios. Al crear el controlador imple-mentando la clase abstracta Controller se tiene acceso a un muy amplio conjunto de propie-dades que nos permiten acceder a distinta informacin del Request.

    2.2.2 Parmetros de los action methods

    Como vimos al momento de crear nuestro controlador de Productos, es posible que losmtodos del controlador reciban parmetros como, por ejemplo, en el siguiente mtodo:

    public ActionResult Edit(decimal id){return View();}En este caso, el action method recibe el identicador del producto que se quiere editar

    explcitamente como parmetro. Es posible replicar la forma de recibir los datos, pero de estamanera ciertos datos (como el identicador) se manejan de forma ms explcita y permite,adems, armar una ruta al producto del estilo:

  • 5/21/2018 capitulo9

    45/76

    597

    TallerdeFormacin.NET

    http://[server]:[port]/Productos/Edit/{id}Que es una de las caractersticas ms importantes del ruteo de ASP.NET MVC.Ingresando esa URL directamente se accede a la vista generada por el controlador me-

    diante la accin Edit con el identicador de producto {id}.

    2.3 Generando la respuesta al usuario

    Luego que el controlador termina de procesar un request, por lo general es necesariogenerar una response (respuesta).

    Aqu es donde entran en accin los Action Result.ASP.NET MVC provee distintos tipos de Action Result que tratan de representar las dis-

    tintas posibilidades al momento de responder a una accin del usuario.Para ello, se utilizan distintas implementaciones de la clase base ActionResult, que retor-

    nan objetos que permiten, por ejemplo, mostrar una vista, redirigir a una URL, etc.Se utilizan, adems, helpers que ayudan a simplicar la utilizacin de los distintos Action-

    Result existentes.La siguiente tabla muestra los action result ms comnmente utilizados:

  • 5/21/2018 capitulo9

    46/76

    598

    TallerdeFormacin.N

    ET

    2.3.1 Retornando HTML para mostrar en una vista

    La ms comn de las respuestas desde un action method es generar HTML y enviarloal navegador. Utilizando las Action Results esto se realiza creando una instancia de la claseActionResult que especica la vista que se quiere desplegar con el n 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().Tambin 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);}

    2.3.2 Realizando redirecciones

    Es muy comn como resultado de un action method no producir una salida directamen-te, sino redirigir al usuario a otra URL. Esta otra URL podra perfectamente ser otro actionmethod que sea el responsable de generar la salida al usuario.

    La forma ms bsica de redirigir a un navegador es llamando al helper Redirect, que retor-na una instancia de la clase RedirectResult:

    public ActionResult Redirect()

    {return Redirect(/Productos/Index);}Es posible utilizar una redireccin a una ruta indicando el controlador, el mtodo y un

    parmetro, por ejemplo:

    public ActionResult Redirect(){return RedirectToRoute(new

    {controller = Productos,action = Index,

  • 5/21/2018 capitulo9

    47/76

    599

    TallerdeFormacin.NET

    id = 5});}

    Tambin podemos redirigir a un action method especico, 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 elmismo como otro parmetro:public ActionResult Redirect()

    {return RedirectToAction(Edit, OtroControlador);}

    2.3.3 Enviar datos

    Adems del HTML, hay cantidad de otros datos basados en texto que se podran necesitargenerar en respuesta a una accin del usuario, como ser XML, JSON o texto plano.

    Para retornar texto plano, se realiza lo siguiente:

    public ActionResult Texto(){return Content(Retorno un texto cualquiera., text/plain,Encoding.Default);}El helper Content tiene tres parmetros: 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 codicacin, en este caso se utiliza la codicacin por defecto.Si, por ejemplo, se quiere retornar XML, se podra 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),

  • 5/21/2018 capitulo9

    48/76

    600

    TallerdeFormacin.N

    ET

    new XAttribute(Stock, p.Stock))));return Content(data.ToString(), text/xml);}Para este ejemplo, utilizamos los mismos productos que ya tenamos en nuestro modelo

    y, mediante la utilizacin 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 sera el siguiente, en caso de tener dos

    productos en nuestra base:

    Hoy en da es muy comn, para trabajar en conjunto con JavaScript, utilizar JSON pararetornar los datos. Por suerte, ASP.NET MVC provee un helper que ahorra mucho trabajo ala hora de enviar datos en formato JSON.

    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 datosJson. Para deshabilitar esta opcin, se utiliza el segundo parmetro del helper con el valorJsonRequestBehavior.AllowGet.

    El resultado de la llamada a este action method sera 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

    Tambin es muy comn, para determinadas situaciones, poder responder a un pedido delusuario enviando datos binarios, como puede ser por ejemplo un archivo.

    Para estos casos, ASP.NET MVC provee un helper cuyo n especco 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 leName = @c:\ASPNETMVC_1.pdf ;

    string contentType = application/pdf;string downloadName = ASPNETMVC_1.pdf;return File(leName, contentType, downloadName);

  • 5/21/2018 capitulo9

    49/76

    601

    TallerdeFormacin.NET

    }

    Al momento de invocar al action method GetFile, el navegador va a mostrar una ventanapara que el usuario pueda salvar el archivo:

    El helper File cuenta con tres parmetros, que se explican a continuacin:Si, por ejemplo, el contenido de un archivo estuviera cargado en memoria en un arreglo

    de bytes, se podra enviar el contenido de la siguiente forma:

    public ActionResult GetFile(){string contentType = application/pdf;string downloadName = ASPNETMVC_1.pdf;byte[] data = .... // Se obtienen los datos de alguna formareturn File(data, contentType, downloadName);

    }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 mo-mento de desplegar la vista. ASP.NET MVC ofrece varias formas diferentes para realizaresto, y veremos a continuacin las ms utilizadas.

    2.4.1 Como parmetro del helper View

    La forma ms comn de enviar datos es pasndolos como parmetro del helper View,como se muestra a continuacin:public ActionResult Index()

  • 5/21/2018 capitulo9

    50/76

    602

    TallerdeFormacin.N

    ET

    {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;}@ViewBag.Message

    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 ayudase podra realizar lo siguiente:

    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.

    2.4.2 Utilizando el ViewBag

    Esta caracterstica nos permite denir propiedades arbitrarias en un objeto dinmico (elViewBag) y accederlos directamente en la vista. Es realmente simple de utilizar, como se

    muestra a continuacin:

    public ActionResult Index(){ViewBag.Message = Utilizando el ViewBag;ViewBag.Date = DateTime.Now;return View();}En la vista, estos datos se accederan de la siguiente forma:

    @{ViewBag.Title = Home Page;}

  • 5/21/2018 capitulo9

    51/76

    603

    TallerdeFormacin.NET

    @[email protected]

    La desventaja de usar el ViewBag es el hecho de que no hay forma de saber en tiempode compilacin si el dato se agreg al ViewBag o no, por lo que de existir errores, solo se

    encontrarn en tiempo de ejecucin.ViewBag fue introducido en la versin 3 de ASP.NET MVC. Previamente exista una co-

    leccin similar llamada ViewData, que se manejaba de forma muy parecida.

    3 Vistas

    Hemos visto que los action methods retornan action results y, adems, como se mencio-n, la enorme mayora de las veces los action results son de la clase ViewResult, lo que secorresponde a desplegar las distintas vistas de nuestra aplicacin.

    Si bien hemos visto varios pequeos ejemplos de vistas, ahora se va a entrar ms en detallede las distintas posibilidades que tenemos, utilizando el motor de vistas Razor Engine.2

    El motor de Razor View Engine compila las vistas de nuestra aplicacin web como formade mejorar la performance. Para esto, las vistas se traducen a cdigo C#, para posteriormenteser compiladas. Esto es lo que permite que sea tan sencillo incluir cdigo C# embebido enlas propias vistas.

    Las vistas son compiladas al momento de ser utilizadas por primera vez, y las clasescompiladas se almacenan en el disco, hasta el momento en que la vista cambie y se necesiterecompilar.

    3.1 Agregando contenido dinmicamente a las vistas

    El objetivo principal de las vistas es el de permitir desplegar los datos de un modelo en lainterfaz de usuario. Para ello, es necesario poder agregar contenido dinmicamente a las vis-tas. El contenido dinmico se genera en tiempo de ejecucin y, probablemente, sea distintopara cada pedido.

    Existen tres tcnicas principales para agregar contenido dinmico a las vistas en ASP.NETMVC:

    2El motor Razor Engine fue introducido en ASP.NET MVC, pudiendo elegirse el motor por defecto de ASP.NET en sulugar, o cualquier otro motor implementado por terceros, o por uno mismo, pero esto escapa al alcance de este documento.

  • 5/21/2018 capitulo9

    52/76

    604

    TallerdeFormacin.N

    ET

    3.1.1 Utilizando cdigo embebido

    Para embeber cdigo en una vista, lo nico que se debe hacer es anteponer un smbolo @antes del cdigo a embeber. Por ejemplo, para mostrar una lista de 0 a 9 utilizando vietas,se realizara de la siguiente forma:

    @for (int i = 0; i < 10; i++){@i }Si quisiramos embeber varias lneas, lo que haramos es rodear el bloque de cdigo conun @{ y un }:@{ViewBag.Title = Home Page;

    }

    3.1.2 Utilizando los HTML Helpers

    Dos de los HTML helpers ms utilizados son el Html.BeginForm y Html.EndForm. Es-tos helpers generan los tags HTML para la denicin de un formulario:@{ Html.BeginForm(Edit, Home); }@{ Html.EndForm();}Estos tags generan el siguiente cdigo HTML:

    Como se nota, ya en el action del form se apunta al action method indicado en el helper.Adems, tenemos helpers para los elementos input de HTML, como se muestra en la

    siguiente tabla:

    Un poco distinta es la forma de agregar combo boxes mediante la utilizacin de helpers;en la siguiente tabla se muestra la forma de realizar esto:

  • 5/21/2018 capitulo9

    53/76

    605

    TallerdeFormacin.NET

    3.1.3 Utilizando vistas parciales

    Pueden darse escenarios donde sea necesario utilizar los mismos fragmentos de cdigoen distintas vistas a lo largo de toda nuestra aplicacin web. Para que sea nuestra aplicacinmucho ms 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 cdigoque pueden ser incluidos en otras vistas.

    Para crear una vista parcial, al igual que con las vistas regulares, se hace click derecho en-cima del directorio donde vamos a crear la vista, luego seleccionamos Add View

    Aparecer el dilogo de creacin de una nueva vista, que ya se ha visto:

    Una de las opciones, como se ve en la Figura 3 Dilogo para agregar una nueva vista, esun checkbox que permite crear una vista parcial.

    Una vez creada la vista parcial, para utilizarla en alguna vista principal, lo que se tiene quehacer es lo siguiente:

    @Html.Partial(VistaParcial)

    4 URL y ruteo

    En ASP.NET tradicional, utilizando WebForms, cada URL se corresponda unvocamen-te con un archivo fsico alojado en el servidor (por lo general una pgina, o sea, un archivo.aspx). El servidor web tena como principal tarea recibir el pedido del usuario y devolver

    como respuesta la pgina 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 fsico, sino que indica qu accin de qu controlador

  • 5/21/2018 capitulo9

    54/76

    606

    TallerdeFormacin.N

    ET

    y con cules parmetros 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 accin y con

    cules parmetros invocar.

    Generar las URLs salientes. En todo el HTML generado los elementos que invocanacciones necesitan que sean generados correctamente, de forma que invoquen al controladory accin que necesite.

    Las rutas en un proyecto de ASP.NET MVC se denen en el archivo Global.asax de lasolucin.

    En la solucin, por defecto, el mapeo de las rutas se dene 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 parametersnew { controller = Home, action = Index, id = UrlParameter.Optional }// Parameter defaults);}

    Lo importante ac es la lnea que comienza con routes.MapRoute. En ella se indica cmose realiza el mapeo de una URL en nuestra aplicacin, en este caso de la forma:

    {controller}/{action}/{id}

    5 Bibliografa

    ASP.NET MVC 3 [ltima visita: Noviembre 2011]http://www.asp.net/mvc/mvc3

    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/

  • 5/21/2018 capitulo9

    55/76

    607

    TallerdeFormacin.NET

    Silverlight

    1 Introduccin

    El desarrollo de aplicaciones se puede dividir en dos partes bien diferenciadas. Por unlado, se encuentra el desarrollo de la aplicacin en s, con toda la lgica necesaria para sucorrecto funcionamiento y navegacin, al igual que la lgica necesaria para manipular, inter-pretar y validar los datos que se desean presentar. Por otro, se encuentra el esfuerzo necesariopara que dicha aplicacin presente al usuario nal una interfaz usable y atractiva.

    En diciembre de 2006 Microsoft haca pblica la primera versin CTP de Silverlight, unanueva tecnologa destinada a enriquecer las aplicaciones web. Desde aquel entonces la tecno-

    loga ha evolucionado contando con el soporte de la comunidad y, desde abril de 2010, estdisponible la versin 4.0 de Silverlight que incorpora grandes avances y mltiples mejoras. [3]

    La capa que describe la agrupacin lgica de las funcionalidades y componentes que brin-dan la interfaz hacia el usuario en una aplicacin se conoce como la capa de presentacin(presentation layer).

    La capa de presentacin usualmente incluye UI components: elementos visuales usadospara mostrar informacin y aceptar entrada de usuario. Presentation Logic Components: elcdigo de la aplicacin que dene el comportamiento lgico y estructura de la aplicacin(independiente de la implementacin de la interfaz). Cuando se implementa el patrn Se-pareted Presentation, los componentes lgicos de presentacin pueden incluir Presenter,Presentation Model y View Model. La capa de presentacin puede incluir componentes de

    Presentation Layer Model que encapsulen los datos de la capa de negocios o componentesde Presentation Entity que encapsulen la lgica de negocios y datos.

  • 5/21/2018 capitulo9

    56/76

    608

    TallerdeFormacin.N

    ET

    1.2 Consideraciones de diseo para la capa de presentacin

    Hay varios factores que se deben considerar en el diseo de la capa de presentacin. Lossiguientes principios ayudan a que el diseo de una aplicacin siga las mejores prcticas y secumplan los requisitos. [1]

    Elegir el tipo adecuado de aplicacin: Rich (smart) client. Web client. Rich Internet application (RIA).

    Elegir la tecnologa adecuada. Usar patrones. Modularizar. Considerar guas de usabilidad. Seguir principios user design driven.

    2 SilverlightMicrosoft Silverlight es una plataforma de desarrollo de Microsoft que permite desarro-

    llar aplicaciones ricas. Silverlight funciona sobre varias plataformas y mltiples exploradoresy proporciona una generacin de experiencias de usuario basadas en .NET. Es necesaria la

    instalacin del complemento plug-in libre, de unos 5Mb.Ofrece un modelo de programacin 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 versin actual, recomendada y estable, es Silverlight 4 con la cual se trabajar en este

    curso. Silverlight 5 est disponible en su versin RC (Release Candidate).

    2.1 Cundo utilizar Silverlight?

    Esta tecnologa se debera considerar si se desea disear una RIA o determinadas carac-tersticas (ricas) a una aplicacin Web. [1] Si desea construir una RIA para el navegador


Recommended