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);
}
}