-
Notifications
You must be signed in to change notification settings - Fork 13
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
DDD Abordagem tática - Agregados e Repositórios #206
Comments
Posso dizer como eu implementaria. Eu passaria como parâmetro para o $clientRepository->removeFromWishList(Client $client, Product $product) Isso resolve seu problema aqui:
Me avisa se isso estiver errado de alguma forma. |
@esron Obrigado pela atenção. Eu entendo que dessa forma proposta não garante que o programador futuramente utilize esse método fornecendo ...removeFromWishList(Client $client, Product $product) ao invés de passar pela regra de validação de remoção contido no modelo $client->removeFromWishList(Product $product)) sabe... Mas também não sei se o DDD aborda tal situação com essa profundidade de segurança ou não compreendi a mecânica das coisas... rs. Grato por compartilhar sua visão! |
Tudo bem, @ddnascimento ? Na verdade são algumas decisões arquiteturais que você precisa tomar. Considerando o cenário descrito, você em algum momento precisa criar a relação entre Client e Product. Aí vai de encontro com a sugestão do @esron . $whilist = new Wishlist($client);
$wishlist->remove($product); Ou, o que seria mais próximo do que você quer: $client->wishlist->remove($product); Espero ter ajudado de alguma forma. No fim das contas, tu precisará testar as possibilidades pra ver o que vai se encaixar melhor. Abs \0 |
Olá Devs!
Estou estudando sobre DDD e tentando aplicar seus conceitos utilizando nosso amado Laravel.
Entretanto, minha pergunta não é sobre framework especificamente mas sobre a correta abordagem no que diz respeito
a parte tática do DDD. Me desculpem se o assunto estiver muito fora do que o fórum discute, mas serei grato pela atenção.
Problemática
Vamos lá! Supondo que eu tenha um agregado Client e este possui uma lista de desejos. Cada item da lista corresponde a um Product.
Dito isso, se eu precisar remover um item da lista, recorro a entidade Client. Algo como:
$client->removeFromWishList(Product $product))
O método removeFromWishList(...) contém algumas regras que precisam estar em conformidade para remoção. Se tudo estiver ok, o produto será removido da lista de desejos contida no objeto Client.
Porém essa remoção é só em memória. Então utilizo uma Application Service, que tem acesso ao repositório que irá tratar da remoção. A pergunta é: O que o repositório que contém o método de remoção deverá receber como argumento?
Abordagem
Caso receba como argumento o objeto Client:
Como saberei qual produto terei de remover uma vez que tal produto não está mais na lista de desejos?
Ex.:
$clientRepository->removeFromWishList(Client $client)
Caso receba como argumento o objeto Product ou o id do produto que será removido:
Dessa forma, eu entendo que estaria removendo qualquer produto sem passar pelo método removeFromWishList(...) ignorando as regras que garantem a remoção citada anteriormente.
Ex.:
$clientRepository->removeFromWishList(Product $product)
Ou:
$clientRepository->removeFromWishList($productId)
Não ficou claro para mim qual das abordagens citadas (ou nenhuma delas...) seria a ideal.
Da mesma forma não entendo se terei de carregar todos os produtos da lista de desejos para o objeto Client sempre que eu quiser remover um produto da lista (passando pelas regras que garantem a remoção).
Desde já agradeço pela atenção.
The text was updated successfully, but these errors were encountered: