Aggregates e Repositórios

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 :frowning:

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 !

Só por curiosidade…

E diante dessas suas dúvidas…

Qual livro vc está lendo?

[quote=fabio.nascimento]Só por curiosidade…

E diante dessas suas dúvidas…

Qual livro vc está lendo?
[/quote]

Domain Driven-Design do Eric Evans.

Relendo o trecho, ele fala claramente que os objetos agregados somente são acessíveis pelos seus “roots”.

Então para eu obter um endereço do Cliente eu teria que obrigatoriamente passar pelo Cliente

Só não ficou claro como seria melhor obter esses endereços, conforme explique acima :confused:

Alguém para dar uma luz ?

Abraço \o

O que eu vejo a galera do fórum aqui recomendando - e é o que eu uso também - é injetar o repositório na entidade no momento de sua criação - uma factory pode fazer isso tranquilamente. Ou seja, seu método getEnderecos() pode efetuar sem problemas uma chamada direta ao repositório. Dessa forma você só carrega os objetos quando de fato precisa deles ( lazy loading ).

tnaires,

Entendi. Então eu posso ter um repositório injetado na minha entidade tranquilamente. Maneiro, vou brincar com isso aqui para ver no que vira.
Agradeço a dica \o

Abraço !