Данные о текущем пользователе не сохраняются в MemoryCache
Я создал UserSessionService для того, чтобы там хранить информацию о текущем пользователе через MemoryCache. Зарегистрировал его, как Singleton в DI.
public class UserSessionService: IUserSessionService
{
private readonly IMemoryCache _memoryCache;
public UserSessionService(IMemoryCache memoryCache)
{
_memoryCache = memoryCache;
}
public void SetUserData(string key, object value, TimeSpan? absoluteExpirationRelativeToNow = null)
{
var cacheEntryOptions = new MemoryCacheEntryOptions
{
AbsoluteExpirationRelativeToNow = absoluteExpirationRelativeToNow ?? TimeSpan.FromHours(1)
};
_memoryCache.Set(key, value, cacheEntryOptions);
}
public T GetUserData<T>(string key)
{
if (_memoryCache.TryGetValue(key, out T value))
{
return value;
}
else
{
return default;
}
}
}
public static IHostBuilder CreateHostBuilder(string[] Args)
{
var host = Host.CreateDefaultBuilder(Args)
.ConfigureServices((context, services) =>
{
services.AddDbContext<CandyKeeperDbContext>(options =>
{
options.UseSqlServer(context.Configuration.GetConnectionString("DefaultConnection"));
}, ServiceLifetime.Singleton);
services.AddMemoryCache();
services.AddRepositories();
services.AddServices();
services.AddViewModels();
services.EnsureRolesExist(context.Configuration.GetConnectionString("DefaultConnection")!, roleNames);
});
return host;
}
Когда пользователь авторизуется, то я добавляю данные в MemoryCache
public async void OnLoginCommandExecuted(object p)
{
await _semaphore.WaitAsync();
try
{
var user = await _accountService.Login(_currentUser.Name, _currentUser.PasswordHashed);
if (user == null)
throw new Exception("user null");
CurrentUser = new User
{
Id = user.Id,
Name = user.Name,
PasswordHashed = user.PasswordHashed,
PrincipalId = user.PrincipalId,
StoreId = user.StoreId,
IsBlocked = user.IsBlocked
};
if (CurrentUser.IsBlocked)
throw new MemberAccessException();
_userSessionService.SetUserData("CurrentUser", CurrentUser, TimeSpan.FromHours(1));
MainWindow window = new MainWindow();
_showMainEvent?.Invoke(null, CurrentUser);
window.Show();
}
catch (MemberAccessException ex)
{
IsBlockedAccount = true;
CurrentUser = new();
}
catch (Exception ex)
{
IsInvalidCredentials = true;
CurrentUser = new();
}
finally
{
_semaphore.Release();
}
}
Потом, когда я перехожу на вкладку с продукцией, в ProductForSaleViewModel я по идее должен получить тот же самый экземпляр UserSessionService с добавленной информацией о текущем пользователе в MemoryCache, но он пустой(Count 0)
public ProductForSaleViewModel(IProductForSaleService service,
IProductService productService,
IStoreService storeService,
IProductDeliveryService productDeliveryService,
IPackagingService packagingService,
IConfiguration configuration,
IUserService userService,
IUserSessionService userSessionService)
{
//инициализация сервисов
_userSessionService = userSessionService;
_configuration = configuration;
CurrentUser = _userSessionService.GetUserData<User>("CurrentUser");
//Регистрация команд
_productForSales = new ObservableCollection<ProductForSale>();
_roles = GetDatabaseRoles();
OnGetCommandExecuted(null);
}