Como Integrar um framework ao DataSnap no Delphi XE

Veja nesse artigo como os desenvolvedores que trabalham com arquitetura multicamadas em Delphi XE, podem integrar esta solução a arquitetura DataSnap

Introdução

No artigo Criando seu próprio framework de persistência Objeto-Relacional no Delphi XE demonstrou-se a possibilidade de desenvolvimento de softwares multicamadas dando ao desenvolvedor a liberdade de customização de seu próprio framework [1].

Portanto, o objetivo deste artigo é justamente mostrar como os desenvolvedores que trabalham com arquitetura multicamadas, de posse de seu próprio framework de persistência objeto-relacional em Delphi XE, podem integrar esta solução a arquitetura DataSnap.

A arquitetura DataSnap

A arquitetura DataSnap apresenta o suporte de transporte de dados sobre HTTP além de TCP/IP, permitindo que se separe a camada de dados da camada de aplicação através da interface de comunicação entre estas proporcionada pela camada de negócios. Além de permitir várias tecnologias como aplicação cliente conforme ilustrado na Figura 1 [2].


Figura 1: Arquitetura DataSnap

De acordo com [3] e para ilustrar a integração use a mesma estrutura de pastas do post apresentado em [1] e crie dentro da pasta projeto uma pasta Server e outra Client conforme Figura 2. Siga os passos abaixo para integrar o seu Framework de persistência a arquitetura DataSnap:

Figura 2: Estrutura de pastas do exemplo.

- Crie um novo projeto no Delphi XE do tipo DataSnap Server VCL Forms Applications, escolhendo também o protocolo HTTP e salve-o dentro da pasta Server, conforme Figura 2, com o nome de Server.

Veja na Figura 3 o wizard de criação da aplicação DataSnap Server.






Figura 3: Wizard de criação da aplicação Server - DataSnap.

- Customize a aplicação Server com dois botões – um para inicializar o servidor DataSnap e outro para parar, conforme Listagens 1 e 2 e ilustração na Figura 4.

Listagem 1: Unit1.pas – onClick do botão btnStartSever

procedure TForm1.btnStartServerClick(Sender: TObject); begin ServerContainer1.DSServer1.Start; end;

Listagem 2: Unit1.pas – onClick do botão btnStopServer

procedure TForm1.btnStopServerClick(Sender: TObject); begin ServerContainer1.DSServer1.Stop; end;
Figura 4: Layout da aplicação DataSnapServer.

- Para integrar o framework à aplicação DataSnap Server crie um novo DataServer Module com o nome de ServerModBaseDados.pas. Do framework criado no post apresentado em [1] transfira todos os componentes e códigos da Unit srvModBaseDados.pas para o DataServer Module ServerModBaseDados.pas conforme Figura 5 e Listagem 3. Não esqueça de excluir a Unit srvModBaseDados.pas da pasta Framework. Também é necessário alterar as referencias a esta na Unit GenericDAO.pas para a nova Unit ServerModBaseDados.pas. Por fim, adicione todas as Units que estão dentro da pasta Framework ao seu projeto.


Figura 5: DataServer Modulo – ServerModBaseDados.pas.

Listagem 3: ServerModBaseDados.pas

//funções para o banco de dados function TDSServerModuleBaseDados.Conectar:boolean; begin try LSCONEXAO.Connected := true; result := true; except result := false; end; end; function TDSServerModuleBaseDados.Desconectar:boolean; begin try LSCONEXAO.Connected := false; result := true; except result := false; end; end; //funções para manipular as entidades function TDSServerModuleBaseDados.getDataSet(strQry:string): TDataSet; begin SQLDSServidor.Close; SQLDSServidor.Params.Clear; SQLDSServidor.CommandType := ctQuery; SQLDSServidor.CommandText := strQry; SQLDSServidor.Open; result := SQLDSServidor; end; function TDSServerModuleBaseDados.execSql(strQry:string): boolean; Var msgErro:string; begin result := false; SQLDSServidor.Close; SQLDSServidor.Params.Clear; SQLDSServidor.CommandType := ctQuery; SQLDSServidor.CommandText := strQry; try SQLDSServidor.ExecSQL; result := true; except on e: Exception do begin raise Exception.Create(e.Message) end; end; end;

