Durante la prototipazione di una semplice applicazione ddd dal dominio di transito pubblico ho riscontrato un problema con un oggetto valore - Transit Pass:
Ogni cliente può acquistare una percentuale di transito% co_de che consente a un passeggero del servizio di prendere un certo numero di viaggi pre-acquistati o viaggi illimitati entro un determinato periodo di tempo. Una descrizione dettagliata di questi passaggi è rappresentata in casi di Pass
s. Un cliente seleziona PassDefinition
che è più appropriato per lui e riceve un nuovo PassDefinition
.
Nella parola reale, Customer Pass
ha Account
es quindi è abbastanza semplice mettere Pass
in Pass
aggregato come oggetto valore che ha un puntatore a Account
. Questo approccio ha 2 problemi:
- Che cosa succede se l'amministratore eliminerà
PassDefinition
? Alcuni oggettiPassDefinition
potrebbero puntare aPass
cancellato e l'inconsistenza nel contesto si presenterà. - Ci sarà un metodo (hasEligiblePass) su
PassDefinition
e dal momento cheAccount
non ha informazioni sulla validità, sarà richiesta la chiamata esterna di vehicleAllowed etc aPass
.
Un'altra opzione è spostare PassDefinition
in Pass
aggregato. Ma:
- Che cosa succede se il Cliente eliminerà
PassDefinition
(mentre è improbabile dal momento che l'account può essere attivato / disattivato solo dal progetto)? - È un'operazione molto comune nel sistema elencare tutti i
Account
es disponibili per lo specificoPass
. MettereAccount
inPass
costringerà tale operazione banale a recuperarePassDefinition
s e filtrerà molti risultati.
Quindi il problema globale è che il% ciclo di vita di PassDefinition
dipende da Pass
e Account
cicli di vita. Come gestire tali oggetti in DDD?