Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Programación avanzada más sencilla con Visual Studio Lightswitch
Beth Massi
Descargar el ejemplo de código
Visual Studio LightSwitch es un nuevo producto de la familia Visual Studio dirigido a desarrolladores que desean desarrollar rápidamente aplicaciones empresariales centradas en datos para el escritorio y la nube. LightSwitch es un entorno de desarrollo ampliable que simplifica el proceso de desarrollo, ya que le permite concentrarse en la lógica de negocio mientras se encarga de gran parte del trabajo restante. LightSwitch es perfecto para aplicaciones de productividad por departamento o para pequeñas empresas que deben realizarse rápido.
Es fácil comenzar a trabajar con LightSwitch de manera que se puede centrar en características importantes para su empresa. No necesita necesariamente escribir código para poner a trabajar una aplicación LightSwitch, pero pronto se dará cuenta de que el código es necesario para normas de negocio, trabajos de flujo de pantalla y otras características de productividad del usuario específicas para sus requisitos de negocio. Además, puede descargar e instalar extensiones LightSwitch desde la galería de Visual Studio que agregan características a sus aplicaciones que no están disponibles de manera estándar. Incluso puede crear extensiones usted mismo mediante Visual Studio Professional o una versión superior. Es una buena apuesta que la comunidad creará algunas extensiones interesantes para LightSwitch.
Este artículo apunta al desarrollador profesional que usa LightSwitch para acelerar el desarrollo de una aplicación empresarial centrada en datos típica o que mejora una aplicación LightSwitch creada inicialmente por otra persona. Voy a repasar algunas de las técnicas de desarrollo y personalización más avanzadas disponibles para desarrolladores de LightSwitch. Le mostraré cómo trabajar con las API de LightSwitch, crear diseños de pantalla personalizados, usar un procesamiento de consultas avanzado, escribir reglas de negocio complejas, y usar y crear extensiones LightSwitch. Verá que la programación incluso de las características más avanzadas de una aplicación empresarial LightSwitch se simplifica enormemente debido a que LightSwitch controla todas las conexiones subyacentes por usted. Puede descargar la aplicación de ejemplo que analizaré en code.msdn.microsoft.com/Contoso-Construction-9f944948.
Si no está familiarizado con la creación de una aplicación básica con LightSwitch, lo animo a echar un vistazo a algunos de los recursos disponibles en el Centro para desarrolladores de LightSwitch en msdn.com/lightswitch.
Información general sobre la arquitectura
Antes de adentrarnos en el desarrollo avanzado de LightSwitch, es importante comprender la arquitectura de una aplicación LightSwitch. Las aplicaciones LightSwitch se basan en Silverlight y un sólido marco de aplicación .NET que usa patrones y procedimientos recomendados bien conocidos, como la disposición en capas y Model-View-ViewModel (MVVM), así como tecnologías como Entity Framework y servicios WCF RIA (ver Figura 1). El equipo de LightSwitch se aseguró de no inventar nuevas tecnologías básicas, como un nuevo acceso de datos o una capa de UI; en su lugar, creamos un marco de aplicación y entorno de desarrollo en torno a estas tecnologías existentes basadas en Microsoft .NET Framework sobre las cuales muchos desarrolladores ya están compilando hoy día.
Figura 1 Arquitectura de aplicaciones LightSwitch
Esta arquitectura significa que las aplicaciones LightSwitch se pueden implementar como aplicaciones de escritorio, con la capacidad para integrarse con dispositivos de hardware, como un escáner o lector de código de barras, así como otras aplicaciones como Microsoft Word and Excel; o se pueden implementar como aplicaciones basadas en explorador cuando se requiere un alcance más amplio. También puede hospedar aplicaciones LightSwitch de diversas maneras, incluyendo con Windows Azure.
Todo LightSwitch se trata de datos y pantallas. Los datos en una pantalla los administra un espacio de trabajo de datos, el cual es responsable de captar las entidades desde un servicio de datos en el nivel medio mediante consultas, de hacer un seguimiento de los cambios y de enviar actualizaciones de vuelta a través de la canalización de guardado al servicio de datos de nivel medio. Cuando ejecuta el comando guardar, este llama al servicio de datos con un conjunto de cambios, que se ejecuta en una transacción de actualización contra a la fuente de datos. Puede tener varias fuentes de datos en LightSwitch (e incluso relacionar entidades entre las fuentes de datos). Cada fuente de datos que incorpora a su aplicación LightSwitch tiene su propio espacio de trabajo de datos. Desde el espacio de trabajo de datos, puede obtener acceso a todas las consultas y actualizar las operaciones contra a la fuente de datos. Las propias entidades también exponen detalles subyacentes, como su estado de entidad, y valores originales y actuales.
Visual Studio LightSwitch es su edición propia de Visual Studio. Su entorno completo de desarrollo se simplifica para centrarse en crear aplicaciones LightSwitch. Incluso con solo la edición de LightSwitch instalada, los desarrolladores tienen acceso a todas las API de LightSwitch, los marcos de Silverlight y .NET, diseños de pantallas y diseños de flujos de trabajo personalizados, validación compleja, la canalización de guardado y enlaces de control de acceso. Puede escribir consultar LINQ complejas y compuestas, y usar la interoperabilidad COM, así como el acceso a código de proyecto tanto de cliente como de servidor.
Sin embargo, si ya tiene Visual Studio Professional o una versión superior instalado, LightSwitch se integrará con esas ediciones y las aplicaciones LightSwitch se mostrarán solo como otra plantilla de proyecto en el cuadro de diálogo New Project. Además, también tiene la capacidad de crear extensiones y controles personalizados para LightSwitch.
Puntos de personalización y extensibilidad
LightSwitch permite un amplio espectro de personalización, desde la personalización de código simple hasta la creación y distribución de extensiones completamente desarrolladas a otros desarrolladores de LightSwitch.
Existen muchos enlaces integrados para escribir código en LightSwitch para entidades, consultas y pantallas. En la parte superior de cada diseñador, verá un botón desplegable “Write Code” que muestra los enlaces de método disponibles. Así es cómo se escriben las reglas de validación y seguridad, y cómo se pulsa en la canalización de guardado y el procesamiento de consultas. Parte del código que escribe se ejecuta en el servidor, parte en el cliente y parte, en ambos. Normalmente los desarrolladores de LightSwitch no necesitan saber dónde se ejecuta su código; LightSwitch se encarga de todo eso por usted. Sin embargo, si desea proporcionar funcionalidad adicional y necesita escribir código específico en el cliente o el servidor, debe saber un poco acerca de la estructura de una solución LightSwitch.
Cuando mira una aplicación LightSwitch en el Explorador de soluciones, de manera predeterminada se encuentra en “Logical View.” Sin embargo, puede ver el proyecto y la estructura reales si selecciona “File View”, tal como aparece en la Figura 2.
Figura 2 Cambie a File View para ver la estructura física
En File View, puede ver los proyectos Client y Client y, en ellos, una carpeta UserCode, donde se encuentra físicamente todo el código que escribe a través del entorno de desarrollo de LightSwitch. Puede agregar sus propios archivos de código y clases aquí, y llamarlos desde su código LightSwitch. Solo tenga en cuenta que el cliente se ejecuta en el marco de Silverlight y el servidor se ejecuta en .NET Framework 4. completo. Le mostraré un par de ejemplos más adelante.
El siguiente nivel de personalización es crear controles personalizados y fuentes de datos personalizados, y usarlos directamente en su proyecto LightSwitch. Por ejemplo, puede elegir crear su propio control de Silverlight especial que proporciona cierta funcionalidad específica y luego usar eso en sus pantallas de LightSwitch. Si tiene Visual Studio Professional o una versión superior, tiene acceso a la plantilla de proyectos de la biblioteca de clases de Silverlight y puede simplemente crear su propia biblioteca de controles y usarla en LightSwitch. También puede crear servicios WCF RIA para conectarse a fuentes de datos incompatibles de fábrica con LightSwitch. Sin embrago, a fin de dejar disponibles estas fuentes de controles y datos personalizados para otra persona que solo tiene la edición Visual Studio LightSwitch instalada, las empaqueta en una extensión LightSwitch.
Existen seis tipos de extensibilidad en LightSwitch:
- Control personalizado: una extensión de control consta de uno o más controles Silverlight, los cuales se pueden enlazar a un valor escalar único o a un conjunto de datos. También puede agrupar otros controles juntos. Una extensión de control puede ser un control único; por ejemplo, un control o indicador destacado o incluso un control de mapa. También puede ser un grupo de controles; por ejemplo, envío de información.
- Plantilla de pantalla: al crear una pantalla, se le presenta una lista de plantillas.. Una extensión de plantilla de pantalla crea una nueva plantilla que se puede agregar a la lista. Esto permite que una pantalla personalizada especifique un diseño para los controles contenidos dentro de la pantalla.
- Tipo empresarial: los tipos empresariales son únicos para LightSwitch; le permiten proporcionar validación preestablecida y formato para propiedades de entidad. Al crear este tipo de extensión, define un control editor y formato, así como una validación para el tipo. Por ejemplo, Phone Number y Email Address son tipo empresariales integrados en LightSwitch y se pueden configurar declarativamente mediante la ventana propiedades. Podría crear un tipo empresarial para Social Security Number o Packaging SKU que viene con validación y formato específicos.
- Shell: un shell proporciona la apariencia de la aplicación, su máscara o “piel”. También puede proporcionar navegación, comandos y pantallas. Depende totalmente de usted decidir cómo usar el shell para presentarlos… o no presentarlos.
- Tema: los temas proporcionan la paleta de colores para una aplicación LightSwitch. Los estilos de fuente y los colores del pincel que especifica en un tema se aplican al shell integrado o a un shell personalizado que cree usted mismo.
- Fuentes de datos personalizadas: todas las aplicaciones necesitan algún tipo de fuente de datos. LightSwitch le permite conectarse a bases de datos, listas de SharePoint y servicios WCF RIA. Con este tipo de extensión, puede conectarse a una fuente de datos externa a través de servicios WCF RIA.
Para crear extensiones, necesita Visual Studio Professional o superior, el SDK de Visual Studio y el kit de herramientas de extensibilidad de LightSwitch. Las extensiones se distribuyen igual que cualquier otra extensión de Visual Studio a través de paquetes VSIX y se implementan en la galería de Visual Studio. Entonces puede instalarlos mediante el Administrador de extensiones, el cual también se incluye con Visual Studio LightSwitch.
Ahora que entiende la arquitectura, la estructura de solución y el espectro de extensibilidad en las aplicaciones LightSwitch, vamos a profundizar en algunas características avanzadas de la aplicación de ejemplo Contoso Construction. Compilé toda la aplicación sin ningún control personalizado ni personalizaciones de fuentes de datos, de manera que requiere solo Visual Studio LightSwitch. Sin embargo, sí instalé y usé públicamente extensiones disponibles para mejorar la aplicación y repasaré cómo funcionan más adelante.
La aplicación Contoso Construction
Cuando inicia sesión en la aplicación Contoso Construction, lo primero que ve es una pantalla principal personalizada que muestra las tareas comunes, sus citas del días y proyectos actuales, tal como aparecen en la Figura 3. La aplicación hace un seguimiento de los clientes y sus proyectos de construcción, así como los materiales usados en los proyectos. También permite que los usuarios administren las fotografías para cada proyecto y programen citas entre empleados y clientes.
(haga clic para acercar la imagen)
Figura 3 Pantalla principal de la aplicación Contoso Construction
Cuando selecciona un proyecto, se abre la pantalla Project Details, que muestra un control de pestaña con sus subcontroles relacionados, los materiales y las imágenes del proyecto. El guardado de imágenes en la base de datos con LightSwitch se controla de manera automática cuando especifica que una propiedad de una entidad sea del tipo integrado Imagen, el cual viene con un editor de imágenes y visualización.
La pantalla Project Details también tiene un botón en la cinta para generar un informe de estado de proyecto. Usa COM para automatizar Microsoft Word para que envíe el proyecto y la lista de materiales al documento. Otras características de la aplicación incluyen integración de correo electrónico en el servidor para enviar citas a los clientes y empleados, trazas de auditoría, informes con consultas agregadas y un generador de consultas personalizado. LightSwitch ya cuenta con compatibilidad integrada para exportar datos en cuadrículas para Excel. La aplicación Contoso Construction también tiene una característica importante que permite que los usuarios carguen datos de materiales de hojas de cálculo directamente en la pantalla. Repasemos algunas de las partes más avanzadas de la aplicación para ver cómo se crearon.
Diseños de pantalla complejos
Al crear pantallas en LightSwitch, cada control en el árbol de contenido debe estar enlazado a un elemento de datos. El elemento de datos puede ser un campo en una entidad, un conjunto de entidades o cualquier otro elemento de datos que agregue al ViewModel. Las plantillas de pantalla ayudan a guiarlo para configurar un diseño y todos los enlaces de datos para un tipo particular de pantalla, ya sea una pantalla de búsqueda, una pantalla de detalles, una nueva pantalla de datos o cualquier otro tipo de pantalla. Algunas pantallas funcionan con entidades únicas y otras trabajan con conjuntos de entidades. Las plantillas Search Screen, Editable Grid Screen y List and Details Screen trabajan con conjuntos de entidades devueltas de una consulta que puede definir. La Edit Details Screen trabaja con una entidad específica y pasa un parámetro a la consulta que es la Id. única de la entidad que se debe recuperar.
Estas plantillas son solo puntos de partida que puede personalizar todavía más. De hecho, puede seleccionar una plantilla de pantalla que trabaje con un conjunto de entidades, pero sin elegir ningún dato para la pantalla. Por ejemplo, en el cuadro de diálogo Add New Screen, puede seleccionar la Search Screen y luego inmediatamente hacer clic en OK. Esto crea un “lienzo” en blanco que le permite partir de cero. De manera alternativa, cuando selecciona una plantilla, puede seleccionar datos de pantalla básicos que desee presentar y luego agregar más elementos de datos a la pantalla según sea necesario.
Los elementos de datos pueden ser propiedades básicas como cadenas o enteros; pueden ser métodos que llama desde el código de pantalla o botones; o pueden ser entidades que se originan a partir de las consultas. Para agregar un elemento de datos manualmente a una pantalla, haga clic en el botón Add Data Item en la parte superior del diseñador de pantalla. A continuación, puede especificar el nombre y tipo del elemento de datos. La pantalla principal es una combinación de todos estos tipos de elementos de datos, como puede ver en la Figura 4.
(haga clic para acercar la imagen)
Figura 4 Elementos de datos y el árbol de contenido del diseñador de pantallas
Tiene mucha flexibilidad con pantallas cuando diseña contenido en el árbol. Una vez que agrega todos los elementos de datos, para realizar cambios de diseño, por lo general es más fácil simplemente ejecutar la aplicación (presione F5), Abra la pantalla y luego haga clic en Design Screen en la esquina superior derecha de la aplicación. Esto le permite realizar cambios de diseño y ver actualizaciones en tiempo real. Puede usar controles de agrupación como Table Layout y Rows and Columns Layouts para ajustar exactamente dónde y cómo deben mostrarse los controles. Puede afinar las propiedades de dimensionado en la ventana Properties para especificar el tamaño exacto. Además de la barra de comandos de la pantalla (que aparece en la cinta encima de la parte superior de la aplicación), también puede especificar barras de comando para cualquier control. Esto le brinda la capacidad de colocar botones o hipervínculos bajo cualquier elemento del árbol. En la Figura 4 puede ver que la barra de comandos para la propiedad de texto estático denominada Search Projects tiene su Control Type configurado en Link, el cual aparece justificado a la izquierda bajo el texto al ejecutarse (Figura 3).
La pantalla principal muestra muchas imágenes y texto estático. Agregar imágenes a los botones en las pantallas es tan fácil como configurarlos en la ventana Properties. Sin embargo, cuando desea mostrar una imagen o texto estático en la pantalla directamente, debe hacer un par de cosas. Agregue imágenes estáticas y texto a la pantalla como propiedades locales mediante el cuadro de diálogo Add Data Item y a continuación colóquelas en el árbol de contenido. Debido a que las propiedades estáticas no se originan a partir de una entidad de datos, debe configurar el valor de la propiedad antes de que se muestre la pantalla. Haga esto en el método InitializeDataWorkspace de la pantalla, que se ejecuta antes de que se ejecute cualquier consulta. Por ejemplo, para configurar una propiedad estática de una imagen y un texto, escribiría un código similar a este:
Private Sub Home_InitializeDataWorkspace(saveChangesTo As List(Of IDataService))
' Initialize text properties
Text_Title = "Contoso Construction Project Manager"
' Initialize image properties
Image_Logo = MyImageHelper.GetImageByName("logo.png")
End Sub
A fin de cargar una imagen estática, cambie a File View y colóquela en la carpeta Proyecto/Recursos del cliente, luego configure la acción en “Recurso incrustado”. A continuación, debe escribir algún código para cargar la imagen. La aplicación de ejemplo Contoso Construction usa imágenes estáticas en diversas pantallas, así que creé una clase de ayuda llamada MyImageHelper que puede usarse desde cualquier parte en el código de cliente. Mientras está en File View, haga clic con el botón secundario en la carpeta \UserCode en el proyecto Client y seleccione Add | Class. Póngale por nombre MyImageHelper y cree un método (Compartido) que cargue la imagen, como se muestra en Figura 5.
Figura 5 La clase MyImageHelper
''' <summary>
''' This class makes it easy to load images from the client project.
''' </summary>
''' <remarks></remarks>
Public Class MyImageHelper
Public Shared Function GetImageByName(fileName As String) As Byte()
Dim assembly As Reflection.Assembly =
Reflection.Assembly.GetExecutingAssembly()
Dim stream As Stream = assembly.GetManifestResourceStream(fileName)
Return GetStreamAsByteArray(stream)
End Function
Private Shared Function GetStreamAsByteArray(
ByVal stream As System.IO.Stream) As Byte()
If stream IsNot Nothing Then
Dim streamLength As Integer = Convert.ToInt32(stream.Length)
Dim fileData(streamLength - 1) As Byte
stream.Read(fileData, 0, streamLength)
stream.Close()
Return fileData
Else
Return Nothing
End If
End Function
End Class
Puede agregar cualquier código personalizado al cliente de esta manera. Por ejemplo, la aplicación de muestra Contoso Construction también tiene clases de ayuda para exportar datos de proyectos de construcción a Word a través de COM. El punto es que tiene mucha flexibilidad para agregar su propio código personalizado y clases a LightSwitch.
Trabajo con la canalización de guardado
También puede agregar su propio código al proyecto de servidor de la misma manera. En la muestra, hay una pantalla de citas que permite que los usuarios fijen citas entre los clientes y los empleados. Si el cliente y el empleado tienen direcciones de correo electrónico, se envía una cita por correo electrónico (iCal) a ambas partes cuando la entidad de cita se inserta en la fuente de datos. La canalización de guardado expone muchos métodos que puede usar para escribir reglas empresariales, llamar a otros servicios o echar a andar flujos de trabajo, incluidos los métodos Inserted/Inserting, Updated/Updating y Deleted/Deleting para cada entidad.
La clase de ayuda para envira la cita a través de correo electrónico SMTP se ubica en la carpeta \UserCode del proyecto de servidor y se llama SMTPMailHelper. La aplicación también envía actualizaciones y cancelaciones cuando se actualizan o eliminan citas en el sistema. A fin de obtener acceso a estos métodos de canalización de guardado, seleccione la entidad en el diseñador y luego el botón desplegable Write Code. Cuando se posa sobre los métodos, la información sobre herramientas le dirá si el código se ejecuta en el cliente, el servidor o ambos. En el caso de la entidad Appointment, necesitamos inyectar código en los métodos del lado del servidor como aparece en la Figura 6 a fin de hacer un seguimiento y enviar correos electrónicos de citas nuevos, actualizados y cancelados.
Figure 6 Métodos del lado del servidor para hacer un seguimiento y enviar correos electrónicos de citas
Private Sub Appointments_Inserting(ByVal entity As Appointment)
'Used to track any iCalender appointment requests
entity.MsgID = Guid.NewGuid.ToString()
entity.MsgSequence = 0
End Sub
Private Sub Appointments_Updating(ByVal entity As Appointment)
'Update the sequence anytime the appointment is updated
entity.MsgSequence += 1
End Sub
Private Sub Appointments_Inserted(ByVal entity As Appointment)
'Send an email notification when an appointment is inserted into the system
Dim isCanceled = False
SMTPMailHelper.SendAppointment(entity.Employee.Email,
entity.Customer.Email,
entity.Subject,
entity.Notes,
entity.Location,
entity.StartTime,
entity.EndTime,
entity.MsgID,
entity.MsgSequence,
isCanceled)
End Sub
Private Sub Appointments_Updated(ByVal entity As Appointment)
'Send an email update when an appointment is updated.
Dim isCanceled = False
SMTPMailHelper.SendAppointment(entity.Employee.Email,
entity.Customer.Email,
entity.Subject,
entity.Notes,
entity.Location,
entity.StartTime,
entity.EndTime,
entity.MsgID,
entity.MsgSequence,
isCanceled)
End Sub
Private Sub Appointments_Deleting(entity As Appointment)
'Send an email cancellation when an appointment is deleted.
Dim isCanceled = True
SMTPMailHelper.SendAppointment(entity.Employee.Email,
entity.Customer.Email,
entity.Subject,
entity.Notes,
entity.Location,
entity.StartTime,
entity.EndTime,
entity.MsgID,
entity.MsgSequence,
isCanceled)
End Sub
También trabajará con la canalización de guardado cuando implemente una traza de auditoría. Las trazas de auditoría son comunes en aplicaciones empresariales y se usan para hacer un seguimiento de qué cambios se hicieron y quién los hizo en los registros del sistema. En la misma aplicación, una tabla llamada EmployeeChange hace un seguimiento de los cambios en los campos en el Empleado, como se aprecia en la Figura 7.
Figura 7 Una traza de auditoría es un requisito de aplicaciones empresariales comunes
Para captar los valores nuevos y originales en un Empleado que se está actualizando, puede entrar a la propiedad Details de la entidad. Esto le permite llegar a la API más avanzada de la entidad. En el método Employees_Updating, puede pasar en bucle dinámicamente a través de todas las propiedades de almacenamiento en la entidad y registrar sus valores nuevos y originales, como se muestra en la Figura 8.
Figure 8 Búsqueda en la propiedad Details de la entidad de empleado para crear una traza de auditoría
Private Sub Employees_Updating(entity As Employee)
'Audit trail that tracks changes to employee records
Dim change = entity.EmployeeChanges.AddNew()
change.Employee = entity
change.Updated = Now()
change.ChangedBy = Me.Application.User.FullName
Dim newvals = "New Values:"
Dim oldvals = "Original Values:"
For Each prop In entity.Details.Properties.All().
OfType(Of Microsoft.LightSwitch.Details.IEntityStorageProperty)()
If prop.Name <> "Id" Then
If Not Object.Equals(prop.Value, prop.OriginalValue) Then
oldvals += String.Format("{0}{1}: {2}",
vbCrLf,
prop.Name,
prop.OriginalValue)
newvals += String.Format("{0}{1}: {2}",
vbCrLf,
prop.Name,
prop.Value)
End If
End If
Next
change.OriginalValues = oldvals
change.NewValues = newvals
End Sub
Para obtener más información en la canalización de guardado, el marco de validación y la API de la entidad, consulte la sección Trabajo con código del Centro para desarrolladores de LightSwitch (bit.ly/inJ3DE).
Consultas avanzadas
Debido a que todas las aplicaciones LightSwitch tratan acerca de datos y pantallas, no es de sorprender que pueda crear consultas. El diseñador de consultas proporciona una manera rápida y sencilla para definir filtros, tipos y parámetros de consulta, así como especificar si la consulta debe devolver un o muchas filas. También puede basar consultas en otras consultas, lo cual es útil cuando siempre tiene un filtro o criterio que desea que se aplique a un conjunto de datos. También puede especificar parámetros obligatorios y opcionales. Sin embargo, el diseñador de consultas sí tiene sus límites. Afortunadamente, puede hacer clic en el botón Write Code en la parte superior del diseñador (o hacer clic en “Edit Additional Query Code” en la ventana de propiedades) y escribir el código en el método PreprocessQuery.
En la aplicación Contoso Construction, existe una consulta llamada CurrentProjects, como se muestra en la Figura 9. La consulta CurrentProjects solo define un parámetro opcional a través del diseñador; el resto de la consulta se controla en código.
(haga clic para acercar la imagen)
Figura 9 Consulta CurrentProjects
Observe que esta consulta solo define un parámetro opcional y no especifica un filtro o criterio. Debemos comprobar si se suministra el parámetro y, si es así, evaluar su valor para determinar si se debe aplicar un filtro. El método PreprocessQuery se pasa a cualquier parámetro que defina en el diseñador así como la consulta misma. Esto significa que puede definir cláusulas de filtro y criterio en el diseñador y luego agregarlas a la consulta al escribir código LINQ para filtrarlo u ordenarlo más. Solo tenga en cuenta que siempre debe devolver un conjunto de tipos de entidad que LightSwitch espera; no puede devolver proyecciones u otros tipos.
De manera que en el método PreprocessQuery, puede escribir código como en la Figura 10.
Figura 10 Intercepción de consultas en el método PreprocessQuery
Private Sub CurrentProjects_PreprocessQuery(
ShowAllProjects As System.Nullable(Of Boolean),
ByRef query As System.Linq.IQueryable(Of LightSwitchApplication.Project))
'If ShowAllProjects is False (or Nothing) then just pull up the
' projects that do not have an actual end date specified.
If Not (ShowAllProjects.HasValue) Then ShowAllProjects = False
If Not (ShowAllProjects) Then
query = From p In query
Where p.ActualEndDate Is Nothing
Select p
End If
End Sub
Ahora cuando crea una pantalla basada en la consulta, LightSwitch verá que hay un parámetro opcional, luego crea automáticamente ese elemento de datos de pantalla para usted y lo enlaza al parámetro de consulta. Como Show All Projects es un valor booleano, creará una casilla y cuando el usuario haga clic en el cuadro, la consulta se ejecutará de manera automática.
Espero que esté comenzando a ver todos los enlaces de código que LightSwitch proporciona; las consultas no son diferentes. Otra consulta interesante en la aplicación de ejemplo usa un agregado para encontrar proyectos que hayan sobrepasado el presupuesto. Esta consulta no especifica nada en el diseñador; solo usa código, porque necesita agregar datos secundarios para calcular el costo de materiales del proyecto:
Private Sub ProjectsOverBudget_PreprocessQuery(
ByRef query As System.Linq.IQueryable(Of LightSwitchApplication.Project))
'Return projects where the cost is over the original estimate
query = From p In query
Let cost = p.Labor +
(Aggregate m In p.ProjectMaterials Into Sum(m.Quantity * m.Price))
Where cost > p.OriginalEstimate
Order By p.StartDate
Select p
End Sub
En la aplicación de ejemplo, estas dos consultas se presentan en Search Data Screens para que los usuarios puedan exportar los resultados a Excel, analizar los datos y crear informes. Debido a que estos informes se usan a menudo, tiene sentido que estén codificados. Sin embargo, sería bueno permitir a los usuarios definir sus propios informes personalizados. Puede hacer justamente eso al instalar la extensión Control de filtro que está disponible en la galería de ejemplos, la cual incluye todo el código fuente, en bit.ly/fYmEnK.
Uso de extensiones
Las extensiones LightSwitch se instalan como cualquier otra extensión de Visual Studio. Haga clic en el archivo VSIX para instalar y luego reinicie Visual Studio. Abra LightSwitch Project Properties y verá una pestaña Extensions que le permite seleccionar qué extensiones usar en el proyecto, como se aprecia en la Figura 11.
Figura 11 Habilitación de una extensión en la pestaña Extensions de LightSwitch Project Properties
Para usar la extensión de control de filtro, cree una consulta y agregue un parámetro de cadena único llamado FilterTerm, luego agregue el siguiente código al método PreprocessQuery:
query = LightSwitchFilter.Server.Filter(query, FilterTerm, Me.Application)
A continuación, agregue una pantalla basada en la consulta y en el diseñador de pantalla cambie el tipo de control por el control Término de filtro en “Advanced Filter Builder” y cambie la posición de la etiqueta a “None”. En la aplicación de ejemplo Contoso Construction, la consulta se llama CustomFilterProjects y la pantalla, CustomReport.
Cuando ejecute la aplicación de ejemplo y abre la pantalla CustomReport, aparecerá el control del generador de filtros. Una vez que ha definido el filtro, el botón Go lo ejecutará contra el servidor. El filtro es un control Silverlight que generará una representación XML del filtro diseñado. Esto pasa a continuación a la consulta como una cadena. En el servidor, el código de consulta analizará el XML y generará cláusulas de filtro apropiadas.
Otra extensión útil es la extensión Importador de Excel que puede obtener en bit.ly/e580r3, along with all the source code.
LightSwitch ya cuenta con compatibilidad integrada para exportar datos en cuadrículas para Excel. Le Importador de Excel le permite importar datos desde hojas de cálculo al asignar columnas de Excel a las propiedades de una entidad. Esta extensión se usa en la pantalla Materials Catalog en la aplicación de ejemplo. Una vez que instala y habilita la extensión, cree una Editable Grid Screen y agregue un botón a la barra de comandos de la pantalla. En el método Execute para el comando, solo debe escribir una línea de código:
Private Sub ImportFromExcel_Execute()
LightSwitchUtilities.Client.ImportFromExcel(Me.Materials)
End Sub
Como puede ver, es muy fácil instalar y usar extensiones en LightSwitch para proporcionar capacidades adicionales. Cuando empaqueta sus personalizaciones como extensiones, puede distribuirlas ampliamente a otros desarrolladores de LightSwitch.
Cree sus propias extensiones
Para crear extensiones, necesitará Visual Studio Professional SP1 o una versión superior con LightSwitch instalado, el SDK de Visual Studio y el kit de herramientas de extensibilidad de LightSwitch, los cuales puedes descargar desde el Centro para desarrolladores de LightSwitch (msdn.com/lightswitch). Esto agrega plantillas de proyectos de extensibilidad de Visual Basic y C# bajo el nodo de LightSwitch en su cuadro de diálogo New Project.
Creemos un tema sencillo para nuestra aplicación Contoso Construction. Primero cree un nuevo proyecto LightSwitch Extension Library; yo lo llamaré ContosoThemes. Esto configura todos los proyectos necesarios para la extensión. Notará una similitud con la Vista de archivo de una aplicación LightSwitch, pero se incluyen algunos proyectos adicionales, a saber los proyectos LSPKG y VSIX.
A continuación, haga clic con el botón secundario en ContosoThemes.LsPkg y seleccione Add New Item. Aquí verá el conjunto de plantillas de extensión admitidas de LightSwitch. Seleccione el elemento LightSwitch Theme y dele un nombre; yo lo llamaré PurpleTheme. El archivo XAML preestablecido del nuevo tema se creará y abrirá en el IDE. De manera predeterminada, tiene todos los pinceles y estilos presentes en el tema shell estándar. Puede usar cualquier herramienta que desee para establecer los colores y estilos para cada elemento que LightSwitch muestre en su shell. Para este ejemplo, simplemente cambiaré un par de colores mediante el editor XAML y la ventana propiedades para seleccionar los colores, como se muestra en la Figura 12.
(haga clic para acercar la imagen)
Figura 12 Creación de una extensión de tema de LightSwitch
Una vez que está listo para probar la extensión, puede pulsar F5 para lanzar una instancia IDE de depuración. Para probar el tema, cree un nuevo proyecto LightSwitch en esta instancia. Abra LightSwitch Project Properties y en la pestaña Extensions habilite la extensión ContosoThemes que acaba de crear. Luego pase a la pestaña General y seleccione PurpleTheme. Tendrá que crear entidades y pantallas para que pueda ver su tema en acción; luego puede presionar F5 en el proyecto de prueba para ver cómo luce.
Cuando esté contento con su tema, cree la extensión en modo Liberación, luego puede pasar el paquete VSIX ubicado en la carpeta \bin\Release del proyecto VSIX a un desarrollador de LightSwitch para que lo use en cualquier de sus proyectos. También puede cargarlo en la galería Visual Studio para amplia distribución. En la Figura 13 se muestra cómo se ve el tema en la aplicación Contoso Construction.
(haga clic para acercar la imagen)
Figura 13 Aplicación de una extensión de tema a una aplicación LightSwitch
Para obtener más información sobre la creación de Extensiones LightSwitch, consulte la sección Temas avanzados del Centro para desarrolladores de LightSwitch (bit.ly/hoMP7P).
Conclusión
LightSwitch simplifica enormemente el desarrollo de aplicaciones empresariales centradas en datos al encargarse de todas las conexiones subyacentes. Le permite concentrarse en la lógica de negocio y otras características personalizadas que sus usuarios necesitan para realizar su trabajo de manera eficaz. Existen muchos niveles de personalización disponibles para los desarrolladores de LightSwitch, así como para desarrolladores profesionales que buscan crear extensiones de LightSwitch para la comunidad. Espero que este artículo le haya mostrado lo flexible y personalizable que LightSwitch puede ser. Para obtener más información, entrenamiento, muestras, vídeos, foros, comunidad y más, visite el Centro para desarrolladores de LightSwitch en msdn.com/lightswitch.
Disfrútelo.
Beth Massi es administradora de programas senior en el equipo de Microsoft Visual Studio BizApps, el cual compila las herramientas de Visual Studio para Windows Azure, Office y SharePoint, así como Visual Studio LightSwitch. Massi es miembro destacada de la comunidad de desarrolladores de aplicaciones empresariales y es responsable de producir y administrar contenido en línea e interacción de la comunidad para el equipo de BizApps. Cuenta con más de 15 años de experiencia en el sector creando aplicaciones empresariales y es oradora frecuente en eventos de desarrollo de software. Puede encontrarla en diversos sitios de desarrolladores, como Centros para desarrolladores de MSDN, Channel 9 y su blog, BethMassi.com. Puede seguirla en Twitter en twitter.com/julielerman.
Gracias al siguiente experto técnico por su ayuda en la revisión de este artículo: Robert Green