Galera em um tópico anterior me convenceram a usar Hibernate. :lol:
Eu tava na nóia de fazer tudo em JDBC, mas logo no começo do projeto vi que daria muito trabalho e a produtividade seria menor.
Bom, agora que ja desenvolvi algumas classes gostaria de pedir a opinião de vcs quanto ao código que estou desenvolvendo.
Opiniões de pessoas mais experientes em DDD, pra saber se estou errando em algum ponto.
Ai vai:
1 - Adicionando um Solicitação de Serviço (Uma OS - Ordem de Serviço em um sistema de chamados técnicos)
public class OSFacade {
public void adicionarOS() {
OS os = new OS(); //To pensando em mudar pra Factory
os.setData(Calendar.getInstance());
...
repositorioOS.adicionar(os);
}
}
Ao meu ver está do jeito correto tendo em vista que isso é uma operacao CRUD simples.
2 - Agora vou mostrar um exemplo de quando uma OS é aprovada, ela gera um Chamado de Assistencia Tecnica.
public class OSFacade {
public void aprovarOS(int idOS, int idUsuario) {
Usuario usuario = repositorioUsuario.getUsuario(idUsuario);
OS os = repositorioOS.getOS(idOS);
os.aprovar(usuario);
}
}
public class OS {
public void aprovar(Usuario usuario) {
if(valorOrcamento <= usuario.getValorMaxAprovacaoOrcamento()) {
this.status = APROVADA;
//Aqui eu preciso criar uma objeto ChamadoAssistenciaTecnica.
} else {
throw new UsuarioAprovarOSException("Usuário não pode aprovar pois ele so pode aprovar OS com valores abaixo de " + usuario.getValorMaxAprovacaoOrcamento());
}
}
}
A minha pergunta e dúvida aqui é: Eu criaria o objeto ChamadoAssistenciaTecnica e passaria pra um repositorio de ChamadoAssistenciaTecnica. Por exemplo:
public class OS {
public void aprovar(Usuario usuario) {
if(valorOrcamento <= usuario.getValorMaxAprovacaoOrcamento()) {
this.status = APROVADA;
ChamadoAssistenciaTecnica chamadoAssistenciaTecnica = new ChamadoAssistenciaTecnica(this);
repositorioChamadoAssistenciaTecnica.adicionar(chamadoAssistenciaTecnica);
} else {
throw new UsuarioAprovarOSException("Usuário não pode aprovar pois ele so pode aprovar OS com valores abaixo de " + usuario.getValorMaxAprovacaoOrcamento());
}
}
}
Isto está correto?
3 - Outra dúvida, corrijam-me se estiver errado
Meus repositório no domínio são Interfaces, na camada de infra eu as implemento em classes concretas utilizando Hibernate e as injeto quando vou criar minha Entidades ou Services do DDD.
Está correto? Minha interfaces não estão apenas sendo criadas para evitar a depedência da Camada de Dominio da Camada de Infra?
public interface RepositorioUsuario {
void adicionar(Usuario usuario);
}
public class RepositorioUsuarioImpl implements RepositorioUsuario {
public void adicionar(Usuario usuario) {
...
//Instancio Session do Hibernate
session.save(usuario);
}
}
//Injetando no Service que Gerencia Usuarios - Código da minha camada de Aplicacao
GerenciadorUsuario gerenciadorUsuario = new GerenciadorUsuario();
gerenciadorUsuario.setRepositorio(new RepositorioUsuarioImpl());
Galera sei que são muitas dúvidas, porém eu só quero ter certeza que estou fazendo as coisas no caminho certo.
Sei q nao existe um caminho completamente certo, mas quero que esteja o mais próximo do DDD possível.
Obrigado a todos