Desenvolvimento - ASP. NET
Distribuindo aplicações Windows Forms pela Web (parte 1)
Ao desenvolver uma aplicação Winforms que será distribuída pela WEB o desenvolvedor/arquiteto de software deve ter um pensamento diferente, para isso vamos entender como funciona.
por Alexandre TarifaMas será que realmente todas essas aplicações deveriam ser WEB? Será que as limitações da WEB com controles pobres e às vezes tendo um desenvolvimento complicado em determinadas tarefas e preocupações com Browser, segurança, etc.
Com toda fragilidades e problemas da Web, o .Net trouxe uma possibilidade de se utilizar o melhor recurso da WEB, que é a distribuição, e o melhor de potência de aplicações que são os Windows Forms.
As aplicações Windows Forms possuem controles com muitas propriedades, eventos e com possibilidades que nunca serão batidas pela WEB.
Já imaginou a Folha de Pagamento da sua empresa rodando um fechamento na WEB? A Contabilidade inteira da sua empresa na WEB? Será que os usuários têm a mesma produtividade ao operar um sistema na WEB ou um sistema WINFORMS? Tenho certeza que para os usuários que "pilotam" um sistema o dia todo, a WEB é um caos.
Mas a distribuição pela WEB não é a única solução, mesclar as aplicações também é possível onde determinado trecho de uma aplicação fique na WEB e outras funcionalidades específicas sejam feitas em WINFORMS.
Possibilidades temos de sobra, mas vamos por a mão na massa! Vamos ver como utilizar esse recurso de distribuição.
Ao desenvolver uma aplicação Winforms que será distribuída pela WEB o desenvolvedor/arquiteto de software deve ter um pensamento diferente, para isso vamos entender como funciona.
A distribuição ocorre da seguinte maneira:
Um usuário clica em um link apontado para um executável .Net
O Executável é baixado no GAC (Global Assembly Cache)
A aplicação é executada.
OBS: O usuário deve ter o framework instalado na máquina.
Mas o que é GAC (Global Assembly Cache)?
É um local (diretório) específico do windows onde os assembly (Exe e DLL) são baixados, ficam armazenados e são gerenciados pelo framework.
O gerenciamento que o framework faz esta relacionado ao controle de versão do assembly e também em relação a performance que é maior porque o CLR encontrará rapidamente o assembly.
O GAC traz também a possibilidade de compartilhamento de assembly, ou seja, diversas aplicações podem utilizar o mesmo assembly sem que tenha a necessidade de várias versões.
Este cenário ocorre a primeira vez que o usuário clica no link e daí pra frente o framework gerencia as versões, etc.
Conclusão: Desenvolvo a aplicação normalmente e simplesmente indico o link na web? Definitivamente NÃO! A distribuição ocorre sob demanda, ou seja, conforme a sua utilização.
Nova conclusão: Desenvolvo minha aplicação da forma mais separada possível e com toda à parte de acesso a banco de dados utilizando Web Service assim conforme o usuário for utilizando os recursos do sistema o framework vais baixando automaticamente. Caso o sistema tenha 30 DLL´s e o usuário utilize somente 5, o usuário terá somente 5 DLL´s na sua máquina.
Simples? Sim, realmente é simples!!!
Um exemplo no mundo real
Em um sistema de faturamento temos alguns perfis de usuários:
Gerentes e Diretores (cerca de 200)- Visualizam relatórios
Secretárias (cerca de 400)- Preenchem a solicitação de faturamento
Administradores (cerca de 20)- Gerenciam todo o processo e imprimem as notas fiscais/faturas e boletos.
Solução:
Aplicação Web com o formulário de solicitação de faturamento e relatórios/consultas com a opção de exportar para o excel (sempre seguindo direitos de visualização de dados).
Aplicação Windows com toda a parte operacional do sistema com diversos cadastros, controles e principalmente a emissão de cerca de 300 Notas Fiscais/Faturas por dia e um fechamento diário com geração de arquivos para a integração com sistema contábil e gerencial. Vamos então ver um exemplo prático do funcionamento deste "processo":
Abra o Visual Studio 2003 e crie uma nova aplicação. Selecione File> New> Project. Selecione a linguagem Visual Basic, template Windows Application, coloque o nome Calculadora, indique um caminho e clique em OK.
O projeto é criado, será uma solução simples com 2 TextBox e 2 botões, o usuário entra com os valores e clica no botão soma ou subtração e o resultado é exibido em uma mensagem.
Como vamos desenvolver uma aplicação que será distribuída pela WEB, temos que dividir o máximo possível as funcinalidades, vamos criar dois projetos do tipo class library.onde uma DLL será responsável pela Soma e a outra pela Subtração.
No Solution Explorer clique com o botão direito do mouse sobre a solution, Add> Add New Project. Selecione Class Library e o nome Soma. Crie outro projeto de Class Library com o nome Subtração.
Temos agora uma aplicação Windows com a interface e duas DLL´s com a regra de negócio.
Vamos implementar primeiro o projeto de Soma, na classe Class1 adicione o seguinte código
Public Class Class1 Public Function Soma(ByVal Valor1 As Integer, ByVal Valor2 As Integer) As Integer Return Valor1 + Valor2 End Function End Class
No projeto de subtração dentro da Class1 adicione o seguinte código:
Public Class Class1 Public Function Subtracao (ByVal Valor1 As Integer, ByVal Valor2 As Integer) As Integer Return Valor1 - Valor2 End Function End Class
Pronto, temos a regra de negócio disponível. Agora temos somente que ligar a interface com a camada de negócios.
No projeto Winforms monte um formulário conforme a imagem abaixo:
Imagem 1 - Formulário
Execute a solution (F5) compilando todas as DLL´s e o Executável. Adicione as referências ao projeto Winforms clicando com o botão direito do mouse sobre o projeto> add reference. Selecione a janela Projects e adicione as duas DLL´s, conforme abaixo:
Imagem 2 - Adicionando as duas referências.
No botão de SUBTRAÇÃO adicione o seguinte código:
Private Sub Subtracao_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Subtracao.Click Dim Operacao As New Subtracao.Class1 MessageBox.Show(Operacao.Subtracao(TextBox1.Text, TextBox2.Text)) End Sub
No botão de SOMATÓRIA adicione o seguinte código:
Private Sub Soma_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Soma.Click Dim Operacao As New Soma.Class1 MessageBox.Show(Operacao.Soma(TextBox1.Text, TextBox2.Text)) End Sub
Execute a aplicação e teste as "super" funcionalidades.
A aplicação está pronta, agora vamos distribuí-la.
A distribuição é muito simples
Crie um diretório virtual no IIS, abra o IIS, clique com o botão direito do mouse sobre Site da Web Padrão, conforme a imagem abaixo:
Imagem 3 - Novo diretório virtual.
No Wizard clique em Next, e coloque o Alias como Calculadora, clique em Avançar, selecione como caminho a pasta Bin da aplicação que criamos (C:\Documents and Settings\Administrador\Meus documentos\Visual Studio Projects\Calculadora\), clique em avançar e concluir.
Temos criada o diretório virtual, porém devemos criar a página WEB com o link. Abra o Windows Explorer, selecione o caminho da aplicação até a pasta Bin e crie um arquivo com o nome Exemplo.html. Abra no NotePad e digite o seguinte código:
<HTML> <b>Distribuição pela Web</B> <br> <a href=Calculadora.exe>Teste</a> </HTML>
É o código mais simples possível para um entendimento mais fácil. Abra um browser e digite: http://localhost/Calculadora/Exemplo.html. A página web é exibida.
Antes de clicar sobre o link vamos acompanhar todo o processo. Abra o Visual Studio .NET 2003 Command Prompt , conforme imagem abaixo:
Imagem 4 - Caminho do prompt.
Neste prompt de comandos do VS vamos verificar como está o GAC da máquina cliente, para isso execute o comando:
Gacutil /ldl
Este comando lista todos os assembly já existentes na máquina, vamos limpar o GAC da máquina para um bom acompanhamento com o comando:
Gacutil /cdl
Agora com o GAC limpo, vamos clicar sobre o link, porém ainda não execute nenhum comando. Após o clique sobre o link, a aplicação é aberta, antes mesmo de testarmos os botões volte ao prompt e liste novamente o conteúdo do GAC:
Gacutil /ldl
Agora 1 ítem está presente dentro do GAC, este assembly é o executável da aplicação, ou seja, as DLL´s só serão baixadas após utilizadas.
Digite agora os valores nos campos e clique somente em subtração. O resultado é exibido, vamos listar novamente o GAC:
Gacutil /ldl
Agora temos 2 assembly, ou seja, caso o usuário nunca utilize a DLL soma, ela nunca será baixada. Clique agora em soma, liste o GAC:
Gacutil /ldl
Note que temos os 3 assembly listados.
A partir de agora o framework gerencia as versões, ou seja, caso existir alteração tanto no Exe como nas DLL´s, o download do novo assembly é efetuado, caso contrário é executado diretamente no cache da máquina.
Muito simples até agora, porém existe um problema muito preocupante! A SEGURANÇA, por exemplo, imagine que a minha aplicação cria um arquivo texto, ou deleta um arquivo da máquina... é um risco sério certo?
Toda esta questão de segurança será demonstrada na parte 2 deste artigo.
Se você tem interesse em aprender .net ou discutir .net entre no grupo de usuários Codificando.net - São Paulo (www.codificando.net).
Se tiver alguma dúvida, crítica, sugestão de artigo, fale comigo: alexandretarifa@gmail.com.
Abraços.
Alexandre Tarifa
Líder Codificando.net SP