Instanciação de DAOs

4 respostas
spinow

O que acham disso? Sejam sinceros. E pacientes (não sou experiente, tô afim de aprender, e tem gente que costuma socar a coisa hehehe…) :wink:

@Entity
public class Usuario {

        public static final String QUERY_FIND_BY_DOCUMENTO = "from Usuario as USU where USU.documento = ?";
	
      //atributos...


	//getters & setters...
		
	public boolean notInvalid(){
		return (this != null && (!StringUtil.isNullOrEmpty(this.getMatricula())));
	}
	
	public static Usuario apresentarCredenciais(String strDocumento, String strSenha) {
		return ControladorDeAcesso.validarCredenciais(strDocumento, strSenha);
	}
	
}
public abstract class ControladorDeAcesso {
    
    private static final IRepository objRepositoryUsuario = new Repository(Usuario.class);
    
    /**
     * Caso as credenciais forem autenticadas, retorna-se o objeto Usuario.
     * @param strDocumento
     * @param strSenha
     * @return Usuario
     */
    public static Usuario validarCredenciais(final String strDocumento, final String strSenha) {
        
        final Object[] objParameter = { strDocumento };
        
        try {
            final Usuario objUser = (Usuario) ControladorDeAcesso.objRepositoryUsuario.executeQuerySingle(Usuario.QUERY_FIND_BY_DOCUMENTO, objParameter);
            if( ((objUser != null) && !objUser.isBloqueado())){
            	if(!StringUtil.isNullOrEmpty(objUser.getSenha())){
            		return (objUser.getSenha().equals(strSenha)) ? objUser : null;
            	}
            	return (objUser.getMatricula().equals(strSenha)) ? objUser : null;
            }
            
        }
        catch (final Exception e) {
            e.printStackTrace();
        }
        
        return null;
    }
public String logar(){
 		
 		String strDocumento = input.getString("txtDocumento");
 		String strSenha = input.getString("txtSenha");
 		
 		Usuario objUsuario = Usuario.apresentarCredenciais(strDocumento,strSenha);
 		
 		return objUsuario.notInvalid() ? SUCCESS : ERROR;
 		
 	}

Eu poderia ter (claro que poderia, mas digo, é correto?) o procedimento existente no ControladorDeAcesso, diretamente no Usuario? Digo, posso instanciar um DAO diretamente no Usuario?

4 Respostas

B

Na minha opinião não, e ainda acho que o método apresentarCredenciais(String strDocumento, String strSenha) não deveria estar no Usuario, nem aquela query.

tnaires
Vamos discutir a alternativa abaixo.
public interface UsuarioRepository {
    Usuario obterUsuario(String documento);
}

public class Usuario {
    // Injetando a implementação do repositório
    private UsuarioRepository usuarioRepository;

    // Atributos e métodos

    public static Usuario efetuarLogin(String documento, String senha) throws LoginException {
        Usuario u = usuarioRepository.obterUsuario(documento);

        if (u == null) {
            throw new LoginException("Usuário não encontrado.");
        }

        if (senha.equals(u.getSenha()) {
            throw new LoginException("Usuário ou senha inválidos.");
        }

        return u;
    }
}
E pra usar no seu action:
public String logar() {
    String documento = input.getString("txtDocumento");
    String senha = input.getString("txtSenha");

    try {
        Usuario u = Usuario.efetuarLogin(documento, senha);
        return SUCCESS;
    } catch (LoginException e) {
        // Faça um tratamento melhor para esta exceção.
        return ERROR;
    }
}
Se não quiser manter o método na classe Usuario, pode criar um service que faça isso, uma classe LoginService por exemplo.
spinow

Boa Tarso!
Uma pergunta,

public interface UsuarioRepository {  
    Usuario obterUsuario(String documento);  
}

A implementação do UsuarioRepository seria um DAO?:
EXEMPLO:

public Usuario obterUsuario(String documento) {
		try {
			EntityManager entityManager = HibernateFactory.getEntityManager();
			Usuario instance = (Usuario) entityManager.find(Usuario.class, documento);
			entityManager.close();
			return instance;
		} catch (WhateverExceptionMFExample e) { // motivo da edição: ISTO É UM EXEMPLO INÚTIL...
			//DoWhateverHere;
		}
	}

abraço!

B

Não contribuindo com nada, mas:

} catch (RuntimeException re) { throw re; } WTF?

Criado 6 de agosto de 2009
Ultima resposta 7 de ago. de 2009
Respostas 4
Participantes 4