Visual Studio 2012

Dê forma aos seus dados com o Visual Studio LightSwitch 2012

Jan Van der Haegen

 

O Microsoft Visual Studio LightSwitch foi inicialmente lançado em meados de 2011 como a maneira mais fácil de criar aplicativos de negócios para a área de trabalho ou a nuvem. Embora logo tenha sido adotado por muitas pessoas com a mente voltada para TI, alguns desenvolvedores profissionais rapidamente concluíram que o LightSwitch talvez não estivesse pronto para o mundo corporativo. Afinal, uma tecnologia de desenvolvimento de aplicativo veloz talvez seja uma excelente maneira de começar um aplicativo novo e pequeno agora, mas, infelizmente, a história tem provado que esses aplicativos criados rapidamente não são bem flexíveis ao crescerem, eles precisam de muito esforço para interoperar com sistemas herdados existentes, eles não são adaptáveis às alterações tecnológicas com ritmo acelerado e não conseguem lidar com requisitos corporativos como instalações de multilocatário ou muitos usuários simultâneos. Acima disso, em um mundo de padrões abertos como os serviços RESTful e clientes HTML sendo adotados por quase todas as grandes organizações de TI, quem gostaria de ficar preso a um formato fechado?

Com o lançamento do LightSwitch 2012 se aproximando, eu pensei que seria um momento perfeito para convencer alguns amigos (desenvolvedores profissionais e arquitetos de software) a colocar seus preconceitos de lado e (re)avaliar como o LightSwitch lida com esses requisitos modernos.

O resultado? Acontece que o LightSwitch 2012 não apenas lida com todos esse requisitos, ele absolutamente os prende.

Entendendo o Visual Studio LightSwitch

O LightSwitch é uma adição baseada em designer ao Visual Studio 2012 para ajudar no trabalho com aplicativos e serviços centrados em dados. Ao trabalhar com um projeto do LightSwitch, o Visual Studio IDE muda para um ambiente de desenvolvimento com apenas três editores principais (no chamado “Modo lógico”): o Entity Designer, o Query Designer e o Screen Designer. Esses editores se concentram em obter resultados rapidamente sendo extremamente intuitivos, rápidos e fáceis de usar. Isso acrescenta alguns benefícios óbvios à vida de um desenvolvedor do LightSwitch:

  • Primeiro, ele oculta os detalhes técnicos (o código repetitivo que normalmente está associado com o desenvolvimento desses sistemas de informação). Editores fáceis de usar significam desenvolvimento rápido, desenvolvimento rápido significa desenvolvedores produtivos e desenvolvedores produtivos significam maior valor para os negócios. Ou como diria Scott Hanselman, “A maneira que você dimensiona algo realmente grande, é que você faz o mínimo possível, o máximo possível. De fato, quanto menos fizer, mais disso poderá fazer” (consulte bit.ly/InQC2b).
  • Segundo, e talvez mais importante, pessoas não técnicas, indo de analistas funcionais a proprietários de pequenas empresas a “desenvolvedores” de Microsoft Access ou Microsoft Excel, frequentemente conhecidos como desenvolvedores cidadãos, que conhecem os negócios de dentro para fora, podem chegar e ajudar a desenvolver o aplicativo ou mesmo desenvolvê-lo inteiramente. Os editores ocultam opções tecnológicas daqueles que preferem evitá-las e silenciosamente guia o designer do aplicativo a aplicar as práticas recomendadas, como encapsular a lógica do domínio em modelos de domínio reutilizáveis, manter a interface de usuário responsiva pela execução de lógica de negócios em um thread diferente do thread da interface de usuário, ou aplicar o padrão de desenvolvimento Model-View-ViewModel (MVVM) aos clientes.
  • Finalmente, esses editores na verdade não editam classes diretamente. Em vez disso, eles operam em arquivos XML que contêm metadados (Linguagem LSML), que são então usados por tarefas MSBuild personalizadas para gerar código durante a compilação. Isso efetivamente liberta o investimento feito em lógica de negócios de qualquer opção tecnológica. Por exemplo, um projeto LightSwitch que foi feito na versão 1.0 usaria os Serviços WCF RIA para toda a comunicação entre o cliente e o servidor, enquanto esse mesmo projeto agora é compilado para usar ao invés um serviço Open Data Protocol (OData) (mais sobre OData em alguns instantes). Isso é tão adaptável a um cenário de TI em transformação quanto um aplicativo pode chegar.

