Consigli sui limiti di AggregateRoot

2

Sono confuso su come applicare i principi DDD per la progettazione di cluster di entità di dominio con Root aggregato . Secondo la mia comprensione, Aggregate Root applica le convalide aziendali e tutte le entità all'interno di quell'aggregato dovrebbero essere accessibili dalla sua radice. Ma questo sta portando ad un enorme aggregato di oggetti collegati.

Per fare un esempio, ho un dominio con 3 entità: Contract , PurchaseOrder (PO) e Initative :

Considero Contract come radice di aggregazione per il mio cluster. Un utente può aggiungere Contract e quindi aggiungere un PO e aggiungere Iniatives per PO. Ma lui / lei può cercare un PO per numero PO e aggiungere Iniatiative ad esso. Quindi sembra strano ogni volta che aggiungiamo un'iniziativa, dobbiamo caricare l'intero Contract (con tutte le dipendenze) in memoria e quindi aggiungere Initiative .

Potrei idratare l'entità di dominio PO dal database e quindi aggiungere Initiative ad esso (e lì tutta la logica di business è nell'entità di dominio PO ), ma non va contro i principi del DDD di non accedere direttamente all'entità non root di un cluster aggregato?

    
posta Sri Harsha Velicheti 24.02.2018 - 16:47
fonte

1 risposta

5

Ci sono due diversi aspetti nella tua domanda: dove dovrebbe essere il confine nel tuo modello di dominio? e come implementare il tuo modello?

I limiti nel modello

La definizione di un aggregato è:

A cluster of associated objects that are treated as a unit for the purpose of data changes. External references are restricted to one member of the aggregate, designated as the root. A set of consistency rules applies within the aggregate’s boundaries.

Leggendo la tua domanda, sembra che:

  • a Purchase Order ha un ID univoco e questo identifica l'oggetto in modo completamente indipendente dal Contratto. A proposito, questa è una normale pratica commerciale: qualsiasi ordine di acquisto deve essere facilmente recuperato in qualsiasi situazione, anche senza conoscere il contratto (ad esempio, i lavoratori del magazzino che ricevono la spedizione di un ordine non si preoccupano del contesto del contratto).
  • Inoltre, tu dici che potresti benissimo aggiungere un'iniziativa all'OP direttamente. Ciò suggerisce che la coerenza del modello non richiede che il Contratto verifichi la coerenza.

Questi fatti suggeriscono strongmente che PO e Initiative potrebbero essere in un aggregato che non include Contract . È necessario confermare questa detrazione, verificando che il contratto non sia necessario quando si modifica l'ordine di acquisto, si aggiunge un'iniziativa o si modifica un'iniziativa. Un'altra domanda utile è che cosa succede agli OP quando il relativo Contratto ottiene uno stato "cancellato" o cancellato.

L'implementazione

Quando parli di idratazione del PO, ecc. stai riflettendo sull'implementazione. Questo è NON qualcosa su cui riflettere WHEN DESIGNING il tuo modello di dominio. Esistono numerosi modelli per implementare un'applicazione per database orientati agli oggetti (ad esempio mappe di identità, caricamento lento, ecc.). Ma prima devi pensare al dominio e comprenderlo bene.

Ad esempio, se sembra che ogni modifica di un ordine di acquisto richiederebbe il controllo incrociato di alcuni massimali del contratto e viceversa, la modifica di alcuni limiti del contratto richiede di verificare in tempo reale che il nuovo valore è ancora al di sopra del valore totale di tutti gli ordini pertinenti, quindi una modifica diretta a un ordine d'acquisto sembrerebbe un po 'rischiosa. Potrebbe quindi essere una buona idea considerare la radice aggregata con il contratto dopo tutto. Troverai sempre soluzioni tecniche per domini e sfide aziendali. Ad esempio, sotto la mega ipotesi di aggregazione una query sul numero di PO potrebbe benissimo restituire l'aggregato corrispondente. Fino a te per incanalare la modifica al PO attraverso il contratto per rafforzare la coerenza. Puoi anche utilizzare il principio del carico pigro per caricare un aggregato ma idratare solo gli oggetti strettamente necessari.

    
risposta data 24.02.2018 - 18:08
fonte

Leggi altre domande sui tag