Nella maggior parte dei domini, c'è un'app che "prepara" i dati e un'altra app che "serve" i dati preparati. I dati, tuttavia, provengono dallo stesso dominio principale, il che causa un po 'di confusione nella modellazione.
Alcuni esempi:
- In un'app di spedizione / carico, ci sarà un'interfaccia utente per la gestione: i membri dello staff aggiungeranno / aggiorneranno / cancelleranno carichi, viaggi e clienti. Quindi, in un'altra interfaccia utente o in una parte dell'applicazione, qualcuno sfrutterà questi dati preparati per eseguire il pesante sollevamento dei carichi corrispondenti ai viaggi, in base alle richieste dei clienti, esponendoli magari come API.
- In un'applicazione pubblicitaria, ci sarà un'interfaccia utente in cui il personale o gli inserzionisti possono aggiungere / aggiornare / eliminare annunci, che includeranno offerte, restrizioni (geo, dispositivi, ecc.). Un'altra app prenderà questa informazione e la userà per "servire" i dati preparati.
Ci sono un sacco di altri esempi ma condividono lo stesso schema: preparazione dei dati e pubblicazione degli stessi dati. Entrambe condividono le stesse informazioni, come le restrizioni sugli annunci e i pagamenti nel dominio pubblicitario, ma le usano in contesti diversi. "Preparare" può essere comunemente basato su CRUD, mentre "servire" è più coinvolto.
Come si modellano questi? Dovrebbe esserci un singolo contesto limitato relativo al dominio principale in cui vengono utilizzate le stesse entità? Oppure devono essere considerati contesti completamente separati, in cui un kernel condiviso può includere ID entità e forse un database sottostante condiviso?
Ho esaminato il modello CQRS che potrebbe essere utile. Per utilizzare il dominio pubblicitario, "preparare" i dati potrebbe utilizzare sia comandi che query (una specie di pattern CRUD), mentre il "serving" potrebbe utilizzare query dedicate (che ovviamente sarebbero molto diverse).
Tuttavia, non riesco a scuotere la sensazione che separare completamente questi elementi creerebbe molta duplicazione, oltre a un elevato accoppiamento, ad es. se viene aggiunta una nuova restrizione su un annuncio (forse "nome del sistema operativo"), dovrebbe essere simultaneamente aggiunta alle fasi di "preparazione" e "utilizzo".