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 entidades

Contras:

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 aninhada

Soluçã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 é menor

Contras:

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 trabalho

Contras:

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!

questionAnswers(4)

yourAnswerToTheQuestion