Desculpem, creio que me equivoquei em dizer que o repository fica independente do dominio. Ele faz parte do dominio. Qdo desenvolvo o dominio, eu tbm crio os repositorios.
Mas ainda entendo que ele é independente da persistencia. Vou tentar demonstrar:
public interface RepositorioInterface<T> () {
public void adicionar(T objeto);
public void remover(T objeto);
public List<T> listarTodos();
}
Um factory Interface para definir os repositorios mais especificos:
public interface RepositorioFactoryInterface {
public void beginTransaction();
public void commit();
public void flushAndClear();
public void rollback();
public void close();
public ArquivoRepositorioInterface getArquivoRepositorio(); // aqui é definido o método para retornar um ArquivoRepositorio
}
Um repositorio interface mais especifico, que extende o RepositorioInterface:
public interface ArquivoRepositorioInterface extends RepositorioInterface<Arquivo> {
public List<Arquivo> getArquivosDestaque();
}
Até agora, minhas interfaces de repositorio foram independentes da persistencia.
A partir de agora, a implementação do Dao (infra-estrutura para persistência):
public class ArquivoRepositorioDao extends Dao<Arquivo> implements ArquivoRepositorioInterface {
public ArquivoRepositorioDao(EntityManager em, RepositorioFactoryInterface factory) {
super(em, Arquivo.class, factory);
}
public List<Arquivo> getArquivosDestaque() {
// queries para retornar o desejado
}
Neste caso estou utilizando a persistencia com JPA. Meu DaoFactory é implementado da seguinte forma:
public class DaoFactory implements RepositorioFactoryInterface {
protected final EntityManager em;
private EntityTransaction transaction;
public DaoFactory() {
em = JPAUtil.getEntityManager();
}
public void beginTransaction() {
this.transaction = em.getTransaction();
this.transaction.begin();
}
// demais metodos a serem implementados da interface
}
Na aplicação o objeto do tipo RepositorioFactoryInterface faz os trabalhos de persistência:
RepositorioFactoryInterface factory = new DaoFactory();
List<Arquivo> arquivos = factory.getArquivoRepositorio().getArquivosDestaque();
Não sei se ficou claro, mas eu entendo que mesmo que eu altere minha forma de persistência (no caso, trocar o JPA por qq outra coisa), não afeta as lógicas de persistência no repositório (eu só alteraria meu Dao).