Projetando dados

Projetar dados com o LightSwitch pode ser considerado equivalente a criar modelos de domínio, no vocabulário do desenvolvedor profissional. O IDE primeiro lhe pergunta sobre os “dados iniciais”, especificamente onde deseja armazená-los. Duas possíveis respostas estão disponíveis. Você pode decidir “Criar nova tabela,” e nesse caso o LightSwitch usa o Entity Framework para criar as tabelas necessárias no SQL Compact (ao depurar o aplicativo), SQL Server ou Windows Azure SQL Database. Ou pode decidir projetar suas entidades em uma fonte de dados existente, como SharePoint, um serviço OData, um banco de dados existente ou um assembly dos Serviços WCF RIA. As duas últimas podem realmente ajudá-lo a continuar trabalhando em um conjunto de dados existente de um aplicativo herdado, mas o expõem por meio de padrões modernos e abertos em um aplicativo ou serviço totalmente novo.

Como exemplo, você pode tomar um serviço OData existente (um extensa lista de exemplos está disponível em odata.org/ecosystem) e importar uma ou várias entidades para um novo aplicativo LightSwitch.

A Figura 1 mostra como a entidade Employee da fonte de dados Northwind é primeiro representada no Entity Designer. Com alguns cliques e um mínimo de esforço de codificação onde necessário, você pode reprojetar a entidade de diversas maneiras (o resultado final pode ser encontrado na Figura 2). Estão incluídos:

  • Renomear as propriedades ou reordená-las (TeamMembers e Supervisor).
  • Configurar listas de opções para propriedades que devem aceitar apenas um número limitado de valores predefinidos (City, Region, PostalCode, Country, Title e TitleOfCourtesy).
  • Adicionar propriedades novas ou calculadas (NameSummary).
  • Mapear tipos de negócios mais detalhados no tipo de dados de uma propriedade (BirthData, HireDate, HomePhone, Photo e PhotoPath).

The Entity Designer After Importing from an Existing OData Service
Figura 1 O Entity Designer depois de importar de um serviço OData existente

The Same Employee Entity After Redesign
Figura 2 A mesma entidade Employee depois de reprojetar

O LightSwitch entende um grande conjunto de tipos de negócios normalmente usados como E-mail Address e Phone Number, e mais pode ser encontrado nas muitas extensões disponíveis, ou você pode criar seus próprios tipos de negócios via um projeto de extensibilidade LightSwitch. Com respeito ao tipo de dados subjacente, os tipos de negócios ampliam uma propriedade com características específicas como validação especializada (por exemplo, verificação dos formatos de E-mail ou Web Address) e propriedades estendidas específicas (formatos de Phone Number para tipos de negócios Phone Number), e com frequência virão com controles especializados usados (por padrão) para representar ou interagir com a propriedade nos aplicativos cliente.

As entidades são quase nunca totalmente não relacionadas. Usando o Entity Designer é possível projetar relacionamentos entre diferentes entidades onde necessário. Esses relacionamentos serão impostos em todas as camadas—por meio de código nas camadas de cliente e intermediária, e por meio de chaves estrangeiras no banco de dados ao projetar entidades que serão armazenadas em uma fonte de dados intrínseca (uma “nova”), como SQL Compact, SQL Server our Windows Azure SQL Database.

No entanto, um recurso verdadeiramente poderoso no LightSwitch é que você pode definir novos relacionamentos também em fontes de dados existentes. Isso é particularmente útil ao tentar seguir em frente com conjuntos de dados existentes, como arquivos XML ou banco de dados antigos ou malformados sem índices, chaves ou relacionamentos adequados. Esses chamados relacionamentos virtuais serão impostos na camada de cliente e na intermediária sem realmente ter de alterar a fonte de dados herdada. Ainda mais poderoso é que esses relacionamentos virtuais podem ser definidos entre entidades em diferentes fontes de dados.

