Explicação passo a passo do padrão de repositório [fechado]

276

Alguém pode me explicar o Padrão do Repositório no .NET, passo a passo, dando um exemplo ou demonstração muito simples.

Sei que essa é uma pergunta muito comum, mas até agora não encontrei uma resposta satisfatória.

Sa Patil
fonte

Respostas:

199

Como um resumo, eu descreveria o impacto mais amplo do padrão do repositório. Ele permite que todo o seu código use objetos sem precisar saber como os objetos são persistidos. Todo o conhecimento de persistência, incluindo o mapeamento de tabelas para objetos, está contido com segurança no repositório.

Muitas vezes, você encontra consultas SQL espalhadas na base de código e, quando adiciona uma coluna a uma tabela, precisa pesquisar arquivos de código para tentar encontrar os usos de uma tabela. O impacto da mudança é abrangente.

Com o padrão do repositório, você precisaria alterar apenas um objeto e um repositório. O impacto é muito pequeno.

Talvez ajude a pensar por que você usaria o padrão de repositório. Aqui estão alguns motivos:

  • Você tem um único local para fazer alterações no seu acesso a dados

  • Você tem um único local responsável por um conjunto de tabelas (geralmente)

  • É fácil substituir um repositório por uma implementação falsa para teste - assim você não precisa ter um banco de dados disponível para seus testes de unidade

Também existem outros benefícios, por exemplo, se você estava usando o MySQL e queria mudar para o SQL Server - mas eu nunca vi isso na prática!

Fenton
fonte
28
RE mudando de dbms a para b, vou registrar que não apenas vi isso, mas fiz isso no código de produção. Anteriormente, estávamos usando o Oracle, tivemos que mudar de provedor de hospedagem, resolvidos no Azure (antes do suporte ao Oracle), então tivemos que converter para o SQL Azure. Infelizmente, não tínhamos separado toda a lógica de acesso a dados naquele momento, mas certamente fizemos isso como fizemos nessa migração (e daqui para frente, devo acrescentar).
13133 Joe
5
Sei que este comentário é antigo e fechado como fora de tópico, mas já vi isso em várias empresas. Normalmente, faz parte de um processo avançar ou afastar-se de um ORM. O repositório facilita a troca, principalmente se você os carrega de um padrão abstrato de fábrica ou usando um contêiner de IoC.
Derek Van Cuyk
Na verdade, o repositório usa o DAO para suas operações relacionadas à fonte de dados ...
Yousha Aleayoub
1
@YoushaAleayoub que um bom ponto você levanta. Você normalmente encontrará objetos de acesso a dados quando as pessoas estão tentando "separar o banco de dados" e repositórios quando as pessoas estão tentando "tornar uma única coisa responsável pela consulta". Em quase todos os casos, você encontrará os dois juntos. A parte DAO é o IConnection, ICommand, etc parte que os couros do tipo de base de dados. O repositório geralmente é mais centrado no domínio.
Fenton
181

Este é um bom exemplo: O Exemplo de Padrão de Repositório em C #

Basicamente, o repositório oculta os detalhes de como exatamente os dados estão sendo buscados / persistidos do / para o banco de dados. Debaixo das cobertas:

  • para leitura, ele cria a consulta que atende aos critérios fornecidos e retorna o conjunto de resultados
  • para escrever, emite os comandos necessários para fazer com que o mecanismo de persistência subjacente (por exemplo, um banco de dados SQL) salve os dados
duas flores
fonte
13
Este exemplo é a melhor explicação de todos os tempos, simplesmente melhor do que a documentação do MSDN.
Teoman shipahi
2
Achei isso muito bom. Ele também fornece explicação decente na Unidade de Trabalho, que parece ser forma mais genérica do padrão de dados sobre o padrão de repositório
Celdor
8
O exemplo vinculado é uma falha no padrão do repositório. Não oferece nenhuma vantagem em comparação ao uso das interfaces fornecidas pelo Entity Framework ( IDbContext) ou no nhibernate ( ISession) diretamente. Um repositório implementado corretamente abstrai TODAS as informações específicas sobre persistência (como o atual provedor Linq To Sql funciona). ou seja, nunca exponha IQueryable.
jgauffin
3
@jgauffin IQueryablenão é uma informação específica de persistência. O apoio do IQueryable pode ser tão simples quanto uma matriz codificada, ou pode ser de um arquivo XML, serviço web, banco de dados, arquivo simples etc. Não recomendo um repositório que não exponha o IQueryable como sempre leva ao acesso lento aos dados em todos os casos, onde a exposição ao IQueryable permitirá que algumas instâncias realizem aprimoramentos de desempenho, quando aplicável, se o armazenamento de persistência tiver esse recurso. Além disso, se escondendo DbContext permite mudar para um ORM diferente em caso de necessidade (ou não ORM!)
Robert McKee
5
Ele vaza informações específicas sobre persistência. Tente usar o carregamento ansioso / lento ou criar uma INcláusula sql sem saber como o provedor LinqToSql específico faz isso.
jgauffin