DDD: è corretto per un aggregato radice contenere un riferimento a un altro aggregato radice?

10

Quando si segue la progettazione guidata dal dominio (DDD), è corretto per un aggregato radice contenere un riferimento a un'entità interna che si trova ad essere l'entità radice su un aggregato separato?

Credo che ciò non sia corretto, principalmente a causa di questa regola su il libro blu :

Nothing outside the AGGREGATE boundary can hold a reference to anything inside, except to the root ENTITY. The root ENTITY can hand references to the internal ENTITIES to other objects, but those objects can use them only transiently, and they may not hold on to the reference. The root may hand a copy of a VALUE OBJECT to another object, and it doesn't matter what happens to it, because it's just a VALUE and no longer will have any association with the AGGREGATE.

Se un aggregato radice contiene un riferimento a un altro aggregato radice, il limite del primo viene violato e l'intero concetto di aggregato è corrotto, quindi credo che se un aggregato radice abbia bisogno di tenere un riferimento a un altro aggregato radice, quindi ho bisogno di creare un'entità diversa , che probabilmente condividerà alcuni degli stessi membri dell'altra entità root, ma non avrà un'identità globale, come afferma quest'altra regola nel libro:

Root ENTITIES have global identity. ENTITIES inside the boundary have local identity, unique only within the AGGREGATE.

Credo che questa sarebbe la strada giusta da percorrere, ma dal momento che si sente ripetitivo e ridondante (quando tolto il contesto di DDD, con puro OOP), sto chiedendo un feedback.

    
posta Lesair Valmont 17.08.2016 - 02:04
fonte

2 risposte

15

Potrebbe capitare di sovrascrivere il libro. In pratica dice: qualsiasi cosa al di fuori di un Aggregate non può contenere un riferimento a qualcosa al suo interno tranne la radice. Pertanto, mantenere un riferimento a una radice è legittimo. Tenere un riferimento a una radice non significa che sia parte del tuo aggregato e che puoi controllare i suoi invarianti. Mantiene le proprie invarianti e autonomia.

Tuttavia,

  • Una buona pratica comunemente accettata è di fare riferimento a una AR memorizzando il suo ID, non un riferimento completo.
  • Più approcci moderni alla progettazione aggregata (vedi il Red Book ) sostengono una separazione più pulita tra gli aggregati. Una transazione commerciale dovrebbe solo cambiare lo stato di un singolo aggregato. In base a questo presupposto, la necessità di memorizzare un riferimento a un altro aggregato tende a scomparire perché non si modificano 2 aggregati contemporaneamente.

is it correct for a root aggregate to hold a reference to an internal entity that happens to be the root entity on a separate aggregate?

Questo non succede mai. Un oggetto valore può essere parte di più aggregati, ma non di un'entità. Il motivo è che nulla ti impedirebbe di condividere la stessa entità istanza tra gli aggregati. Supponiamo che l'istanza di entità E appartenga a entrambe le istanze aggregate A e B. Poiché la premessa di DDD è che l'aggregato è il punto di ingresso, è possibile caricare A, modificare l'entità E attraverso di essa, per tutto il tempo violando in modo invariato gli invarianti da B (che non hai caricato).

Vedi la risposta di Greg Young qui: link

    
risposta data 17.08.2016 - 14:10
fonte
1

Il tuo oggetto radice aggregato dovrebbe (generalmente) avere solo proprietà che fanno parte del suo dominio.

Se si dispone di un oggetto AR con una proprietà che non è nell'aggregato, si viene immediatamente confrontati con la domanda. "Perché no?"

Potresti aggiungere l'ID dell'altro oggetto, forse? O iniettare un repository?

Ma sembra che dovresti aggiungere un servizio cross-domain che fa riferimento a entrambi gli oggetti root ed esegue la logica richiesta

    
risposta data 17.08.2016 - 10:54
fonte

Leggi altre domande sui tag