Por exemplo, clicando com o botão direito do mouse em Fontes de Dados no Gerenciador de Soluções e selecionando Adicionar Tabela, é possível criar uma nova entidade Holiday que será armazenada em um novo banco de dados, que tem relacionamentos virtuais com a entidade Employee do serviço OData Nortwind (consulte a Figura 3).

Virtual Relationships over Different Data Sources
Figura 3 Relacionamentos virtuais em diferentes fontes de dados

Criar um aplicativo controlador de feriados dessa maneira é um excelente exemplo de como o LightSwitch o ajuda a quebrar os limites de se usar dados em apenas um aplicativo para fornecer valor adicional em outro.

Moldando os dados

O LightSwitch tenta manter a quantidade de código necessária para começar em um mínimo absoluto, o que acelera o desenvolvimento inicial tremendamente. Antes que um serviço de dados esteja verdadeiramente pronto para ser exposto, com frequência ele precisará de alguns ajustes e modificações para moldar os negócios dentro dos dados. Frequentemente, é mais fácil expressar em código do que por meio do editor.

Para cada evento imaginável, o LightSwitch tem um ponto de extensão que pode ser acessado do botão Escrever Código no designer (consulte a Figura 4). Dependendo de se o seu código será chamado no servidor, no cliente ou em ambas as camadas, isso irá gerar um stub do método onde você pode implementar seu código personalizado no cliente, comum ou subprojeto de servidor de um projeto LightSwitch.

LightSwitch Supports Many Extension Points
Figura 4 O LightSwitch oferece suporte a muitos pontos de extensão

Continuando o exemplo do aplicativo controlador de feriados, esses pontos de extensão do código poderiam ser usados para inicializar uma entidade. Por exemplo, o código a seguir atribuirá automaticamente um supervisor de funcionário como a pessoa que aprovará o feriado, ou aprovará o feriado se a pessoa não tiver supervisor:

public partial class ApplicationDataService
{
  // Initializing a new Holiday - server only
  partial void Holidays_Inserting(Holiday entity)
  {
    if (entity.Employee.Supervisor != null)
      entity.ApprovalBy = entity.Employee.Supervisor;
    else
      entity.Approved = true;
  }       
}

Da mesma forma, esses pontos de extensão do código podem ajudá-lo a escrever código de validação personalizado além do que o tipo de negócios da propriedade já valida:

public partial class Holiday
{
  // Determine if an "EndDate" is valid - executes client and server
  partial void EndDate_Validate(EntityValidationResultsBuilder results)
  {
    if (StartDate > EndDate)
      results.AddPropertyError("End date must follow the start date");
  }
}

Além de validação personalizada e regras de negócios, o Lightswitch também é fornecido com um modelo de controle de acesso opcional interno baseado em funções e permissões. A verificação do controle de acesso pode ser feita também desses pontos de extensibilidade de código, tanto verticalmente como horizontalmente.

O controle de acesso vertical é onde você iria impor limitações por tela, entidade ou propriedade com base nas permissões do usuário atualmente conectado. Por exemplo, o código a seguir limitaria o processo de aprovação apenas aos funcionários dentro de um determinado departamento da organização, como recursos humanos.

public partial class Holiday
{
  // Determine if "Approved" can be modified by the user -
  // executes client and server
  partial void Approved_IsReadOnly(ref bool result)
  {
    result = !Application.User.HasPermission("ApproveHolidays");
  }
}

O controle de acesso horizontal é onde você filtraria quais registros são visíveis para o usuário final. Observe que esse código é executado na camada do servidor, significando que os dados que não têm permissão de acesso pelo usuário final não são nunca transmitidos:

