Pessoal, bom dia!
Com base nesse tópico: http://www.guj.com.br/posts/list/90694.java , resolvi dar as caras e mostrar um protótipo de arquitetura (baseada em DDD) para ser criticada (sugestões são bem vindas) por vocês e assim todos nós tiramos proveito!
Segue:
Possuo um POJO que recebe um repositório no seu constructor:
[code]
package com.site.domain.model.entity;
import java.io.Serializable;
import com.site.domain.model.repository.UsuarioRepository;
public class Usuario extends Pessoa implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
private String login;
private String password;
private boolean isAdministrator;
//transient
private UsuarioRepository repository;
public Usuario(UsuarioRepository repository) {
this.repository = repository;
}
//behaviour
public List listarMensagensEnviadasPorPeriodo(Date start, Date end) {
return repository.listarMensagensEnviadasPorPeriodo(start, end);
}
/*
Aqui por ex, eu poderia ter outros comportamentos, por ex:
public List listarHistoricosDeLogin() { }
public List listarLogsDeAcesso();
etc. Entre outros comportamentos referentes ao USUÁRIO, os quais o repositório se encarregaria de resolver.
*/
public String getLogin() {
return login;
}
public void setLogin(String login) {
this.login = login;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public boolean isAdministrator() {
return isAdministrator;
}
public void setAdministrator(boolean isAdministrator) {
this.isAdministrator = isAdministrator;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
}[/code]
Uma interface representando um “repositório genérico”
[code]package com.site.domain.model.repository;
import java.io.Serializable;
import java.util.List;
public interface Repository<T, ID extends Serializable> {
T get(ID id);
List getAll();
T add(T bean);
void remove(T bean);
}[/code]
A interface em sí do “repositório do usuário”:
[code]package com.site.domain.model.repository;
import com.site.domain.model.entity.Usuario;
public interface UsuarioRepository extends Repository<Usuario, Long> {
public List listarMensagensEnviadasPorPeriodo(Date start, Date end);
}[/code]
O DAO, veja que não implementei ainda o tratamento da persistência, mas fique a vontade para criar uma outra interface genérica para acesso aos dados o qual o DAO TAMBÉM poderia estar implementando em conjunto com a interface do repositório. Que tal um EntityManager aí ?
[code]package com.site.domain.persistence.dao;
import java.util.List;
import com.site.domain.model.entity.Usuario;
import com.site.domain.model.repository.UsuarioRepository;
public class UsuarioDAO implements UsuarioRepository {
public List<Mensagem> listarMensagensEnviadasPorPeriodo(Date start, Date end) {
return null;
}
public Usuario add(Usuario bean) {
// TODO Auto-generated method stub
return null;
}
public Usuario get(Long id) {
// TODO Auto-generated method stub
return null;
}
public List<Usuario> getAll() {
// TODO Auto-generated method stub
return null;
}
public void remove(Usuario bean) {
// TODO Auto-generated method stub
}
}[/code]
Os serviços, aí eu colocaria o Spring para gerenciar as transações e injetar os repositórios, uma interface para embrulhar os serviços tbm seria interessante, ah sim, e talvez um filtro (aop?) para criar os beanzinhos!
[code]package com.site.service;
import com.site.domain.model.entity.Usuario;
import com.site.domain.model.repository.UsuarioRepository;
import com.site.domain.persistence.dao.UsuarioDAO;
public class UsuarioService {
private UsuarioRepository usuarioRepository;
//spring transaction control
public void delete(Usuario usuario) {
usuarioRepository.remove(usuario);
}
public void save(Usuario usuario) {
usuarioRepository.add(usuario);
}
}[/code]
Bom, eras isso!
Editado: Modificações conforme sugestões. Remoção do “autenticar”, e inclusão de uma consulta para exemplo.