- Também é necessário fazer com que a aplicação DataSnap Server conecte com a base de dados ao ser inicializada. Assim sendo, implemente na Unit1.pas, ou seja, a Unit principal da aplicação DataSnap Server os métodos conforme as Listagens 4 e 5.

Listagem 4: Unit1.pas – FormCreate.

procedure TForm1.FormCreate(Sender: TObject); begin DSServerModuleBaseDados.Conectar; end;

Listagem 5: Unit1.pas – FormClose.

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin DSServerModuleBaseDados.Desconectar; end;

- Por fim é necessário implementar os métodos que ficarão a disposição as aplicações clientes. Para tal, na Unit ServerMethodsUnit1.pas implemente o método insert e getAll para a TAluno conforme Listagens 6 e 7.

Listagem 6: ServerMethodsUnit1.pas – método insert.

function TServerMethods1.insert(aluno:TAluno):boolean; begin result := TGenericDAO.Insert(aluno); end;

Listagem 7: ServerMethodsUnit1.pas – método getAll.

function TServerMethods1.getAll:TDataSet; begin result := TGenericDAO.GetAll(TAluno.Create()); end;

A Aplicação Cliente

Para demonstrar a utilização do framework em uma arquitetura DataSnap, crie uma aplicação cliente do tipo VCL Forms Applications e salve-a dentro da pasta Client, conforme Figura 2, como o nome de Client. Faça a mesma interface da aplicação do post apresentado em [1] conforme Figura 6 e adicione todas as Units que estão dentro da pasta Framework, com exceção da GenericDAO.pas, ao projeto de sua aplicação cliente. Para que a aplicação cliente se conecte a aplicação Server é necessário configurar o componente TSqlConnection para a conexão DataSnap em questão. Execute a aplicação Server.exe, clique no botão de Start Server para inicializar o servidor DataSnap e depois disso com gere as classes DataSnap Cliente para a sua aplicação cliente (proxy de comunicação entre aplicação cliente e servidor DataSnap).


Figura 6: Aplicação Cliente.

Depois, implemente os métodos do botão Inserir e getAll conforme Listagens 8 e 9.

Listagem 8: Unit2.pas – onClick do botão btnInserir.

procedure TForm2.btnInserirClick(Sender: TObject); Var aluno:TAluno; begin aluno := TAluno.Create(); aluno.Matricula := edMatricula.Text; aluno.Nome := edNome.Text; aluno.Endereco := edEndereco.Text; aluno.Telefone := edTelefone.Text; aluno.CPF := edCPF.Text; try //cria a conexão com a classe cliente serverClasses := TServerMethods1Client.Create(SERVERCONEXAO.DBXConnection); //insere o aluno if serverClasses.Insert(aluno) then begin ShowMessage('Aluno inserido!'); end else begin ShowMessage('Aluno não inserido!') end; finally serverClasses.Free; end; end;

Listagem 9: Unit2.pas – onClick do botão btnGetAll.

procedure TForm2.btnGetAllClick(Sender: TObject); begin try //cria a conexão com a classe cliente serverClasses := TServerMethods1Client.Create(SERVERCONEXAO.DBXConnection); //busca os alunos ClientDataSet1.Close; DataSetProvider1.DataSet := serverClasses.GetAll; ClientDataSet1.Open; finally serverClasses.Free; end; end;

Conclusão

Conclui-se portanto que é possível integrar à arquitetura DataSnap o seu framework de persistência deixando tudo isso disponível a uma arquitetura multicamadas que serve a diferentes tipos de aplicações clientes.

Referências Bibliográficas

Ebook exclusivo
Dê um upgrade no início da sua jornada. Crie sua conta grátis e baixe o e-book

Artigos relacionados