Recentemente, li muitos argumentos contra o uso do padrão de repositório com ORMs poderosos, como o Entity Framework, pois ele incorpora funcionalidade semelhante a repositório, juntamente com a funcionalidade Unidade de Trabalho.
Outro argumento contra o uso do padrão para uma situação como teste de unidade é que o padrão do repositório é uma abstração com vazamento, pois as implementações mais genéricas utilizam o IQueryable.
Os argumentos contra o uso do padrão de repositório fazem sentido para mim, mas os métodos alternativos de abstração sugeridos são geralmente mais confusos e parecem tão exagerados quanto o problema.
A solução de Jimmy Bogards parece ser uma mistura de afastar as abstrações, mas também introduzir sua própria arquitetura. https://lostechies.com/jimmybogard/2012/10/08/favor-query-objects-over-repositories/
Outro exemplo de repositórios sendo desnecessariamente .... mas use minha arquitetura! http://blog.gauffin.org/2012/10/22/griffin-decoupled-the-queries/
Outro ... http://www.thereformedprogrammer.net/is-the-repository-pattern-useful-with-entity-framework
Não encontrei uma substituição ou alternativa clara à abordagem de padrão de repositório "excessivamente complexo" que não é mais arquitetada por si mesma.
fonte
Respostas:
Eu acho que você é repositórios conflitantes e repositórios genéricos.
Um repositório básico apenas interage com seu armazenamento de dados e fornece métodos para retornar os dados
Ele não vaza a camada de dados para o seu código por meio de um IQueryable ou de outras maneiras de passar em consultas aleatórias e fornece uma superfície testável e injetável bem definida de métodos.
Um repositório genérico permite que você passe sua consulta como um ORM
Concordo que não faz muito sentido usar um Repositório Genérico sobre um ORM, que é basicamente apenas outro Repositório Genérico.
A resposta é usar o padrão básico do repositório para ocultar seu ORM
fonte
A maioria dos argumentos mencionados incorretamente atribui aos recursos do padrão de repositório que ele não possui.
Conceitualmente, um Repositório, conforme definido originalmente no DDD, é apenas uma coleção de objetos que você pode pesquisar ou adicionar. O mecanismo de persistência por trás dele é abstraído; assim, como consumidor, você tem a ilusão de que é uma coleção na memória.
Uma implementação de Repositório que possui abstrações com vazamento (expor,
IQueryables
por exemplo) é uma implementação ruim de Repositório.Uma implementação de Repositório que expõe mais do que apenas operações de coleta (por exemplo, recursos da Unidade de Trabalho) é uma implementação ruim do Repositório.
Existem alternativas ao Repositório para acesso a dados? Sim, mas eles não estão relacionados aos problemas que você levanta na sua pergunta.
fonte
Para mim, os repositórios, combinados com o ORM ou outras camadas de persistência do banco de dados, têm estas desvantagens:
Tal como:
4. Objeto Perigo de Deus: você pode ser tentado a criar uma classe divina, cobrindo todo o seu modelo ou camada de acesso a dados. A classe de repositório não conteria apenas métodos Car, mas métodos para todas as entidades.
Na minha opinião, é melhor oferecer pelo menos algumas oportunidades de consulta, para evitar a enorme confusão de muitos métodos de uso único. Não importa se é LINQ, uma linguagem de consulta própria ou mesmo algo extraído diretamente do ORM (OK, tipo de problema de acoplamento ...).
fonte
Se o objetivo da interface do repositório é zombar do banco de dados para fazer um teste unittest (= teste isolado), a melhor abstração é algo fácil de zombar.
É difícil zombar de uma interface de repositório baseada em um resultado IQueryable.
Do ponto de vista do teste de unidade
pode ser ridicularizado facilmente
pode ser facilmente ridicularizado apenas se o mock ignorar o conteúdo do parâmetro de consulta.
não pode ser facilmente ridicularizado
fonte
Eu não acho que o padrão do repositório seja um exagero, se você usar funções lambda para consultar. Especialmente quando você precisa abstrair o ORM (na minha opinião você sempre deve), então eu não vou me importar com os detalhes de implementação do próprio repositório.
Por exemplo:
fonte