Ho 3 AR:
- Student
- Guardiano
Regola aziendale :
- Lo studente dovrebbe avere almeno 1 tutore autorizzato Le entità non dovrebbero essere in uno stato non valido, giusto?
In questo momento ho forzato l'invariante nel mio costruttore Student
:
public function __construct(StudentId $id, Name $name, Guardian ...$guardians) {
if ( $this->hasNoAuthorizedGuardian(...$guardians) ) {
throw new NoAuthorizedGuardianException();
}
// initialized fields
}
Tuttavia, durante la creazione della parte repository per la mia AR studente, ho riscontrato un problema nel recuperare i guardiani "necessari" per questo.
class StudentRepository {
public function getById(StudentId $id): Student {
// other lines omitted for brevity
return new Student($id, $name, ...$guardians);
}
}
Ho pensato a queste domande:
-
Dovrei fare riferimento a
GuardianRepository
all'interno diStudentRepository
? Mi sento come se la risposta fosse no, ma sono nuovo di DDD quindi potrebbe essere valido -
Le AR dovrebbero avere il permesso di fare riferimento ai repository? Sento che la risposta a questo è anche no, ma come ho detto sono nuovo di DDD, quindi questo potrebbe essere valido.
-
Ho applicato correttamente il mio invariante? O dovrei metterlo in Domain Service in modo che non abbia bisogno di recuperare le entità correlate in un singolo repository?
Il secondo approccio mi consentirà di fare questo:
class StudentService {
public function getById(StudentId $id) {
$student = $this->studentRepo->getById($id);
$guardians = $this->guardianRepo->getByStudentId($id);
$student->guardians(...$guardians);
return $student;
}
}
Contro di farlo anche se le mie entità diventeranno un'entità di dominio anemico da quando ho trasferito l'invariante in un altro livello.
Un'altra possibile soluzione che ho trovato è il caricamento lento, ma non sono sicuro di come farlo, incluso quando e come recuperare le entità correlate.
TL; DR : se la tua entità radice richiede un riferimento a un'altra entità radice, come puoi ottenerla?
Modifica :
Per chiarimenti, non ho menzionato che Guardian ha le sue entità come Contatti e altri Value Objects. Penso che sia abbastanza per essere considerato un AR perché dovrebbe essere quello che li gestisce.
Il riferimento Studente-Guardiano qui è un Contesto Limitato Credo che ho appena imparato ora.