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 oggettiPassDefinitionpotrebbero puntare aPasscancellato e l'inconsistenza nel contesto si presenterà. - Ci sarà un metodo (hasEligiblePass) su
PassDefinitione dal momento cheAccountnon 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
Accountes disponibili per lo specificoPass. MettereAccountinPasscostringerà tale operazione banale a recuperarePassDefinitions 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?