DDD: é correto que um agregado raiz retenha uma referência a outro agregado raiz?

16

Ao seguir o DDD (Design Orientado a Domínio), é correto que um agregado raiz retenha uma referência a uma entidade interna que passa a ser a entidade raiz em um agregado separado?

Eu acredito que isso não está correto, principalmente por causa desta regra no livro azul :

Nada fora do limite AGGREGATE pode conter uma referência a qualquer coisa dentro dele, exceto à raiz ENTITY. A raiz ENTITY pode entregar referências às ENTITIES internas a outros objetos, mas esses objetos podem usá-las apenas de forma transitória e podem não se apegar à referência. A raiz pode entregar uma cópia de um VALUE OBJECT para outro objeto, e não importa o que aconteça, porque é apenas um VALUE e não terá mais nenhuma associação com o AGGREGATE.

Se um agregado raiz mantém uma referência a outro agregado raiz, o limite do primeiro é violado e todo o conceito de agregado é corrompido, por isso acredito que se um agregado raiz parecer precisar manter uma referência a outro agregado raiz, então preciso para criar uma entidade diferente , que provavelmente compartilhará alguns dos mesmos membros que a outra entidade raiz, mas não terá uma identidade global, conforme esta outra regra do livro declara:

ENTIDADES raiz têm identidade global. ENTIDADES dentro do limite têm identidade local, única apenas dentro do AGREGADO.

Acredito que esse seria o caminho correto a seguir, mas, como se sente repetitivo e redundante (quando retirado do contexto do DDD, com pura POO), estou pedindo algum feedback.

Lesair Valmont
fonte
O que você quer dizer com "entidade interna (que passa a ser a entidade raiz em um agregado separado)"?
Erik Eidt
2
FWIW, Qualquer coisa pode se referir a uma entidade raiz agregada, pois essas são as coisas que têm identidade global; se o referenciador é uma entidade raiz ou não é irrelevante.
Erik Eidt
Como Erik disse. Além disso, não importa se você o referenciar usando ID ou referência no seu modelo. Os dois serão convertidos em ID no nível do banco de dados e, com uma referência, o ORM poderá carregar preguiçosamente a entidade sob demanda.
Euphoric

Respostas:

21

Você pode estar interpretando demais o livro. Diz basicamente: qualquer coisa fora de um agregado não pode conter uma referência a nada dentro dele, exceto a raiz. Portanto, manter uma referência a uma raiz é legítimo. Manter uma referência a uma raiz não significa que faz parte de seu próprio agregado e que você pode controlar seus invariantes. Mantém seus próprios invariantes e autonomia.

Contudo,

  • Uma boa prática comumente aceita é se referir a um AR armazenando seu ID, não uma referência completa.
  • Abordagens mais modernas para o design agregado (consulte o Red Book ) defendem uma separação mais limpa entre os agregados. Uma transação comercial deve alterar apenas o estado de um único agregado. Sob essa suposição, a necessidade de armazenar uma referência a outro agregado tende a desaparecer porque você não modifica dois agregados ao mesmo tempo.

é correto que um agregado raiz mantenha uma referência a uma entidade interna que passa a ser a entidade raiz em um agregado separado?

Isso nunca acontece. Um objeto de valor pode fazer parte de vários agregados, mas não uma entidade. O motivo é que nada impediria o compartilhamento da mesma instância de entidade entre agregados. Digamos que a instância de entidade E pertença às instâncias agregadas A e B. Como a premissa do DDD é que o Agregado é o ponto de entrada, você poderá carregar A, modificar a entidade E através dela, violando silenciosamente os invariantes de B (que você não carregou).

Veja a resposta de Greg Young aqui: http://domain-driven-design.3010926.n2.nabble.com/Can-an-Entity-be-Shared-across-many-Aggregates-td7579277.html

guillaume31
fonte
Obrigado Guillaume pela resposta clara, concisa e perspicaz. Verdadeiro conhecedor do DDD. Era isso que eu estava procurando. Chapéu!
Lesair Valmont 17/08/16
Eu sei que pode ser uma pergunta boba, mas eu poderia perguntar qual é o significado holding a referencedesse contexto? porque fiquei confuso quando você disse isso: holding a reference to a root is legite depois você disse:This never happens. A Value Object can be part of multiple Aggregates, but not an Entity. The reason is, nothing would then prevent you from sharing the same entity instance between Aggregates.
Anyname Donotcare 31/08/18
1
Mantenha uma referência = mantenha-a internamente / de forma durável, como membro da classe. A dicotomia aqui é raiz versus não raiz. Você pode manter uma referência raiz, mas não uma referência não raiz.
precisa saber é o seguinte
@ guillaume31 muito obrigado, mas eu poderia perguntar se posso manter uma identidade interna (não raiz) em outro agregado ou isso viola (raiz ou não)?
Anyname Donotcare
O que você faria com esse ID? Mesmo repositórios fornecem apenas raízes, não entidades internas.
precisa saber é o seguinte
1

Seu objeto raiz agregado (geralmente) deve ter apenas propriedades que fazem parte de seu domínio.

Se você tiver um objeto AR com uma propriedade que não esteja agregada, será imediatamente confrontado com a pergunta. 'Por que não?'

Você pode adicionar o ID do outro objeto, talvez? Ou injetar um repositório?

Mas parece que você deve adicionar um serviço entre domínios que faça referência a ambos os objetos raiz e execute a lógica necessária

Ewan
fonte
Ewan, eu estava pensando mais em reutilizar uma classe entre duas agregações diferentes no sentido de OOP, em vez de ter um serviço de domínio agindo como um script de negócios que fará algum trabalho com os dois agregados DDD diferentes. Concluindo, concordo com você, minha raiz agregada deve ter apenas propriedades que fazem parte de seu domínio.
Lesair Valmont 17/08/16