DNM+ Online
dotnetmania 2.0
Desarrollo ultrarrápido con LightSwitch
Desde hace muy poco, está con nosotros la versión definitiva de Visual Studio LightSwitch, una herramienta que ha gozado de una enorme aceptación por parte de la comunidad profesional. La principal ventaja que LightSwitch ofrece es una increíble reducción de los tiempos de desarrollo, que recorta significativamente los costes respecto a cualquier otra tecnología actual, creando una nueva categoría de herramientas: Ultra-RAD. En este artículo explicamos qué hace a LightSwitch tan especial, y construiremos una sencilla aplicación en un tiempo récord.

El propio nombre de este innovador producto es ya en sí toda una declaración de intenciones: Light­Switch o “interruptor de la luz” asume como filosofía desarrollar tan rápidamente como pulsar un interruptor. LightSwitch hizo su primera aparición en forma de beta de descarga gratuita en agosto de 2010, con la posibilidad de utilizarse de forma independiente sobre una versión de Visual Studio Express, o como un nuevo tipo de proyectos de Visual Studio 2010. En marzo de 2011 apareció la versión beta2, que ya permitía desplegar aplicaciones en producción. Finalmente, el 26 de julio de 2011 vio la luz la versión final de esta herramienta.

Visual Studio LightSwitch, en adelante Light­Switch, viene precedido por la denominación “Visual Studio”, lo que le da cierta importancia y bagaje a la herramienta, identificándola como una apuesta muy seria por parte de Microsoft. “Visual Studio” confiere ciertas connotaciones de solidez, extensibilidad, potencia… Vamos, toda una apuesta que su mismo nombre define muy claramente y que (podemos decir tras utilizarlo) cumple con creces. La mejor forma de describir LightSwitch es como herramienta de desarrollo Ultra-RAD para aplicaciones típicas de empresa; es decir, para las habituales aplicaciones de formularios que trabajan contra bases de datos. El desarrollo de estas aplicaciones requiere toda una serie de tareas habituales, por ejemplo:

  • Escribir código para enlazar con los orígenes de datos.
  • Crear múltiples formularios con funcionalidades CRUD.
  • Proveer mecanismos de navegación.
  • Proveer algún sistema de manejo de usuarios y permisos.

Podemos afirmar que LightSwitch permite resolver todos estos puntos prácticamente sin necesidad de escribir una sola línea de código y en tiempo record, de forma que todo el esfuerzo de programación pueda concentrarse, cuando sea necesario, en escribir la lógica de negocio.

Es habitual que estas aplicaciones de empresa se planteen con una serie de exigencias, como por ejemplo:

  • Presentar una interfaz de usuario rica y amigable.
  • Desplegarse como aplicaciones web o ejecutarse como aplicaciones cliente/servidor de escritorio.
  • Permitir el enlace con diferentes orígenes de datos.
  • Ofrecer flexibilidad para el mantenimiento y crecimiento de los desarrollos.
  • Basarse en tecnologías conocidas y ampliamente aceptadas.

Como veremos, de nuevo LightSwitch cumple sobradamente con todas estas exigencias.

Un vistazo a la arquitectura

LightSwitch se concibe como una herramienta ideal, por ejemplo, para aplicaciones departamentales de tamaño pequeño y mediano que requieran tiempos de desarrollo extremadamente rápidos y una gran flexibilidad. Es también una herramienta ideal para la creación de prototipos o para construir el back-end de aplicaciones web.

LightSwitch simplifica dramáticamente el desarrollo de estas aplicaciones; sin embargo, tras su sencillez se esconde una arquitectura extraordinariamente sofisticada de múltiples capas que utilizan algunas de las tecnologías más potentes y punteras de Microsoft. Por detrás del telón, una aplicación creada con LightSwitch es en realidad una aplicación Silverlight que sigue el patrón Model-View-ViewModel (MVVM), que hace uso de WCF RIA Services para conectarse a los datos, y que se apoya en modelos de entidades de Entity Framework. LightSwitch puede trabajar indistintamente contra SQL Server, Azure, SharePoint o un servicio WCF RIA genérico, y puede acceder, desde VB.NET o C#, a cualquier recurso de .NET Framework 4.

Todas estas características confieren a las aplicaciones LightSwitch una solidez y extensibilidad inimaginables, teniendo en cuenta su simplicidad de uso.

Desarrollando una aplicación con LightSwitch

En este artículo nos planteamos desarrollar una aplicación de gestión de hotline. Por razones de extensión, presentaremos una versión simplificada, aunque suficiente para ayudarnos a entender las claves del desarrollo con LightSwitch.

Para comenzar, abrimos Visual Studio 2010 y vamos a “Nuevo proyecto”, seleccionamos “LightSwitch” como tipo de proyecto y elegimos el lenguaje de programación entre VB o C# (en nuestro caso, éste último). Introducimos aquí también el nombre del proyecto y la solución (en el ejemplo, “LightHotLine”) y establecemos la ruta en “Ubicación” (figura 1).

Figura 1.

La siguiente pantalla deja claro que los proyectos LightSwitch son completamente “data-centric” o centrados en los datos: el primer paso de cualquier desarrollo inevitablemente consiste en crear el modelo de datos, bien diseñando las entidades y relaciones desde el propio LightSwitch o enlazando con un origen de datos existente, del que se inferirá un modelo de entidades (figura 2).

La parte derecha del Explorador de soluciones muestra una vista lógica de los elementos de la solución y el proyecto. En realidad, se trata de una vista simplificada sobre la que se trabaja en buena parte del desarrollo, pero en la que se ocultan muchos otros archivos y carpetas. El cuarto icono del explorador de soluciones permite cambiar a la vista física, necesaria cuando el desarrollo requiere trabajar a más bajo nivel.

Figura 2.

Creando el modelo de datos: Data Entity Designer

El modelo de datos de nuestro ejemplo consistirá en cuatro entidades: Usuario, Llamada, Tipo y PersonaSoporte (figura 3).

Figura 3.

Data Entity Designer es la herramienta que provee LightSwitch para implementar el modelo de datos o para inferirlo a partir de un origen de datos existente. Indicamos nuestra elección siguiendo las opciones de la pantalla mostrada en la figura 2; en nuestro caso, utilizaremos “Create new table”. Esta acción creará una nueva tabla en una base de datos MS SQL Server Express. Pero hará varias cosas más:

  • Para cada origen de datos, LightSwitch crea un modelo de datos de EDM (Entity Data Model), que podemos imaginar como un contenedor de definiciones de entidades, de conjuntos de instancias de entidades y de relaciones.
  • Asimismo, en base al modelo anterior LightSwitch crea un servicio de datos (Data Service) que expone al mundo exterior el conjunto de entidades del modelo e implementa operaciones de consulta y actualización.

Así pues, una aplicación LightSwitch puede enlazar con diferentes tipos de orígenes de datos o crearlos desde el propio Data Entity Designer, pero provee mecanismos únicos para trabajar con ellos mediante entidades, consultas y actualizaciones. El modelo de entidades se guarda en el archivo ApplicationDefinition.lsml, donde también se guardan las cadenas de conexión a los orígenes de datos.

Empezaremos por crear la entidad PersonaSoporte, destinada a representar al personal del call center que atiende las incidencias. Como puede verse en la figura 4, las entidades creadas desde Entity Designer automáticamente proveen una propiedad Id que es la clave primaria de la tabla (un entero autoincremental). Además de los tipos de datos básicos disponibles en cualquier sistema de bases de datos tradicional, se proporcionan algunos tipos predefinidos adicionales, como por ejemplo EmailAdress, PhoneNumber o Image, que en realidad son tipos semánticos que se mapean como campos de texto, binarios, etc.

Figura 4.

La ventana de Propiedades permite ver y establecer parámetros adicionales para los campos y para la propia entidad. Si seleccionamos la entidad, vemos estas propiedades:

  • Name y Plural Name: el diseñador de entidades crea un nombre para referenciar al conjunto de instancias de una entidad a partir del nombre de clase de esa entidad. En nuestro caso, PersonaSoporte y PersonaSoporteSet.
  • Is Searchable: controla si en las pantallas (screens) asociadas a esta entidad aparece o no un cuadro de búsqueda. Aunque se desactive, siempre se podrá crear una pantalla de búsqueda a partir de la plantilla “Search Data Screen”.
  • Default Screen: es la pantalla de detalle (por ejemplo, para introducir un nuevo registro) asociada a la entidad. Si no la hay, LightSwitch provee una predeterminada.
  • Summary Property: es el campo representativo de la entidad; por ejemplo, el que queremos que aparezca en una lista.

