Attualmente stiamo utilizzando Entity Framework come ORM in alcune applicazioni Web e fino ad ora, ci ha adattato bene poiché tutti i nostri dati sono archiviati in un unico database. Stiamo utilizzando il modello di repository e disponiamo di servizi (livello di dominio) che li utilizzano e restituiscono le entità EF direttamente ai controller MVC ASP.NET.
Tuttavia, è emersa la necessità di utilizzare un'API di terze parti (tramite un servizio Web) che ci fornirà ulteriori informazioni relative all'utente nel nostro database. Nel nostro database utenti locale, memorizzeremo un ID esterno che possiamo fornire all'API per ottenere ulteriori informazioni. Sono disponibili molte informazioni, ma per motivi di semplicità, una di queste riguarda l'azienda dell'utente (nome, responsabile, stanza, titolo di lavoro, posizione 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? Poiché viene utilizzato in vari luoghi, non è davvero ragionevole recuperarlo su una base ad-hoc ovunque utilizziamo nell'applicazione Web, quindi ha senso restituire questi dati aggiuntivi dal livello di dominio.
Il mio pensiero iniziale era solo quello di creare una classe di modello wrapper che avrebbe contenuto l'entità EF (EFUser) e una nuova classe "ApiUser" contenente le nuove informazioni - e quando otteniamo un utente, otteniamo l'EFUser e quindi riceviamo l'ulteriore informazioni dall'API e popola l'oggetto ApiUser. Tuttavia, mentre ciò andrebbe bene per ottenere singoli utenti, cade quando si ottengono più utenti. Non possiamo colpire l'API quando si ottiene un elenco di utenti.
Il mio secondo pensiero era solo quello di aggiungere un metodo singleton all'entità EFUser che restituisce ApiUser e lo popolava solo quando necessario. Questo risolve il problema di cui sopra poiché accediamo ad esso solo quando ne abbiamo bisogno.
Oppure il pensiero finale era quello di conservare una copia locale dei dati nel nostro database e sincronizzarli con l'API quando l'utente accede. Questo è un lavoro minimo in quanto è solo un processo di sincronizzazione - e non abbiamo il sovraccarico di colpire il DB e l'API ogni volta che vogliamo ottenere informazioni sull'utente. Tuttavia, ciò significa archiviare i dati in due posizioni e significa che i dati non sono aggiornati per tutti gli utenti che non effettuano l'accesso da un po 'di tempo.
Qualcuno ha qualche consiglio o suggerimento su come gestire al meglio questo tipo di scenario?
it's not really sensible to fetch it on an ad-hoc basis
-- Perché? Per motivi di prestazioni?