Il più delle volte, non ha bisogno di sapere; gli aggregati con i contorni correttamente progettati non hanno bisogno di conoscere lo stato esterno per mantenerne l'invariante (che è fondamentalmente la definizione di un limite aggregato).
Quando un aggregato deve conoscere lo stato al di fuori del proprio confine, la solita risposta è un DomainService . L'aggregato richiama una query sul servizio e il servizio riporta la risposta.
I pattern di creazione sono strani, però - l'entità che stai chiedendo di mantenere l'invariante non esiste ancora. Puoi gestire il caso in due modi.
L'approccio che preferisco è usare uno stato comune per inizializzare l'aggregato, e quindi invocare un metodo su di esso per dare a questa entità un'identità unica. Questo si adatta al modello generale.
In alternativa, è possibile delegare la creazione dell'aggregato a una fabbrica. Fondamentalmente, questa è la stessa idea, con il confine della transazione disegnato in un posto diverso. L'esecuzione di base (richiede un servizio di dominio per verificare l'ultimo stato conosciuto del tuo stato esterno).
I want to enforce this relation so only predefined task types can be actually used to create a Task.
Se TaskType
è un valore, puoi anche risolverlo quando traduci il messaggio CreateTask. Presumibilmente quel messaggio ha qualche bit di stato che identifica il tipo, quindi fai una ricerca su quello stato prima di creare l'aggregato. Questo è un modello di convalida dell'input di base.
In alternativa, è possibile inviare inizialmente il comando create a TaskType, che si copierà nel comando per creare l'attività. Concettualmente, ciò ha molto più senso se TaskType è un'entità, piuttosto che un valore, ma in entrambi i casi funziona. Vedi Non creare Root aggregati per alcune riflessioni su questo approccio.
Se TaskType è qualcosa che può "andare via", allora ci sono limiti reali a quanto il dominio può fare per garantire la tua regola. In molti casi, risulta che non è fondamentale per l'azienda che la regola venga seguita esattamente (ad esempio, l'incoerenza è rara, facile da identificare, economica da rimediare); in tal caso la bonifica anziché la convalida può essere più pratica.