1 messaggio dal 15 settembre 2018
Buongiorno,

di solito scrivo nei forum inglesi di .NET ma in effetti non ho mai provato ad aprire un topic anche da voi in italiano, proviamo :D

Sto scrivendo una WebAPI in .NET Core al momento e devo fare delle chiamate esterne alla Google Directions API, il modo in cui faccio queste chiamate dipende da dei dati presi dal database e una volta processato il tutto ritorno al frontend i dati finali.

La mia domanda é questa: in che modo posso "cachare", mettere nella cache i dati che la Google API mi restituisce cosí che in futuro in caso rifaccio la stessa chiamata possa usare il valore salvato nella cache invece che rieffettuare la chiamata a GoogleAPI (che costa ed hanno un tetto massimo di chiamate!)?

Grazie mille in anticipo!
11.886 messaggi dal 09 febbraio 2002
Contributi

non ho mai provato ad aprire un topic anche da voi in italiano, proviamo :D


Benvenuto nel forum, ottima scelta!


in che modo posso "cachare", mettere nella cache i dati che la Google API mi restituisce

Usando il servizio IMemoryCache che trovi documentato qui e di cui puoi ottenere un'istanza grazie alla dependency injection di ASP.NET Core.

Ecco un esempio in cui vedi due metodi:
  • GetGoogleDataAsync che ottiene i dati usando sempre la Google API. È il metodo che hai già;
  • GetCachedDataAsync è un nuovo metodo che dovrai creare e che si avvale del servizio IMemoryCache per prelevare i dati dalla cache. Se i dati non ci sono, perché ad esempio è la primissima richiesta o perché è trascorso un tempo limite, allora andrà a recuperarli da GetGoogleDataAsync, e poi li metterà in cache prima di restituirli al chiamante. Così, dalla seconda richiesta in poi, i risultati potranno essere tratti dalla cache.

Il chiamante ovviamente dovrà usare il metodo GetCachedDataAsync. Se vuoi evitare abusi, rendi privato l'altro metodo GetGoogleDataAsync.

private async Task<GoogleData> GetGoogleDataAsync()
{
   GoogleData data = //TODO: qui metti la logica di ottenimento dei dati con Google API
   
   return data;
}

public Task<GoogleData> GetCachedDataAsync()
{
  string cacheKey = "GoogleApiData";
  return memoryCache.GetOrCreateAsync(cacheKey, cacheEntry => 
  {
    cacheEntry.SetAbsoluteExpiration(TimeSpan.FromSeconds(60));
    //Restituisco i dati ottenuti grazie alla Google API
    return GetGoogleDataAsync();
  });
}

Come vedi nell'esempio, ho chiamato il metodo GetOrCreateAsync del servizio IMemoryCache che si occuperà, in maniera atomica, di cercare il risultato nella cache e di invocare GetGoogleDataAsync se non fosse trovato.

Il risultato resterà in cache per 60 secondi, grazie alla chiamata a SetAbsoluteExpiration. Tu ovviamente hai facoltà di modificare questo tempo. Il servizio IMemoryCache è thread safe, quindi non teme parecchi accessi contemporanei: hai la garanzia che verrà fatta una richiesta con Google API al massimo una volta ogni 60 secondi.

La variabile memoryCache è appunto l'istanza di IMemoryCache ottenuta grazie alla dependency injection. Sai cos'è la dependency injection e come sfruttarla?

ciao,
Moreno
Modificato da BrightSoul il 04 settembre 2019 13:38 -

Enjoy learning and just keep making

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.