Fórum Mapeamento dos dados de request para o domain model. #480028
24/05/2014
0
Temos as situações em geral... considere objetos maiores que o exemplo.
[color=red]situacao1[/color] - Podemos ter uma request que tem todos os parâmetros do account;
{"id":"1";"name":"test","some":"xxx".............} e os outros campos.
[color=red]situacao2[/color] - Podemos ter uma request que tem alguns parâmetros do account, por exemplo no caso de um update;
{"id":"1";"name":"testUpdated"}
[color=red]situacao3[/color] - 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;
[color=blue] + atende as situações situacao1,situacao2 e situacao3
+ separa a requisçao do objeto de dominio[/color]
[color=red]- 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.[/color]
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.
[color=blue]+ separa a requisçao do objeto de dominio
+ encapsula a conversao em um lugar de facil acesso.
+ atende situacao1 situacao2 e situacao3;
+ um objeto burro que so tem os parametros da requisçao tem alguma funcionalidade;[/color]
[color=red] - objeto de request tem duas responsabilidades representar a requisiçao e mapear para um model valido.[/color]
controller(AccountForm accountRequest){
Account account = accountRequest.getAccount();
Outher outher = accountRequest.getOther();
}
3 - Posso receber Account direto no controller onde ficara cheia de nulos.
[color=blue]+ elimino objeto de request[/color]
[color=blue]+ alta simplicidade [/color]
[color=red]- atende apenas a situacao1 situacao2 , por que request pode ter informações sobre vários objetos... o que não funcionaria.[/color]
[color=red] - forte acoplamento.[/color]
controller(Account account){
account.someMethod();
}4 - Externalizar esse mapeamento dos parametros da requisição para outro objeto mapeador por request..
[color=blue]+ isola logica do mapeamento[/color]
[color=red]- 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;[/color]
No caso de APi que tenha resposta fica pior ainda mais 2 classes.
falando em termos de request de response....
request | mapper | model | mapper | 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 opiniao de voces 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 facil manutençao?
Obrigado.
João Aquino
Curtir tópico
+ 0
Responder
Clique aqui para fazer login e interagir na Comunidade :)