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.
fonte
Respostas:
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,
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
fonte
holding a reference
desse contexto? porque fiquei confuso quando você disse isso:holding a reference to a root is legit
e 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.
id
entidade interna (não raiz) em outro agregado ou isso viola (raiz ou não)?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
fonte