Row Data Gateway


    Row Data Gateway é um design pattern que utiliza um objeto que representa exatamente uma linha de registro do banco de dados em memória. A estrutura dessa entidadade é exatamente igual a estrutura física da tabela de modelo relacional. O gateway torna-se uma interface entre a apliacação e o registro, encapsulando a programação de acesso ao banco de dados. A sua implementação e consumo pode ser realizado de diversas maneiras, considerando o modelo utilizado em sua aplicação para organizar as layers e suas responsabilidades.
    O importante é termos em mente que, algum método será responsável em retornar um objeto Gateway ou uma coleção do mesmo. A semelhança entre o padrão Gateway e o Active Record é grande, o ponto crucial entre eles é que o Gateway é 100% algoritmo de persistência do registro e 0% de regra de negócio. A implementação pode parecer tediosa, mas é uma maneira elegante de separar acesso ao banco de dados da regra de negócio e possível de ser gerado automaticamente através de Object-Relational Mapper. Exemplo:

Classe Gateway

public class GatewayPessoaFisica {

   public int? Id { get; set; }
   public string Nome { get; set; }
   public string SobreNome { get; set; }
   public DateTime? DataNascimento { get; set; }

   private const string INSERT = @"INSERT INTO TB_PF_FISICA 
                                     (NOME, SOBRENOME, DT_NASC)
                                   VALUES 
                                     (@NOME, @SOBRENOME, @NASC)";

   private const string UPDATE = @"UPDATE TB_PF_FISICA 
                                    SET NOME = @NOME, 
                                    SOBRENOME = @SOBRENOME,
                                    DT_NASC = @NASC
                                   WHERE ID = @ID";

   private const string DELETE = @"DELETE TB_PF_FISICA WHERE ID = @ID";

   public void Insert() {
        // Consumo direto do ADO.NET ou algum wrapper do mesmo.
   }

   public void Update() {
        // Consumo direto do ADO.NET ou algum wrapper do mesmo.
   }

   public void Delete() {
       // Consumo direto do ADO.NET ou algum wrapper do mesmo.
   }

   public void Load(DataReader rs) {
          ...
          Id = Convert.ToInt(rs["ID"]);
          Nome = Convert.ToString(rs["NOME"]); 
          SobreNome = Convert.ToString(rs["SOBRENOME"]); 
          DataNascimento = Convert.ToDateTime(rs["DT_NASC"]); 
          ...
   }
    
   ...

Classe SearchPessoaFisica

public class SearchPessoaFisica {

   private string SELECT = @"SELECT
                                 ID,
                                 NOME, 
                                 SOBRENOME,
                                 DT_NASC
                              TB_PF_FISICA 
                              WHERE ID = @ID";

   public static GatewayPessoaFisica GetPessoaFisica(int id) {
             
          GatewayPessoaFisica gateway = new GatewayPessoaFisica();
          // Consumo direto do ADO.NET ou algum wrapper do mesmo.
          return gateway.Load(dataReader);

   }

}


Leave a comment