Estou desenvolvendo um projeto core que será utilizado em vários outros projetos. Será gerado um .jar dele etc…
Este core, deve prover a base para persistência, e ainda alguns modelos de domínio que são comuns a todas aplicações que vão utilizar ele.
Vou tratar aqui da básica: Cadastro de Pessoa.
Atualmente estou trabalhando com as seguintes “camadas” e classes:
No core:
1 - DAO: Contém a classe AbstractHibernateDAO onde é feito todas as operações que serão usadas pelos Repository.
2 - Repository: Contém a classe AbstractRepository com os cruds extendendo de AbstractHibernateDAO, e no caso PessoaRepositroy que obviamente extende AbstractRepository, em PessoaRepository contém por exemplo o método buscarPessoasPorMunicipio(Municipio municipio).
3 - Model : contém as Entity por exemplo Pessoa, Endereco, Municipio. (estes models atualmente estão servindo apenas para mapeamento O/R “anêmicos”)
4 - Service: classe PessoaService, básicamente só faz chamadas aos Repository. (sim não faz sentido ter, preciso mudar isso, minha intenção era que os outros projetos não acessem os Repository diretamente)
Nos projetos que usam o core:
Projeto desktop1:
1 - Models : seus models específicos,
2 - Repository : Implementação do AbstractRepository para seus models.
3 - Presenter: recebe o PessoaService (gostaria de usar eventos do cdi), e trabalha com ele entre a view. Manipula diretamente o model Pessoa. (gostaria de trabalhar com DTO e Wrapper)
Projeto Web1:
1 - Models : seus models específicos,
2 - Repository : Implementação do AbstractRepository para seus models.
3 - Controller: recebe o PessoaService (gostaria de usar eventos do cdi), e trabalha com ele entre a view. Manipula diretamente o model Pessoa. (gostaria de trabalhar com DTO e Wrapper)
Alguém consegue indicar um caminho para seguir com as alterações?
Segue as Classes Envolvidas:
core.model
class Pessoa{
//estou omitindo os mapeamentos O/R
Long id;
String nome;
//estes enderecos estão sendo inseridos ou atualizados por CASCADE, tenho que mudar isso principalmente no Update
List<Endereco> enderecos;
//getters e setters
// TODO enriquecer esta entity para evitar o modelo Anêmico
}
class Endereco{
//estou omitindo os mapeamentos O/R
Long id;
Pessoa pessoa;
Municipio municipio;
String bairro;
String rua;
//getters e setters
// TODO enriquecer esta entity para evitar o modelo Anêmico
}
class Municipio{
//estou omitindo os mapeamentos O/R
Long id;
String descricao;
//getters e setters
// TODO enriquecer esta entity para evitar o modelo Anêmico talvez aqui não tenha o que fazer
}
Repository
class PessoaRepository extends AbstractRepository<Pessoa, Long>{
//métodos crud basicos estão na classe AbstractRepository
public List<Pessoa> buscarPessoasPorMunicipio(Muncipio municpio){
List<Pessoa> list = null;
//query omitida
return list;
}
}
class EnderecoRepository extends AbstractRepository<Endereco, Long>{
//métodos crud basicos estão na classe AbstractRepository
// não tem nada específico, talvez Implementação desnecessária?
}
//esta classe se justifica para isolar os projetos core entre desktop1 e web1?
class PessoaSerivce{
@Inject
PessoaRepository repository;
// aqui talvez devesse receber um DTO Válido
public cadastrar(Pessoa pessoa){
try{
repository.gravar(pessoa);
} catch (Exception e){
throw new ExcessaoAoGravar(e);
}
}
}
Projeto Web1
Controller
class PessoaController{
@Inject PessoaService service;
@Get("/pessoa")
public void form(){
}
@Consumes(value = { "application/json", "application/x-www-form-urlencoded" })
@Post("/pessoa")
//preciso trocar pra DTO pois pode vir por json e isso pode ser um problema pois por ex. usa Reflection para deserializar
public void gravar(Pessoa pessoa){
//preciso validar
service.gravar(pessoa);
}
}