You may want to display the inventory level on the web page, or you may want to display the edition number of the inventory in stock (imagine your inventory is books, magazines etc). This information comes from the Inventory domain.
La cosa principale da notare a questo punto è che stai parlando di una visualizzazione, il che significa che l'utilizzo di dati obsoleti è accettabile.
Detto questo, non è necessario interagire con gli aggregati (che sono responsabili di impedire che le modifiche violino l'invarianza di business), ma con una rappresentazione di una copia recente dello stato dell'aggregato.
Quindi quello che mi aspetterei normalmente è una query eseguita contro il catalogo prodotti e un'altra esecuzione contro l'inventario, e qualcosa da comporre i due nel DTO che è necessario supportare la vista.
Load both the Product domain and the Inventory domain aggregates?
Quindi chiudi . Non abbiamo bisogno di caricare gli aggregati, perché non cambieremo nulla. Ma abbiamo bisogno del loro stato; quindi potremmo caricarlo. Detto questo, normalmente mi aspetto che i due domini funzionino in processi diversi. Pertanto, chiameremmo entrambi, non caricando entrambi.
Would you hold some properties on your Product domain entity for number in stock, and edition in stock, and then use Domain Events to update these when the Inventory entity is updated?
"Non attraversare i flussi. Sarebbe male."
Uso degli eventi per coordinare le informazioni tra contesti di dominio: idea di grande . Spingere concetti che appartengono a un dominio in un altro: opposto a una grande idea, eccetto di più.
Vuoi mantenere puliti i domini. Le applicazioni che interagiscono con i domini, non è così importante. Quindi, ad esempio, è ragionevole che l'applicazione Inventory chiami un servizio nell'applicazione del prodotto per interrogare alcuni concetti specifici del prodotto da aggiungere a una vista. O viceversa.
Non conosco alcun motivo per cui una singola applicazione debba essere limitata a un singolo dominio. Finché esiste un'unica fonte di verità, puoi distribuire le transazioni in qualsiasi modo.
But just to think this through, in the example above we would end up with potentially 2 DB tables for product catalog and product inventory. Now, do we use the same identifier in these as it's the same product.
Questo sarebbe il modo più semplice. In termini più ampi, si utilizza lo stesso identificatore perché l'entità del mondo reale è la stessa; i due diversi contesti limitati model quell'entità in modo diverso, ma il modello non è l'entità del mondo reale.
Quando non funziona, avrai bisogno di una query da utilizzare per colmare il divario. Penso che la variazione più comune di questo è che la nuova entità conserva l'id dell'entità più vecchia. Lo vedrete anche in un singolo BC: i candidati, una volta approvati, diventano clienti. È un aggregato diverso (lo stato associato a un cliente è soggetto a una diversa invarianza rispetto a quella del richiedente); quindi se il livello di persistenza sta utilizzando i flussi di eventi, il flusso per il nuovo aggregato avrà bisogno di un identificatore diverso. Quindi ci sarà un po 'di stato da qualche parte che dice "questo candidato è diventato questo cliente".
Or, could we use 1 table and 1 table row for the data and simply map the relevant data onto the aggregate properties?
YIKES! No, non farlo. Stai aggiungendo la contesa per le transazioni senza alcun motivo commerciale per farlo.