garcia-jj:
Em todas as minhas aplicações tento abstrair os repositórios com interface + implementação. Por exemplo, tenho uma interface UserRepository e uma implementação JpaUserRepository. Assim uso na minha camada de negócio apenas a UserRepository.
Dessa forma eu posso futuramente matar a classe JpaUserRepository e usar uma LdapUserRepository e a camada de negócio nada muda. Além do mais usando essa idéia eu somente pelo nome já sei se tal classe usa JPA, LDAP ou qualquer outra coisa…
O que vocês tem usado para os repositórios? Há realmente um ganho quando a essa abstração ou estou fazendo algo desnecessário? Obviamente sempre me pareceu uma boa idéia, porém meu projeto cresceu tanto que penso se vale a pena escrever o dobro de classes para os repositórios.
A sua ideia está correta em essência, mas tecnicamente isso ai não são repositorios.
A diferença é que o repositorio depende apenas do dominio. Então o seu UserRepository é um repositorio mesmo. O nome do repositorio é construido como [NomeDaEntidade]Repository. O JpaUserRepository e o LdapUserRepository são estratégias para o repositorio. eles poderiam-se chamar JpaStrategyUserRepository. A diferença é que o nome deles é montado com o nome da tecnologia. Ou seja, algo que não é do dominio.
Se vc faz JpaUserRepository herdar/implementar UserRepository vc não está usando o padrão Repositorio como deve ser. Vc está usando Strategy na realidade (“uma interface várias estratégias de acesso”). Vc precisa que a estratégia seja plugável no repositorio. Desta forma vc usa sempre o mesmo objeto, e pode mudar a estratégia depois, sem usar herança. Ou seja, vc sempre injeta UserRepository onde precisar, e injeta a estratégia de acesso no repositorio ao inves de injetar a estratégia diretamente onde é usada.
É por isso que sempre digo que repositorios não são interfaces.