1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

Mapeamento dos dados de request para o domain model.

Olá pessoal como vocês fazem para mapear os dados do request do controller para o domain model.

Temos as situações em geral considere objetos maiores que o exemplo.

situacao1 - Podemos ter uma request que tem todos os parâmetros do account; {"id":"1";"name":"test","some":"xxx"} e os outros campos.

situacao2 - Podemos ter uma request que tem alguns parâmetros do account, por exemplo no caso de um update; {"id":"1";"name":"testUpdated"}

situacao3 - Podemos ter uma request que tem alguns parâmetros do account, como id mais tem outros como usuário junto; {"id":"1";"user":"xxx","service":"yyy"} nesse caso cada pedaço da request vai virar um objeto.

Exemplo de Dominio

public class Account {

    private Long id;
    private String name;
        private String some;
        private String other;
        private String xxxx;
        //more fields
}

Vejo algumas opções;

1 - Posso receber no controller esse AccountForm e setar as propriedades dele no objeto Account e outros se nescesasrio NO CONTROLLER;

 + atende as situações situacao1,situacao2 e situacao3
 + separa a requisçao  do objeto de dominio
 - polui o controller com codigo de conversao
 - controller fica cheio de setters.. se for uma classe maior como um objeto grande como um pedido fica bem confuso.
controller(AccountForm from){
       Account account = new Account()
      account.setNome=form.getNome();
      account.setSome=form.getSome();
      Other outher = new Other();
      other.setSome(form.getSome());
}

2 - Posso receber no controller esse AccountRequest ter um metodo nele mesmo como AccountRequest.getAccount() para devolver um model mapeado, nesse caso o mapeamento fica no proprio objeto de Request.

 + separa a requisçao  do objeto de dominio
 + encapsula a conversao  em um lugar de facil acesso.
 +  atende  situacao1 situacao2 e situacao3;
 - objeto de request tem duas responsabilidades representar a requisiçao e mapear para um model valido.
controller(AccountForm accountRequest){
       Account account = accountRequest.getAccount();
       Outher outher = accountRequest.getOther();
}

3 - Posso receber Account direto no controller onde ficara cheia de nulos.

+ elimino objeto de request
-  atende apenas a  situacao1 situacao2 , por que request pode ter informações sobre vários objetos... o que não funcionaria.
controller(Account account){
      account.someMethod();
}

4 - Externalizar esse mapeamento dos parâmetros da requisição para outro objeto mapeador por request..

+ isola logica do mapeamento
- complexidade ate para casos mais simples se usado como padrão para tudo por exemplo um find por id.
- mais uma classe para cada request;

No caso de APi que tenha resposta fica pior ainda mais 2 classes. falando em termos de request de response.... AccountRequest,AccountRequestMapper,Account,AccountResponseMapper,AccountResponse........

Estou fazendo testes mais o Hibrido da opção 3 para casos simples(find por id ou updates).... com a opção 2 por exemplo para casos mais complexos... parece o ideal pelo que estou vendo, espero que com a opinião de vocês fique mais claro.. o que poderia ser melhor, porém na abordagem hibrida, o problema é que voce não tem o famoso "PADRAO" e tem que pensar em como fazer a cada caso,e vejo resistência em adotar algo assim. O ruim do PADRAO é que gera arquitetura mostro para fazer um find por exemplo.

O que vocês usão /O que seria ideal/ O que fica expressivo e de fácil manutenção? Obrigado.

  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

2 respostas

Não é a resposta que estava procurando? Procure outras perguntas com as tags java ddd arquitetura ou faça a sua própria pergunta.