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].

 Arquitetura DataSnap

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: Estrutura de pastas do exemplo

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.

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

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.

DataServer Modulo - ServerModBaseDados.pas.

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).

Aplicação Cliente.

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