Buscar objeto agregado através de outro objeto (Aggregate)

Salve !

Estou travado em uma regra aqui.

Tenho lá: Pedido, cliente e endereço. Esse último é agregado de cliente.
Quando cria-se um pedido, os dados sobre o endereço precisa ser mantido, pois o cara pode mudá-lo, removê-lo e etc…

Aí vem o problema: Hoje para carregar os endereços de um cliente XPTO eu uso o lazy loading. Algo como:

Cliente.getEnderecos() { // acessa o repositório do cliente, busca os endereços agregados e retorna }

Só, que depois de consumado o pedido, ele precisará buscar o Endereço em outra “tabela”. Isso é tranquilo, poderia ser baseado em status e tal., mas neste caso eu não tenho (ao meu ver) algo para diferenciar o “pega os endereços atuais” do “pega o endereço desse pedido”.

Pensei no seguinte: Cliente.getEnderecoDo(int pedido_id)
Mas acho que isso deixaria meu Cliente “sabendo demais”, ou não ?

— Editado —
Pensando com meus botões aqui, me veio a mente que eu poderia talvez no Pedido.getCliente() pedir ao Repositório do Cliente trazer já o endereço e injetar no cliente. Algo como:

Pedido.getCliente() {
    this.cliente = RepositorioCliente.pequisaPorId(cliente_id).get(); 
    this.cliente.adicionaEndereco(RepositorioCliente.buscaEnderecoDo(pedido_id));
  
    return this.cliente;
}

De primeiro momento isso parece fazer sentido. Pelo menos para mim…

Alguma sugestão ?

acha que pedido.getEndereco() retornando um Endereço não seria melhor, já que seu pedido que tem um endereço nele?

Abraços

[quote=ffranceschi]acha que pedido.getEndereco() retornando um Endereço não seria melhor, já que seu pedido que tem um endereço nele?

Abraços[/quote]

Opa,
Mas acho que isso quebraria o agregado Cliente -> Endereço, não ?

Abraços,

hlegius,

Não vejo problema na forma que você comentou, mas IMHO você precisa ficar atento na forma de você citou pois nesta classe de pedidos seu cliente retorna o endereco de um local persistido (Endereco do pedido), e em outras classes retornara o endereco de outro local (Endereco do cliente) e isso pode acabar gerando uma confusão no futuro (Principalmente se ocorrer do endereco do cliente ser alterado e/ou excluido).

Talvez seria interessante o analisar se a dica do ffranceschi é viavel no seu cenario.

[quote=hlegius]
Opa,
Mas acho que isso quebraria o agregado Cliente -> Endereço, não ?

Abraços,[/quote]

Sim, mas pensando em negócio agora, o Endereço do Cliente é diferente do Endereço do Pedido certo?
Eu sou sempre a favor de manter o design mais simples e intuitivo, isso sim faz toda a diferença…

[quote=ffranceschi][quote=hlegius]
Opa,
Mas acho que isso quebraria o agregado Cliente -> Endereço, não ?

Abraços,[/quote]

Sim, mas pensando em negócio agora, o Endereço do Cliente é diferente do Endereço do Pedido certo?
Eu sou sempre a favor de manter o design mais simples e intuitivo, isso sim faz toda a diferença…[/quote]

Realmente. Entendi seu ponto de vista agora. O endereço continuará sendo acessado por um root (ora Cliente ora Pedido). Seria um aggregado combo hehe =)
Eu foquei “cegamente” no agregado Cliente -> Endereço e não me toquei que pode haver outro agregado (Pedido -> Endereco).

@ffranceschi obrigado pelo toque !

A princípio não ficou tão confuso. O pedido solicitará endereço de um lugar e o cliente de outro. Mas analisando agora com as dicas de vocês realmente fica bem mais simples o relacionamento direto de Pedido -> Endereço e outro entre Cliente e Endereço.

valeu rapaziada :slight_smile: