[quote=Jair Rillo Junior]Adriano,
DDD não é uma receita de bolo que devemos segui-lá sem analisar o nosso cenário. No seu cenário, seu repository precisa de um método ADD e outro UPDATE? Se sim, manda bala em implementá-los, não há problema algum.
Uma dica é: entenda bem o Pattern Aggregate. Teoricamente, um Repository deve existir para o agregado raiz, os objetos "internos" dele podem/devem ser persistidos, alterados diretamente pelo raiz. Exemplo:
Supondo que no seu cenário o agregado raiz seja um objeto Cliente. Seu sistema também controla os Pedidos, que no caso pertencem à um cliente, assim sendo, Pedidos fica dentro de Clientes.
Clientes --(faz pedido)—> Pedido
Para persistir o Pedido, você não precisa, e na minha opinião não deve, ter um repositorio para Pedidos, pois você simplesmete faria "clientes.addPedido(pedido)".
Com Hibernate, teriamos um código assim mais ou menos
public void addPedido(Integer idCliente, Pedido pedido) {
//Recupera o cliente previamente cadastrado
Cliente cliente = clienteRepository.findById(idCliente); //Aqui o cliente estará gerenciado pelo Hibernate, ou seja, qualquer mudança será refletida em algum momento no BD"
cliente.addPedido(pedido); //O mesmo de cima. em algum momento seu pedido será inserido na base de dados
}
Note que no exemplo acima existe um repository apenas para o objeto agregato raiz.
Em alguns exemplos mais "radicais", você pode ter, como exemplo, objeto raiz SISTEMA, que tem apenas 1 valor que foi previamente inserido via INSERT direto na base de dados. Nesse caso, o sistema.addCliente, sistema.addProdutos, sistema.findClienteById().addPedido() e por ai vai.
Isso é só uma dica. Espero que tenha ajudado[/quote]
Jair, seguinte:
Pelo que entendi de DDD e Repository, um repository em sua tradução para o nosso português representa um repositor e não um recipiente (esse seria o banco de dados ou arquivos) como alguns interpretam em alguns casos. Então o referido “repositorio” em OO deve representar um repositor do mundo real, ou seja, um cara (como se fosse uma pessoa, um profissional) responsável por guardar ou buscar um determinado objeto (ou um tipo de objeto) que será ou está guardado em um determinado local ou recipiente (SGBD). Como um funcionário que fica repondo produtos no estoque e retirando do estoque para encaminhá-lo a expedição. Não necessariamente algum funcionário contratado somente para exercer essa função, mas qualquer um que realize essa tarefa estaria exercendo, ao menos naquele momento, o papel de repositor, logo, o referido repository correto?
Sempre ouço que em OO devemos ao máximo representar o mundo real. Em tese, representar objetos do mundo real em objetos de programação pode ser um tanto subjetivo por depender muito do “ponto de vista”. E depende do ponto de vista de cada um e pior, do seu próprio ponto de vista daquele dia (que pode ser diferente do de outro dia)…rs…
Se entendi bem, quando diz sobre o “agregate root” ser o cliente (que se entendi bem você refere-se a “Entidade” Cliente), este deveria guardar um pedido (outra entidade), por ser dele este pedido.
Pois bem, onde quero chegar? Porque um cliente deveria guardar um registro de pedido? Talvez, um cliente possa (ou até tenha que) fazer um pedido. Mas daí a ele ser responsável por guardar um pedido não seria delegar tarefa de um repositor a um cliente?
Grato!