public partial class ApplicationDataService
{
  // Filtering out records - runs on the server only
  partial void Holidays_Filter(ref Expression<Func<Holiday, bool>> filter)
  {
    if (!Application.Current.User.HasPermission("ViewAllHolidays"))
      filter = holiday => holiday.Employee.NameSummary == 
        Application.Current.User.FullName ||
        Application.Current.User.FullName == holiday.ApprovalBy.NameSummary;
   }
}

O controle de acesso horizontal, também chamado de segurança em nível de linha, é uma importante adição ao LightSwitch no Visual Studio 2012.

Primeiro, o filtro é executado no servidor. Isso restringe a quantidade de dados que pode ser desnecessariamente transferida por chamada porque o usuário não tem permissão de início para interagir com essas linhas. No controle de acesso vertical, o usuário final ainda verá os dados, mesmo que ele não possa interagir com eles pois os controles são somente leitura ou exceções são geradas no caso de ações de violação. No entanto, no caso de controle de acesso horizontal, os dados em excesso são completamente escondidos do usuário final.

Isso nos traz para outro uso poderoso de segurança em nível de linha: Ele pode conceder propriedade de partes do conjunto inteiro de dados apenas para determinados usuários ou organizações. Isso permite criar um aplicativo que precisa apenas de ser instalado uma vez, e você pode fornecer acesso a diferentes grupos, empresas, indivíduos ou organizações. Cada um deles atua como um locatário em que todos usam o mesmo aplicativo cliente e os mesmos serviços, mas possuem apenas uma fatia dos dados. Essas instalações multilocatário reduzem tremendamente os custos de hospedagem para todas as partes e oferecem outros benefícios como a capacidade de atualizar apenas uma vez em um local central, como a nuvem. Os que tiveram o prazer de passar horas e horas discando para servidores locais para atualizar instalação após instalação de um hotfix urgente serão provavelmente os primeiros a reconhecer o poder desses recursos multilocatário no LightSwitch 2012.

Expondo dados

Ao pensar sobre o valor dos dados que uma empresa coleta, muitos tendem a pensar sobre isso apenas em termos do produto que usa os dados. No entanto, coletar e analisar amplas categorias de dados está se tornando mais valioso do que nunca. Ao se libertar do silo de um único aplicativo e tratado corretamente, analisar e fazer a mineração de dados pode proporcionar receita adicional além do modelo de negócios baseado em produto tradicional. Para que isso funcione, é importante abraçar padrões abertos, como o protocolo OData que é usado no serviço que é criado automaticamente ao se criar um projeto Lightswitch.

Aqui está um somatório de OData de odata.org:

“OData, abreviação de Open Data Protocol, é um protocolo da Web para consulta e atualização de dados … O OData faz isso aplicando e criando em cima de tecnologias Web (abertas) como HTTP, Atom Publishing Protocol e JSON … O OData é consistente com o modo que a Web funciona—ele se compromete profundamente com URIs para identificação de recursos e se compromete com uma interface uniforme, baseada em HTTP, para interagir com esses recursos (justamente como a Web). Esse comprometimento com os principais princípios da Web permite que o OData habilite um novo nível de integração de dados e interoperabilidade por uma vasta gama de clientes, servidores, serviços e ferramentas.”

Em outras palavras, o OData está implementando um serviço com o qual pode ser interagido por meio do uso de simples verbos HTTP e identificadores de recurso (ou URLs). Um serviço OData pode ser consumido de quase qualquer tecnologia de cliente, e em seu uso mais simples, isso significa que o serviço pode até ser navegado com uma solicitação “Get” do HTTP a partir de um navegador da Web, por exemplo, digitando o seguinte como o endereço Web:

 http://services.odata.org/Northwind/Northwind.svc/Customers?$filter=

replace(CompanyName, '%20','')eq'AlfredsFutterkiste'

Tal URL é sempre composta da URL raiz de serviço (o ponto de extremidade do serviço), um caminho de recurso (o nome da entidade) e, opcionalmente, opções de consulta. Observe que o último torna o próprio serviço bastante agnóstico do caso de uso; o protocolo OData tem uma extensa linguagem de consulta que pode ser usada para classificar ou filtrar dados via a URL, no entanto, o chamador precisa dela. O conjunto completo de operadores pode ser encontrado em bit.ly/LSiPAj.

Quando você está projetando o serviço de dados do LightSwitch e está ciente de como os dados serão consumidos, também pode aproveitar o Query Designer para criar consultas antes de publicar, para sua própria comodidade. A Figura 5 mostra uma consulta simples que retorna apenas os feriados não aprovados que começam durante o ano atual. Observe como a fonte da consulta é o conjunto Holidays inteiro, que será certamente pré-filtrado pelo filtro que defini no código anteriormente.

Using the Query Designer for a Simple Query
Figura 5 Usando o Query Designer para uma consulta simples

Depois de gastar algum tempo no Entity Designer e no Query Designer, você pode ter um serviço OData pronto para ser implantado. É possível fazer isso diretamente do Visual Studio IDE clicando com o botão direito do mouse no projeto LightSwitch no Gerenciador de Soluções e escolhendo a opção “Publicar…” no menu de contexto.

Isso exibe o assistente de publicação de aplicativos do LightSwitch (consulte a Figura 6), com o qual você pode configurar algumas propriedades finais específicas do aplicativo como cadeias de caracteres de conexões necessárias, tipos de autenticação (nenhum, combinação de nome de usuário e senha, ou autenticação do Windows), uma conta de administrador do aplicativo e o destino de sua instalação (que pode ser um pacote de instalação ou envolver a publicação direta no IIS ou Windows Azure do IDE). Essa última opção especialmente recebeu algumas melhorias enormes nos últimos meses, o que torna a implantação de seu serviço de dados na nuvem uma experiência rápida e livre de problemas.

The LightSwitch Publish Wizard
Figura 6 O assistente de publicação do LightSwitch

Adotando um padrão aberto, o conjunto de clientes que podem ser usados para interagir com esse serviço de dados é um que quase todo usuário final já terá disponível. Aplicativos de planilha como o Microsoft Excel permitem que o serviço de dados seja consumido e convertido em tabelas e gráficos PowerPivot sem a necessidade de qualquer codificação (consulte a Figura 7). (Observação: o PowerPivot, interno no Office 2013, é um complemento gratuito e separado do Office 2010.) É possível encontrar instruções detalhadas passo a passo sobre isso em bit.ly/xETG0V.

Consuming a LightSwitch OData Service in Excel
Figura 7 Consumindo um serviço OData do LightSwitch no Excel

Criando clientes

Outro benefício principal do LightSwitch é que você pode usar a mesma experiência de IDE para criar aplicativos cliente. O LightSwitch oferece suporte a clientes espessos (Silverlight 5, em navegador ou fora dele) e a aplicativos específicos de dispositivos móveis (HTML5) com a mesma velocidade de design que ele fornece no servidor, ou até mais rápido. Observe que a capacidade de criar aplicativos em HTML5 só está disponível na versão de teste, mas estará disponível como um complemento depois do lançamento do Visual Studio 2012 final.

Para iniciar, clique no botão Adicionar Tela no Entity Designer ou no Query Designer. Isso exibirá um assistente em que você pode selecionar um modelo de tela, que pode ser um dos muitos modelos internos ou um criado por você mesmo ou que você baixou das extensões disponíveis.

Selecionar os dados da tela (o conjunto da entidade Holidays) e um modelo (tela lista e detalhes) irá gerar rapidamente o layout de tela desejado e o abrirá no designer de tela. Você pode então começar com algumas modificações iniciais no layout dos controles ou alterar quais controles são usados inteiramente. O LightSwitch faz um bom trabalho de inferir o controle desejado para ser usado com base no tipo de negócios de qualquer propriedade, como usar um seletor de datas para uma propriedade data de nascimento, mas você está livre para alterar isso para outro controle do LightSwitch, um fornecido pronto para uso ou um baixado de extensões disponíveis. Ou pode deixar que suas habilidades de XAML (ou JavaScript e CSS) voem longe para um personalização ilimitada. Nesse ponto, o aplicativo está pronto para ser criado e executado com um clique do botão F5.

