Salve pessoal !
Estive lendo o livro mais que recomendado por alguns aqui no fórum e fiquei com uma dúvida na relação Aggregates e repositórios e também Associates com Repositórios.
Vamos imaginar o que o próprio Evans comenta: Cliente e Pedido.
Tenho lá:
Supondo que temos todo o Repositório pronto, isso traria o Objeto Cliente do John Doe.
Entretanto, não podemos esquecer que ele é um comprador excelente e tem vários pedidos já efetuados.
Seria uma loucura tremenda eu tentar já trazer os pedidos do John logo de cara, digo, no RepositoryCliente. Então, eu pensei em duas coisas para realizar tal ação:
1. Ter um método em Cliente que me traga os pedidos dele.
public class Cliente {
public List getPedidos() {
return RepositoryPedidos.pesquisaPorClienteId(this.id).findAll();
}
Limitações: eu perderia boa parte do poder do Repositório do Pedido fazendo isto, pois limitaria minha busca apenas ao ID do cliente.
2. Usar uma Façade
Aqui eu teria total “controle” pois poderia criar inumeros casos, cada um num método diferente da minha façade.
ClientePedidosFacade.clienteEpedidosFinalizados(int cliente_id)
ClientePedidosFacade.clienteEpedidosEmAbertoEntre(int cliente_id, Date data_inicio, Date data_fim)
Limitações: ficaria um monte de Facade no sistema. Isso seria ruim ?
Ou ainda criar comportamentos diretamente no repositório do cliente, mas isso me pareceu meio gambiarra - pareceu pois eu já tentei fazer isto !
Algo como:
Daí meu get() teria que estar pronto para popular o Cliente com um List de Pedidos caso fosse necessário e pronto para não popula-los caso não seje.
Eu já fiz implementações assim e sim, funciona - como quase tudo que fazemos hehe - mas particularmente não achei elegante
Agora quanto aos Agregados, vocês fazem como ? Ao pesquisar pelo root já trazem os agregados juntos, né ?
Um exemplo seria: Pessoa e endereço - retirado do livro também hehe - busco pela Pessoa e já me vem um List com os endereços (VO) do cara. Acho que não tem muito o que fazer aqui…
O que acham ?
Abraço !