[quote=brunoviana]Caros, ultimamente tenho lido bastante sobre Domain Model e gostei bastante do assunto, pois ele retrata exatamente como um desenvolvedor deve pensar quando desenvolve uma aplicação que retratar o mais próximo possível da vida real.
A minha dúvida é a seguinte; Eu possuo meu Domain Model onde devo ter apenas as minhas regras de domínio, por exemplo, eu tenho uma classe “Carrinho” e uma “Produto”. Lógicamente eu preciso adicionar produtos ao meu carrinho usando o método “adicionarProduto()”:
Obs: To chamando o carrinho estático somente para encurtar o código.
Até ai tudo beleza, o que ta confundindo minha cabeça é como os dados de carrinho e produto vão parar no banco de dados,(…)[/quote]
Parabens por ter escolhindo um exemplo tão simples. Algo que sempre faltou no topicos de DDD.
Ok, vc tem o seu carrinho e o seu produto e adicona um no outro. (provavelmente adciona através de um terceiro objeto ProdutoItem)
Persistencia é delegada ao Repositorio. Vc faria Repositorio.store(produto) ou Repositorio.store(carrinho)
Para ler os produtos vc usaria Repositorio.retriveList(Produto.class, query) , etc… [ou usando a mesma convensão de usar classes estáticas , mas seriam objetos)
Entenda que Repositorio é um conceito. O como ele executa aqueles métodos é irrelevante para o dominio. Ele pode persistir num banco como simplesmente usar um HashMap que vai embora quando a aplicação cai.
O eventos do sistema são tratados por serviços. Então vc teria um serviço
Invoice invoice = InvoiceService.makeInvoiceFor(carrinho, customer, date);
Vc tem agora o pedido. Que pode pode apresentar ou usuário e depois quando ele aceitar fazer
InvoiceService.closeDeal(invoice invoice, paymentInformation);
onde paymentInformation contém informações de parcelamento , cartão de credito etc. Coisas necessárias a finalizar um pedido.
Provavelmento o closeDeal criaria mudaria o status do invoice , criaria lançamentos financeiros e ordem de movimento de estoque usando outros serviços do dominio. Em algum ponto um serviço de dominio produtiza dados ou receberá dados que ele sabe que precisa ser persistidos. Ele usará os repositorios necessários para isso.
O detalhe final é que nem todas as entidades têm repositorios, apenas as que são necessárias persistir. Por exemplo, Invoice pode não ser pesistido. Se a pessoas aborta o processo acabou. Da proxima vez ela criará outro invoice a partir do carrinho. Quando fizer o closeDeal vc pode criar outra entidade (por exemplo Sell) que será persistida. Neste caso Invoice é uma entidade mas não tem um repositorio associado.
Moral da historia: nem todas as entidades se trasnforma em tabelas no banco. Apenas as que forem persistidas.
Normalmente o banco é desenhado primeiro, em DDD não. Por isso ele consegue ser mais eficiente e claro e mais leve na hora de persistir. O que manda são as regras do dominio e do negocio e não o modelo de banco.