Usando o padrão Repository, é adequado retornar um IQueryable de um conjunto de dados (tabela) para uso genérico?
É muito útil em muitos casos, especialmente ao usar bibliotecas externas que utilizam essa interface, por exemplo, alguns plugins que classificam / filtram e se ligam a elementos da interface do usuário.
No entanto, expor um IQueryable às vezes parece deixar o design propenso a erros. Isso, associado a um uso incorreto de carregamento lento, pode levar a graves ocorrências de desempenho.
Por outro lado, ter métodos de acesso para cada uso parece redundante e também muito trabalhoso (considerando testes de unidade, etc.).
design-patterns
programming-practices
orm
patterns-and-practices
Mihalis Bagos
fonte
fonte
new DbContext()
sempre que precisam e ligamSaveChanges()
quando querem. Não é possível testar nada e a única coisa que consigo pensar é em uma camada adicional ocultando-a.Respostas:
Mark Seemann tem um excelente post sobre este assunto: IQueryable is Tight Coupling . Ele resume bem na parte final (ênfase minha):
O ORM, como o Entity Framework, é uma implementação do padrão Repositório e Unidade de Trabalho. Não há necessidade de envolvê-los em outro.
fonte
new DbContext()
controlador e lógica complexa no método único no MVC e também não coloquem lógica nas visualizações? Eu tenho código legado em que não posso fazer nenhum teste de unidade. Para habilitar os testes e impedir que as pessoas façam códigos muito ruins, preciso de uma camada adicional. Portanto, preciso implementar meus próprios repositórios para fins educacionais.Não haverá consenso sobre este assunto. Na minha opinião e experiência, um Repositório deve retornar objetos com usos específicos. Pelo menos se você usar o Repository Pattern conforme definido por Eric Evens no DDD. Um repositório é uma "ponte" que conecta lógica de negócios, persistência e fábricas.
Se você deseja acessar a persistência mais diretamente, talvez esteja procurando o Padrão de Gateway.
No entanto, pelo que você diz aqui, você gostaria de ocultar a exposição à persistência para que o Padrão de Proxy seja útil para você.
fonte