Attualmente stiamo utilizzando Entity Framework come un ORM su alcune applicazioni Web, e fino ad ora ci ha soddisfatto come tutti i nostri dati sono archiviati in un singolo database. Stiamo utilizzando il modello di repository e disponiamo di servizi (il livello del dominio) che li utilizzano e restituiscono le entità EF direttamente ai controller MVC di ASP.NET.
Tuttavia, è arrivato il requisito di utilizzare un'API di terze parti (tramite un servizio web) che ci fornirà informazioni aggiuntive relative all'utente nel nostro database. Nel nostro database utenti locale, memorizzeremo un ID esterno che possiamo fornire all'API per ottenere ulteriori informazioni. Vi sono molte informazioni disponibili, ma per semplicità, una di queste è relativa alla società dell'utente (nome, responsabile, stanza, titolo di lavoro, ubicazione, ecc.). Queste informazioni verranno utilizzate in vari punti delle nostre app Web, anziché essere utilizzate in un unico posto.
Quindi la mia domanda è: dov'è il posto migliore per popolare e accedere a queste informazioni? Dato che viene utilizzato in vari luoghi, non è molto sensato scaricarlo su una base ad hoc ovunque utilizziamo nell'applicazione Web, quindi è opportuno restituire questi dati aggiuntivi dal livello dominio.
Il mio pensiero iniziale era solo quello di creare una classe di modello wrapper che contenga l'entità EF (EFUser) e una nuova classe 'ApiUser' contenente le nuove informazioni - e quando otteniamo un utente, otteniamo EFUser, e poi ottenere le informazioni aggiuntive dall'API e popolare l'oggetto ApiUser. Tuttavia, mentre ciò andrebbe bene per ottenere utenti singoli, cade quando si ottengono più utenti. Non possiamo raggiungere l'API quando ottieni un elenco di utenti.
Il mio secondo pensiero era solo quello di aggiungere un metodo singleton all'entità EFUser che restituisce l'ApiUser, e basta popolarlo quando necessario. Questo risolve il problema di cui sopra poiché accediamo solo quando ne abbiamo bisogno.
O il pensiero finale era di mantenere una copia locale dei dati nel nostro database e sincronizzarla con l'API quando l'utente si collegava. Questo è un lavoro minimo in quanto è solo un processo di sincronizzazione - e non abbiamo il sovraccarico di colpire DB e API ogni volta che vogliamo ottenere informazioni sugli utenti. Tuttavia, questo significa archiviare i dati in due punti e significa anche che i dati non sono aggiornati per qualsiasi utente che non ha effettuato l'accesso per un po 'di tempo.
Qualcuno ha qualche consiglio o suggerimento su come meglio gestire questo tipo di scenario?