Como pode ver na Figura 8, o aplicativo está limpo, intuitivo e totalmente funcional. No entanto, não deixe a facilidade com que foi criado fazê-lo acreditar que está completo. Por exemplo, nos bastidores, ele usa uma versão avançada de MVVM, baseada na interpretação em tempo de execução de metadados, que abordei em um artigo online de abril de 2012, “O modelo MVVM do LightSwitch” (msdn.microsoft.com/magazine/hh965661). Por causa disso, o Screen Designer que foi usado no Visual Studio para fazer o design inicial pode ser exibido dentro do aplicativo clicando no link da tela de design no canto inferior direito. Assim, é possível fazer modificações adicionais aos metadados de exibição enquanto o aplicativo está sendo executado em modo de depuração. Essas modificações podem persistir de volta ao projeto.

A Simple LightSwitch Client Application
Figura 8 Um simples aplicativo cliente do LightSwitch

Ao explorar ainda mais a arquitetura cliente do LightSwitch, você descobrirá que há muitas outras maravilhas a descobrir. Por exemplo, controles ou telas se tornarão automaticamente somente leitura ou ocultos se não tiver a permissão para editar a entidade subjacente.

Igualmente conveniente é que você não mais precisa se preocupar em gerar eventos NotifyPropertyChanged para fazer com que suas ligações funcionem corretamente. Se um usuário final alterar a propriedade sobrenome da entidade funcionário, por exemplo, um controle ligado a uma propriedade fullname calculada (baseada na propriedade sobrenome, certamente) será automaticamente atualizada para exibir o novo valor.

Falando em alterar uma propriedade: Todos os modelos usados no cliente são realmente “objetos de dispatcher duplo” para ajudar a manter a interface de usuário responsiva ao mesmo tempo que processa lógica de negócios. Do thread da interface de usuário, podemos fazer uma simples atribuição de um valor a uma propriedade. Isso enviará internamente uma notificação que será selecionada com base na prioridade ponderada em um segundo thread, chamado de thread lógico. Quando a lógica de negócios termina o processamento, o mesmo sistema de notificação de evento é usado para informar ao thread da interface de usuário do resultado final eventual e atualizar a interface de usuário de acordo.

Um último e interessante fato que queria compartilhar sobre o cliente vem do muito ativo Blog da Equipe do Visual Studio LightSwitch, onde é explicado que cada tela realmente representa uma unidade de trabalho (consulte bit.ly/9vENdF). Cada tela tem seu próprio espaço de trabalho de dados, que ela compartilha com qualquer tela filho aberta por essa tela inicial, como pop-ups ou uma tela de detalhes da entidade. Todas as alterações são mantidas localmente até que o usuário final decida salvar ou descartar todas elas. Isso significa que abrindo uma tela duas vezes (permitir várias instâncias está desabilitado por padrão, mas pode ser habilitado na janela Propriedades do Screen Designer), você pode simular como o LightSwitch lida com usuários diferentes fazendo modificações concorrentes em alguns dados e, em seguida, salvando-os ao mesmo tempo (consulte a Figura 9).

Handling Concurrent Modifications
Figura 9 Lidando com modificações concorrentes

Se estiver imaginado se o LightSwitch lida bem com isso, como eu disse na introdução, ele apenas não só lida com todos esse requisitos, ele absolutamente os prende.

Jan Van der Haegen é um "geek verde" que transforma café em software. Ele é um marido dedicado, um orgulhoso mestre de scrum de uma equipe internacional em Centric Belgium e tão viciado em aprender sobre qualquer tecnologia .NET — em particular, sobre o Visual Studio LightSwitch — que mantém um blog sobre suas experiências de codificação. Você pode encontrar suas mais recentes aventuras em switchtory.com/janvan.

Agradecemos aos seguintes especialistas técnicos pela revisão deste artigo: Joe Binder e Beth Massi