Sobre o Repository Pattern
Visão geral
O Repository Pattern é um padrão de projeto cujo objetivo é abstrair o acesso a dados, criando uma separação clara entre o domínio da aplicação e os mecanismos de persistência.
Ele define contratos que representam coleções de objetos do domínio, permitindo que a aplicação leia e grave dados sem conhecer detalhes de infraestrutura.
O padrão não depende de banco de dados, ORM ou tecnologia específica. Pode ser aplicado a qualquer forma de acesso a dados externos, como:
bancos relacionais ou não relacionais
arquivos
APIs
serviços externos
filas
caches
O valor do padrão está no isolamento: o domínio expressa regras e intenções; a infraestrutura cuida dos detalhes técnicos.
Origem e motivação
O Repository Pattern surgiu para resolver um problema clássico: código de negócio acoplado diretamente à persistência, como:
SQL explícito
estrutura física de banco
APIs específicas de acesso a dados
Esse acoplamento tornava o sistema difícil de evoluir, testar e manter. Qualquer mudança na persistência se espalhava pela aplicação.
A premissa é simples e continua atual:
O domínio deve depender de abstrações, não de infraestrutura.
ORMs facilitaram acesso a dados, mas não resolvem o problema arquitetural.
O que é um Repository
Um repositório representa uma coleção orientada ao domínio. Ele:
expõe operações de leitura e gravação
trabalha com entidades e agregados
oculta completamente a origem dos dados
O domínio não sabe:
de onde os dados vêm
se existe SQL
se há ORM
se existe cache
se há serviços externos
Ele conhece apenas o contrato.
O que o Repository Pattern não é
É essencial separar conceito de implementação:
não é ORM
não é Entity Framework
não é DbSet
não é CRUD automático
não é obrigação arquitetural
O Repository Pattern é uma ferramenta arquitetural, não um dogma.
Repository Pattern e domínio
No modelo clássico, as interfaces de repositório pertencem ao domínio ou à camada de aplicação, nunca à infraestrutura.
Isso garante que:
o domínio não dependa de tecnologia
a persistência possa ser trocada
o código de negócio seja testável isoladamente
O princípio é simples: o domínio define o que precisa, não como será feito.
Implementações concretas
As implementações dos repositórios vivem na infraestrutura. É ali que entram:
bancos de dados
ORMs
providers específicos
mecanismos externos de persistência
Uma implementação pode usar:
Entity Framework + SQL Server
Dapper
acesso direto a arquivos
chamadas HTTP
Para o domínio, isso é irrelevante.
Repository Pattern e ORMs
ORMs resolvem problemas técnicos:
mapeamento
queries
transações
Repositories resolvem problemas arquiteturais:
dependência
acoplamento
clareza de intenção
Um ORM pode existir dentro do repositório. O contrato do domínio nunca deve ser definido pelo ORM.
Se abstrações de persistência vazam para o domínio, o padrão foi quebrado.
Repositório genérico vs repositório específico
O uso de repositórios genéricos (IRepository<T>) é uma armadilha comum.
Na prática, eles tendem a:
esconder a intenção do domínio
incentivar CRUD sem significado
virar apenas um proxy do ORM
Repositórios orientados a agregados e casos reais do domínio produzem sistemas mais claros, previsíveis e sustentáveis.
Relação com Unit of Work
Muitos ORMs já implementam Unit of Work implicitamente.
Duplicar esse conceito costuma gerar:
sobreposição
complexidade desnecessária
A separação conceitual é clara:
Repository → acesso aos dados
Unit of Work → consistência transacional
Nem sempre ambos precisam ser explícitos.
Benefícios
Quando bem aplicado, o Repository Pattern oferece:
isolamento entre domínio e infraestrutura
facilidade de testes
menor acoplamento tecnológico
maior clareza de intenção
melhor evolução do sistema ao longo do tempo
Limitações e cuidados
O padrão não é universal. Em sistemas simples, pode:
adicionar camadas desnecessárias
aumentar o volume de código
dificultar a navegação
Repositórios mal desenhados podem:
virar serviços gordos
duplicar regras de negócio
mascarar problemas de modelagem
Ele resolve um problema específico: dependência da persistência.
Quando usar
Use quando:
existe domínio relevante
há regras de negócio claras
a persistência pode mudar
testes isolados são importantes
Quando evitar
Evite quando:
a aplicação é puramente CRUD
não há domínio real
a persistência é trivial
a complexidade não se justifica
O erro clássico (e muito comum)
Expor ORM no contrato do domínio:
Isso não é Repository Pattern. É o Entity Framework vazando para o domínio.
Consequências:
o
DbSetvira o repositórioo domínio passa a depender do EF
trocar a persistência vira trauma
Esse é exatamente o problema que o padrão nasceu para resolver.
Forma clássica (e correta)
Interface no domínio
Implementação na infraestrutura
Aqui:
EF é detalhe
SQL Server é detalhe
o domínio permanece intacto
Conclusão
O Repository Pattern é um padrão clássico, criado para resolver um problema real — e continua relevante quando aplicado com critério.
Ele não compete com ORMs modernos nem substitui boas decisões de design. Seu valor está na clareza de responsabilidades e na proteção do domínio contra detalhes transitórios de tecnologia.
Arquitetura sólida não segue moda. Ela respeita fundamentos.
Arquitetura sólida não segue moda. Ela respeita fundamentos — e o Repository Pattern é um deles, quando usado pelo motivo certo.
Atualizado