Ho un'applicazione che utilizza Microsoft.AspNetCore.Identity.UserManager per gestire gli utenti. Uso il core 2.2. UserManager viene iniettato tramite iniezione di dipendenza integrata nei miei servizi (non da me) . come questo:
public MyService(UserManager<IdentityUser> userManager)
{
_userManager = userManager;
}
Quando provo a ottenere un utente tramite Id (FindByIdAsync) per la prima volta, vedo una richiesta di db in una console. Prossime richieste con lo stesso ID Non vedo alcuna richiesta a db, ma l'applicazione funziona e ha ottenuto l'utente.
In Startup.cs non ho una configurazione per userManager. Uso solo il metodo di estensione:
public void ConfigureServices(IServiceCollection services)
{
services
.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("MyConnectionString"));
services
.AddIdentity<IdentityUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
services.AddMvc();
var configService = new ConfigurationService(Configuration);
services
.AddIdentityServer()
.AddDeveloperSigningCredential()
.AddInMemoryApiResources(configService.GetApiResources())
.AddInMemoryClients(configService.GetClients())
.AddTestUsers(configService.GetUsers());
}
Domanda : forse esiste un modo per configurare questa funzione di memorizzazione nella cache in UserManager? Fammi sapere dove ottenere informazioni sulla durata della cache.
Ho scavato attraverso il codice sorgente Identity su Github e sono finito in UserStore
:
public override Task<TUser> FindByIdAsync(string userId, CancellationToken cancellationToken = default(CancellationToken))
{
cancellationToken.ThrowIfCancellationRequested();
ThrowIfDisposed();
var id = ConvertIdFromString(userId);
return UsersSet.FindAsync(new object[] { id }, cancellationToken);
}
UsersSet
di tipo DbSet<TUser>
, Identity non ha modo di gestire direttamente la memorizzazione nella cache, ma si basa su interni EF.
Scavando nel codice sorgente EF, sono finito in DbContext
:
object IDbSetCache.GetOrAddSet(IDbSetSource source, Type type)
{
CheckDisposed();
if (_sets == null)
{
_sets = new Dictionary<Type, object>();
}
if (!_sets.TryGetValue(type, out var set))
{
set = source.Create(this, type);
_sets[type] = set;
}
return set;
}
e sembra che esista un meccanismo di memorizzazione nella cache supportato da un Dictionary
semplice e chiaro.
Tuttavia, come ha sottolineato Matt G. nel suo commento, la soluzione per gestire la memorizzazione nella cache si trova al di sopra del vostro servizio: è correlata al modo in cui gestite il vostro ambito di dipendenza durante l'iniezione di UserManager
.