using System; using System.Collections.Generic; using Enyim.Caching; using Expedience.Infrastructure.Models; using Microsoft.EntityFrameworkCore; namespace Expedience.Infrastructure { public interface IRepository : IDisposable { Task> GetDutyCompletionRecords(string expac, CancellationToken cancellationToken); } public class ExpedienceRepository : IRepository { private readonly ExpedienceContext _dbContext; private readonly IMemcachedClient _memcachedClient; public ExpedienceRepository(ExpedienceContext dbContext, IMemcachedClient memcachedClient) { _dbContext = dbContext; _memcachedClient = memcachedClient; } public async Task> GetDutyCompletionRecords(string expac, CancellationToken cancellationToken) { var cacheKey = $"xpd-dcr-{expac}"; if (_memcachedClient.TryGet>(cacheKey, out var cachedValue)) { return cachedValue; } else { var records = await _dbContext.DutyCompletionRecords.FromSqlInterpolated($"CALL get_dutycompletionrecords {expac}") .ToListAsync(); await _memcachedClient.AddAsync(cacheKey, records, TimeSpan.FromMinutes(10)); return records; } } public void Dispose() { _dbContext.Dispose(); } } }