Para los campos, podemos establecer valores para las siguientes propiedades:

  • Is Searchable:: si está activado, las pantallas asociadas a esta entidad incluirán el campo en las búsquedas.
  • Name, Display Name: Name es el nombre del campo y Display Name es el nombre que se propaga a las pantallas como etiqueta de datos.
  • Choice List: permite escribir una lista de valores posibles para el campo. Se utiliza cuando estas listas tienen pocos valores y no son otra entidad.
  • Descripción: aparecerá como tooltip en las pantallas.
  • Is Visible On Screen: predetermina la visibilidad del campo en las pantallas en que se utilice.
  • Is Required: validación de campo obligatorio.
  • Maximum Length: para los campos de texto, la longitud máxima aceptada.
  • Is Computed: se activa para indicar que un campo es calculado. Entonces aparece en la pantalla un enlace “Edit Method” para escribir la expresión de cálculo del campo (en VB o C#) en el editor de Visual Studio.
  • Custom Validation: abre el editor de programación para escribir métodos personalizados de validación.
  • Otros campos (fechas, moneda, imagen): tienen propiedades adicionales. Los campos de teléfono permiten establecer una máscara de formato.

En nuestro ejemplo, vamos a incorporar dos propiedades calculadas a la entidad PersonaSoporte. A la primera le llamaremos NombreCompleto, y será de tipo string. La segunda, Antigüedad, será de tipo decimal. En ambos casos, estableceremos su propiedad Is Computed, y en Edit Method, cuando se abra el editor escribiremos los métodos que se muestran en el listado 1.

partial void NombreCompleto_Compute(ref string result)
{
   result = Apellidos + ", " + Nombre;
}

partial void Antiguedad_Compute(ref double result)
{
    result= Math.Round(
      Convert.ToDecimal((DateTime.Now - FechaAlta).TotalDays /365),2);
}
Listado 1.

A continuación, podemos crear la entidad Usuario, con las siguientes propiedades: Id, Nombre, Apellidos, FechaAlta, Direccion, CodPostal, Poblacion, TelefonoFijo, TelefonoMovil, Email y Notas. Incorporaremos también a esta entidad una propiedad calculada NombreCompleto.

La entidad Tipo servirá para clasificar los tipos de incidencias que se produzcan y tendrá dos propiedades: Id y Descripcion.

Finalmente, la entidad Llamadas tendrá las siguientes propiedades: Id, Prioridad, Resumen, Descripcion, FechaRecepcion, FechaResolucion y Estado. Para las propiedades de fecha utilizaremos el tipo DateTime, y para las propiedades Prioridad y Estado, enteros para los que estableceremos los valores posibles en listas de selección (Choice List). La figura 5 muestra las opciones para la propiedad "Prioridad".

Figura 5.

Podemos completar la definición de esta entidad implementando una validación que asegure que la fecha de resolución sea posterior a la de recepción. Para ello, seleccionamos la propiedad FechaResolucion, y en la ficha de propiedades pulsamos sobre Custom Validation para escribir el código que se presenta en el listado 2.

partial void FechaResolucion_Validate(EntityValidationResultsBuilder results)
{
    if (FechaResolucion < FechaRecepcion)
    {
      results.AddPropertyError(
        "La resolución no puede ser anterior a la recepción");
    }
}
Listado 2.

Y ¿ya está? Bueno… no del todo. Hay que establecer relaciones entre las entidades. De esta forma, una llamada es de un usuario, de ella se encarga una persona de soporte y se clasifica según un tipo de llamada.

Desde la pantalla de Entity Designer se establecen relaciones entre entidades de manera muy fácil y comprensiva mediante la opción “Add Relationship”. Si trabajamos con un origen de datos externo que ya contenga relaciones, éstas desde aquí podrán visualizarse, pero no se podrán modificar. En el diseñador de relaciones se establecen las características y comportamientos de la relación expresados de forma textual. Las relaciones entre entidades se trasladan de forma transparente a la base de datos. La figura 6 muestra la relación entre las entidades Llamada y PersonaSoporte.

Figura 6.

Las opciones que se ofrecen en la figura 6 con respecto a la relación son las siguientes:

  • Multiplicity: es la cardinalidad de la relación (uno a uno, uno a muchos).
  • On Delete Behavior: permite establecer un comportamiento ante la eliminación para mantener la integridad referencial (impedir, eliminar en cascada).
  • Navigation Property: a partir de la relación, se provee una colección de todos los registros relacionados. En este ejemplo, la propiedad PersonaSoporte contiene la colección de todas sus llamadas asignadas.

A continuación, establecemos las relaciones con las entidades Tipo y Usuario. El diseñador de relaciones mostrará el esquema de relaciones (figura 7), y veremos que en la entidad Llamada se habrán añadido 3 nuevas propiedades, que se habrán trasladado a la base de datos como claves foráneas.

Figura 7.

Finalmente, podríamos incorporar algún refinamiento, como por ejemplo establecer la fecha del sistema como valor predeterminado de la propiedad FechaRecepcion. Para ello, vamos a la opción “WriteCode” y escogemos el evento “Llamada_Created”, y en el editor escribimos:

partial void Llamada_Created()
{
    FechaRecepcion = DateTime.Now;
}

Creando pantallas: Screen Designer

Para crear la capa de presentación, LightSwitch no dispone de un diseñador de formularios convencional. En su lugar, proporciona Screen Designer, que facilita la creación de las pantallas habituales de edición y visualización de datos como por ejemplo las rejillas, los formularios de detalle, maestro-detalle, etc. a partir de una serie de plantillas predefinidas que después podemos personalizar. Si esto ya es sorprendente, todavía lo es más que podamos modificar el diseño de las pantallas en tiempo de ejecución (en modo de depuración), cambiando, por ejemplo, el tamaño y la posición de los elementos de la pantalla. Después de pulsar el botón “Add … Screen”, se nos solicita la plantilla sobre la que se basará la nueva pantalla, como podemos ver en la figura 8.

Figura 8.

El resultado de cada plantilla es bastante previsible, se acompaña además una imagen y una breve descripción. A la derecha introducimos el nombre de la pantalla (¡los nombres no pueden tener espacios!). Y en “Screen Data”, escogemos una entidad o consulta origen de datos de la pantalla. Por supuesto, una entidad puede mostrarse en tantas pantallas como queramos, y una pantalla puede mostrar datos de más de una entidad.

Empezaremos por crear una pantalla para la entidad Tipo. Como se trata de una tabla muy simple, podemos escoger basarla en la plantilla de tipo “Editable Grid Screen”.

Después de pulsar el botón "Ok", se abre el Screen Designer, que muestra una representación del diseño de la pantalla con su rejilla. El Screen Content Tree contiene todos los elementos (colecciones de datos, controles) que formarán parte de la pantalla, como puede apreciarse en la figura 9.

Figura 9.

Si lanzamos la aplicación (por ejemplo, pulsando [F5]), veremos la pantalla en ejecución y cómo se corresponden los elementos que muestra con los del árbol de contenidos.

Volviendo al diseñador de pantallas, tenemos algunas acciones disponibles en la parte superior:

  • Add Data Item: cada pantalla de Light­Switch tiene inicialmente al menos una entidad. Esta opción permite incorporar otras entidades y consultas al árbol de contenidos que se mostrarán en el panel izquierdo. “Edit Query” permite modificar entidades y consultas. En nuestro ejemplo, bastaría con hacer clic sobre “Add LlamadaCollection” y arrastrar la consulta al árbol de contenidos para visualizar de forma sincronizada las llamadas de cada tipo seleccionado en la rejilla.
  • Add Layout Item: dependiendo de la plantilla utilizada, LightSwitch genera un árbol con los elementos necesarios para visualizar los datos de la entidad. Este comando permite incorporar otros controles y elementos de pantalla. Hay controles de pantalla, como Label o TextBox, normalmente enlazados a campos de la entidad para presentar o editar sus contenidos. Hay otros controles específicos según el tipo de datos enlazado, como CheckBox, ImageEditor e ImageViewer, MoneyEditor y MoneyViewer, DateTimePicker y DateTimeViewer, o ComboBox y ModalWindowPicker para seleccionar datos de entidades relacionadas. Otros controles enlazan con la entidad para permitir vistas multi-línea: List y Grid.
  • Los controles de grupo: estos controles, como Vertical Stack, Horizontal Stack, Two Columns, Tabs, Modal Window, Picture and Text, etc. agrupan y organizan los contenidos.
  • Finalmente, los controles personalizados (Custom Controls) nos permitirán extender el sistema utilizando controles desarrollados en Silverlight.

Vamos a crear ahora una nueva pantalla para mostrar y actualizar los datos del personal de soporte. Para la ocasión, utilizaremos la plantilla “List and Details Screen”. Esta plantilla divide la pantalla en dos secciones: una (la lista), para navegar por los registros y otra, para mostrarlos en detalle y editarlos. El resultado que obtendremos será similar al mostrado en la figura 10.

Figura 10.

Esta pantalla se corresponde con el árbol que se muestra en la figura 11 y que incluye algunos de los elementos citados:

  • El primer control de grupo Columns Layout se encarga de la división principal en paneles izquierda/derecha y lo ha creado la plantilla.
  • La división de la izquierda tiene, también generados por la plantilla, un Rows Layout y un List para mostrar algunos campos de la entidad. Esta división se ha personalizado con la inclusión de un Picture and Text, control ideal para mostrar una ficha resumen, muy habitual por ejemplo en catálogos de productos.
  • El panel de la derecha se ha personalizado organizando los controles en dos columnas. Para ello, se ha incorporado un Columns Layout. Cada columna a su vez requiere de un Rows Layout para disponer los elementos verticalmente.
  • Por otro lado, de la visualización y la actualización de la imagen, la introducción de fechas y el teléfono se encargan controles ad-hoc normalmente establecidos de forma automática; aunque, claro está, éstos pueden también personalizarse.

Figura 11.

Los elementos Command Bar muestran botones de comando asociados a las acciones CRUD habituales. El árbol de esta pantalla incluye en el primer Command Bar (el de la lista de la columna izquierda) acciones para editar, borrar o añadir un nuevo registro mediante métodos ya provistos. En modo de diseño, se pueden eliminar o añadir botones, cambiar el icono predeterminado o asociarlos a métodos personalizados. En el ejemplo, el botón “AddNew” permite entrar un nuevo registro en la misma pantalla, mientras que “AddAnd­EditNew” abre una pantalla generada automáticamente y de tipo modal para la inserción. De manera similar, utilizando la plantilla “List and Details Screen” podemos crear una pantalla para el mantenimiento de los usuarios. Aún más, simplemente indicándolo, esta pantalla puede incluir también las llamadas del usuario, como se muestra en la figura 12.

Figura 12.

Sólo nos queda montar una pantalla para el registro de las llamadas. En realidad, podríamos utilizar cualquiera de las plantillas anteriores, pero quizás por ser la entidad Llamada la “principal” de nuestra aplicación de ejemplo (y por probar una nueva), para ella utilizaremos la plantilla “New Data Screen” (figura 13).

Figura 13.

Como su nombre indica, el resultado de esta plantilla es una pantalla con la única funcionalidad de introducir nuevos registros. La ventaja es que se trata de una pantalla expresa para ese fin que puede personalizar ampliamente. Por otro lado, también deberemos proveer alguna otra pantalla tipo rejilla para navegar, buscar, etc. Y, por supuesto, de manera muy sencilla también podremos ver las llamadas de cada usuario o de cada persona de soporte, o de cada tipo, simplemente escogiendo plantillas adecuadas o añadiendo la entidad en el diseñador de pantallas mediante “Add Data Item”.

Algo que resulta muy sencillo es abrir esta pantalla de inserción desde cualquier otra; por ejemplo, podemos sobrescribir los métodos para añadir un nuevo registro que son provistos por la plantilla. En el ejemplo, creamos una pantalla “List and Details Screen” y sobrescribimos el método AddNew para que abra nuestra pantalla personalizada para introducir nuevas llamadas, como puede verse en la figura 14. El código que añadimos es el siguiente:

partial void LlamadaListAddNew_Execute()
{
    Application.ShowCreateNewLlamada();
    this.Close(false);
}

Figura 14.

Y con esto hemos completado las pantallas de nuestra aplicación de ejemplo, consiguiendo una interfaz de usuario completa y funcional en tiempo récord. ¡Y no olvidemos que la aplicación funcionará igualmente como aplicación de escritorio o como aplicación web!

Configurando la navegación

LightSwitch incorpora un sistema de navegación basado en menús muy fácil de configurar. Desde las propiedades del proyecto o desde el menú de contexto del nodo “Screen” en el árbol del proyecto, se accede a la pantalla de configuración que permite crear grupos (subniveles en el menú) y dar nombres a las opciones que a su vez referencian a las pantallas existentes.

Puede establecerse también la pantalla inicial de la aplicación y más adelante establecer permisos asociados a usuarios y roles de forma que vean o no determinadas opciones, lo que puede verse en la figura 15.

Figura 15.

Desplegando la aplicación

El paso final previo al despliegue consiste en configurar las características de la aplicación. Todas las opciones que controlan las características de la aplicación se manejan desde Application Designer, al que se accede con un doble clic en el nodo “Properties” del Explorador de soluciones. Application Designer tiene cinco pestañas:

  • General Properties: para establecer parámetros generales de la aplicación, como el nombre o el icono.
  • Extensions: presenta opciones para manejar las extensiones instaladas.
  • Screen Navigation: lo hemos visto en el punto anterior. Para gestionar los menús y organizar la navegación entre las pantallas de la aplicación.
  • Access Control: permite establecer el modo de autenticación. LightSwitch provee un mecanismo de autorización basado en usuarios y roles.
  • Application Type:: permite establecer el tipo de aplicación generada seleccionando la topología en que se basarán cliente y servidor:

    – Cliente: la parte cliente puede ser “Desktop” (el desarrollo se ejecutará como aplicación de escritorio que puede interactuar con otras aplicaciones instaladas en el cliente) o “Web”, con ejecución sobre el navegador del cliente sin posibilidad de acceder a los recursos del equipo cliente. – Servidor de aplicación: permite seleccionar dónde se ejecutará la capa de servidor. Las posibilidades van desde la utilización del propio equipo cliente como servidor, a la utilización de otro equipo ejecutando IIS (Internet Information Services) o al hospedaje en la nube (Windows Azure) de la sección servidora.

Como puede verse, combinando las opciones de cliente y servidor conseguimos soluciones de escritorio o web, con topologías de despliegue en 2 ó 3 capas… ¡a partir del mismo desarrollo!

Otros diseñadores: Query Designer

Hasta ahora, hemos utilizado directamente las entidades como orígenes de datos en las pantallas y elementos del árbol. Pero sabemos que en cualquier aplicación es habitual la necesidad de presentar pantallas que muestren datos de acuerdo con algún criterio de selección o de ordenación.

Query Designer es una herramienta de LightSwitch que permite crear consultas de forma interactiva. Se pueden especificar criterios de ordenación y de filtro, y estas consultas pueden servir de base para controles enlazados a datos en pantallas (screens) o también manejarse desde código, como puede verse en la figura 16.

Figura 16.

En las pantallas puede invocarse el Query Designer para cualquiera de los conjuntos de datos utilizados. También podemos hacerlo creando consultas desde Application Data (figura 17), que pasarán a formar parte del catálogo y podrán utilizarse desde otras pantallas.

Figura 17.

Para el ejemplo, crearemos una vista ordenada de los tipos de llamada a la que daremos el nombre TiposOrdenados, mostrada en la figura 18, y que utilizaremos para presentarlos así en las listas desplegables.

Para utilizar esta consulta, por ejemplo desde la pantalla de entrada de nuevas llamadas, la incorporamos desde el diseñador de esta pantalla mediante “Add Data Item” | “Query” | "TiposOrdenados". A continuación, seleccionamos en el árbol de pantalla el control Tipo, y en su página de propiedades establecemos la nueva consulta TiposOrdenados para la propiedad Choices.

Figura 18.

Conclusiones

A lo largo de este artículo, hemos presentado las principales posibilidades que ofrece LightSwitch para el desarrollo ultrarrápido de aplicaciones.

Las funcionalidades descritas son herramientas “de fábrica” que permiten generar en un tiempo récord y prácticamente sin escribir una línea de código una parte muy importante del desarrollo, simplificando al extremo gran parte del trabajo de la lampistería habitual. Sin embargo, a nadie se le escapa que una aplicación real puede necesitar algo más, y que funcionalidades más complejas pueden requerir un descenso al cableado interno.

En próximos artículos de carácter más técnico nos acercaremos a esta vista más interna de LightSwitch para conocer mejor su arquitectura y aprender a explotar y extender sus funcionalidades. Estudiaremos a fondo los modelos de validaciones y eventos, escribiendo métodos que utilizarán profusamente LINQ para acceder a los datos. Usaremos filtros y parámetros en el Query Designer y veremos el modelo de seguridad para controlar el acceso de los usuarios a los recursos de la aplicación. Finalmente, veremos cómo extender el modelo creando funcionalidades que aprovechen los recursos de .NET Framework y creando controles basados en Silverlight.

blog comments powered by Disqus