Skip to content

DDD Abordagem tática - Agregados e Repositórios #206

@ddnascimento

Description

@ddnascimento

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

  1. 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)

  2. 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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions