У UserManager <IdentityUser>есть кеш? - PullRequest
1 голос
/ 26 марта 2019

У меня есть приложение, которое использует Microsoft.AspNetCore.Identity.UserManager для управления пользователями. Я использую ядро ​​2.2. UserManager внедряется встроенным внедрением зависимостей в мои сервисы (не мной) . как это:

public MyService(UserManager<IdentityUser> userManager)
{
   _userManager = userManager;
}

Когда я пытаюсь получить пользователя по Id (FindByIdAsync) в первый раз, я вижу запрос к db в консоли. Следующие запросы с таким же Id я не вижу ни одного запроса к БД, но приложение работает и получил пользователя.

В Startup.cs у меня нет конфигурации для userManager. Я просто использую метод расширения:

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());
        }

Вопрос : Может быть, есть способ, как настроить эту функцию кэширования в UserManager? Укажите, где можно получить информацию о том, как долго хранится этот кеш.

1 Ответ

2 голосов
/ 26 марта 2019

Я копался в исходном коде Identity на Github и закончился 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 beeing типа DbSet<TUser>, Identity не имеет возможности напрямую управлять кэшированием, но использует внутренние компоненты EF.

Копаясь в исходном коде EF, я закончил 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;
}

и похоже, что существует механизм кэширования, поддерживаемый простым и простым Dictionary.

Однако, как указал Мэтт Г. в своем комментарии, решение для управления кэшированием находится на уровне выше вашего сервиса: оно связано с тем, как вы управляете своей областью зависимости при внедрении UserManager.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...