Henrique Mota Esteves:
(…)
public class Person {
public List dependents() {
Repository repository = Registry.personRepository();
Criteria criteria = new Criteria();
criteria.equal(Person.BENEFACTOR, this);
return repository.matching(criteria);
}
}
A minha visão para o problema ao qual estou tentando resolver está certa ou errada?
Esse código funciona. Então, se entendi direito, o seu problema é como implementar o Registry.personRepository() ?
public final class Registry {
private Registry(){}
public static Repository personRepository(){
// codigo aqui
}
}
Agora, existem muitas estratégias para preencher aquele codigo ali.
Poderia ser assim:
public final class Registry {
private Registry(){}
final private Map repositories = new HashMap();
public static void registerRepository(Class classe, Repository rep){
repositories.put(classe,rep);
}
public static Repository domainRepository(Class classe){
return (Repository)repositories.get(classe);
}
}
public class Person {
public List dependents() {
Repository repository = Registry.domainRepository(Person.class);
Criteria criteria = new Criteria();
criteria.equal(Person.BENEFACTOR, this);
return repository.matching(criteria);
}
}
- Registry tem um só método domainRepository e não N métodos 1 para cada tipo de entidade.
- A implementação de Registry é muito simples
A única coisa a fazer é vc ter um codigo de bootstrap que iniciliza o registro com os repositorios certos. Vc pode obter os repositorios de uma fábrica , se for o caso.
Mas tb podia ser assim:
public class Person {
public List dependents() {
Criteria criteria = new Criteria();
criteria.equal(Person.BENEFACTOR, this);
return Repository.matching(Person.class, criteria);
}
}
public final class Repository{
private Repository(){}
final private Map repositories = new HashMap();
public static <T> List<T> matching(Class<T> classe ,Criteria criteria){
return ((Repository)repositories.get(classe)).matching(criteria);
}
}
[size=8]Editado:O retorno é uma lista de T e não um so T[/size]
Em que Repository atua como Register também. Não sei se a sua duvida ficou esclarecida…