Ho scritto questa risposta circa quattro anni fa e la mia opinione non è cambiata. Ma da allora ci sono stati sviluppi significativi sul fronte dei micro-servizi. Alla fine ho aggiunto note specifiche sui micro-servizi ...
Mi opporrò all'idea, con l'esperienza del mondo reale di sostenere il mio voto.
Sono stato portato a una grande applicazione che aveva cinque contesti per un singolo database. Alla fine, abbiamo finito per rimuovere tutti i contesti tranne uno: tornare a un singolo contesto.
All'inizio l'idea di più contesti sembra una buona idea. Siamo in grado di separare il nostro accesso ai dati in domini e fornire diversi contesti leggeri e puliti. Sembra DDD, vero? Ciò semplificherebbe il nostro accesso ai dati. Un altro argomento è per le prestazioni in quanto accediamo solo al contesto di cui abbiamo bisogno.
Ma in pratica, man mano che la nostra applicazione cresceva, molte delle nostre tabelle condividevano relazioni tra i nostri vari contesti. Ad esempio, le query alla tabella A nel contesto 1 richiedono anche l'unione della tabella B nel contesto 2.
Questo ci ha lasciato con un paio di scelte sbagliate. Potremmo duplicare le tabelle nei vari contesti. Ci abbiamo provato. Ciò ha creato diversi problemi di mappatura, incluso un vincolo EF che richiede che ogni entità abbia un nome univoco. Quindi abbiamo finito con entità denominate Person1 e Person2 nei diversi contesti. Si potrebbe sostenere che questo sia stato un design scadente da parte nostra, ma nonostante i nostri migliori sforzi, è così che la nostra applicazione è cresciuta nel mondo reale.
Abbiamo anche provato a interrogare entrambi i contesti per ottenere i dati di cui avevamo bisogno. Ad esempio, la nostra logica aziendale richiederebbe la metà di ciò di cui aveva bisogno dal contesto 1 e l'altra metà dal contesto 2. Ciò presentava alcuni problemi importanti. Invece di eseguire una query su un singolo contesto, abbiamo dovuto eseguire più query in contesti diversi. Questo ha una vera penalità prestazionale.
Alla fine, la buona notizia è che è stato facile eliminare i molteplici contesti. Il contesto deve essere un oggetto leggero. Quindi non penso che le prestazioni siano un buon argomento per più contesti. In quasi tutti i casi, ritengo che un singolo contesto sia più semplice, meno complesso e probabilmente funzionerà meglio e non sarà necessario implementare una serie di soluzioni alternative per farlo funzionare.
Ho pensato a una situazione in cui più contesti potrebbero essere utili. È possibile utilizzare un contesto separato per risolvere un problema fisico con il database in cui contiene effettivamente più di un dominio. Idealmente, un contesto sarebbe one-to-one per un dominio, che sarebbe one-to-one per un database. In altre parole, se un insieme di tabelle non è in alcun modo correlato alle altre tabelle in un determinato database, è probabile che debbano essere estratte in un database separato. Mi rendo conto che non è sempre pratico. Ma se un set di tabelle è così diverso che ti sentiresti a tuo agio nel separarle in un database separato (ma scegli di non farlo) allora potrei vedere il caso di usare un contesto separato, ma solo perché in realtà ci sono due domini separati.
Per quanto riguarda i micro-servizi, un singolo contesto ha ancora senso. Tuttavia, per i micro-servizi, ogni servizio avrebbe il proprio contesto che include solo le tabelle del database relative a quel servizio. In altre parole, se il servizio x accede alle tabelle 1 e 2 e il servizio y accede alle tabelle 3 e 4, ogni servizio avrebbe il proprio contesto univoco che include tabelle specifiche per quel servizio.
Sono interessato ai tuoi pensieri.