Como converter corretamente entidades de domínio em DTOs, considerando a escalabilidade e a testabilidade
Eu li vários artigos e postagens do Stackoverflow para converter objetos de domínio em DTOs e os experimentei no meu código. Quando se trata de testes e escalabilidade, estou sempre enfrentando alguns problemas. Conheço as três soluções possíveis a seguir para converter objetos de domínio em DTOs. Na maioria das vezes eu estou usando o Spring.
Solução 1: método privado na camada de serviço para converter
A primeira solução possível é criar um pequeno método "auxiliar" no código da camada de serviço que converte o objeto de banco de dados recuperado em meu objeto DTO.
@Service
public MyEntityService {
public SomeDto getEntityById(Long id){
SomeEntity dbResult = someDao.findById(id);
SomeDto dtoResult = convert(dbResult);
// ... more logic happens
return dtoResult;
}
public SomeDto convert(SomeEntity entity){
//... Object creation and using getter/setter for converting
}
}
Prós:
fácil de implementarnenhuma classe adicional para conversão necessária -> projeto não explode com entidadesContras:
problemas ao testar, comonew SomeEntity()
é usado no método privado e, se o objeto estiver profundamente aninhado, tenho que fornecer um resultado adequado do meuwhen(someDao.findById(id)).thenReturn(alsoDeeplyNestedObject)
evitar NullPointers se a conversão também estiver dissolvendo a estrutura aninhadaSolução 2: construtor adicional no DTO para converter a entidade do domínio em DTO
Minha segunda solução seria adicionar um construtor adicional à minha entidade DTO para converter o objeto no construtor.
public class SomeDto {
// ... some attributes
public SomeDto(SomeEntity entity) {
this.attribute = entity.getAttribute();
// ... nesting convertion & convertion of lists and arrays
}
}
Prós:
nenhuma classe adicional para a conversão necessáriaconversão oculta na entidade DTO -> código de serviço é menorContras:
uso denew SomeDto()
no código de serviço e, portanto, eu tenho que fornecer a estrutura correta de objetos aninhados como resultado da minhasomeDao
zombando.Solução 3: Usando o Spring's Converter ou qualquer outro Bean externalizado para essa conversão
Se viu recentemente que o Spring está oferecendo uma classe por motivos de conversão:Converter<S, T>
mas essa solução representa todas as classes externalizadas que estão fazendo a conversão. Com esta solução, estou injetando o conversor no meu código de serviço e o chamo quando quero converter a entidade do domínio no meu DTO.
Prós:
fácil de testar, pois posso zombar do resultado durante o meu caso de testeseparação de tarefas -> uma turma dedicada está fazendo o trabalhoContras:
não "escala" tanto quanto meu modelo de domínio cresce. Com muitas entidades, tenho que criar dois conversores para cada nova entidade (-> converter entidades de DTO e entidades em DTO)Você tem mais soluções para o meu problema e como você lida com isso? Você cria um novo conversor para cada novo objeto de domínio e pode "viver" com a quantidade de classes no projeto?
Desde já, obrigado!