Управление кэшированными объектами EF Core
Есть бэк на .net 6 который выполняет множество запросов в БД и часть самых тяжелых кеширует:
public class Class1Repository: IClass1Repository
{
private readonly string _objectName = "Class1";
private readonly DbContext _context;
private readonly IMemoryCache _memoryCache;
...
public Class1Repository(DbContext context, IMemoryCache memoryCache,...)
{
_context = context;
_memoryCache = memoryCache;
...
}
private async Task<List<Class1ResponseItem>> GetClass1Async(Guid id)
{
if(!_memoryCache.TryGetValue(_objectName, out List<Class1ResponseItem> result))
{
result = await _context.....
.ToListAsync()
.ConfigureAwait(false);
_memoryCache.Set(_objectName, result,...)
}
}
private async Task<List<Class1ResponseItem>> UpdateClass1Async(List<string> Class1Names)
{
//Upadate Class1
_memoryCache.Remove(_objectName);
_memoryCache.Remove("Class2");
_memoryCache.Remove("Class3");
_memoryCache.Remove("Class4");
_memoryCache.Remove("Class5");
}
}
public Class1ResponseItem
{
public string Class1Name {get; set;}
public Guid Class1ID {get; set;}
...
}
public Class2ResponseItem
{
public string Class2Name {get; set;}
public Guid Class2ID {get; set;}
...
public string Class1Name {get; set;}
}
public Class3ResponseItem
{
public string Class3Name {get; set;}
public Guid Class3ID {get; set;}
...
public string Class1Name {get; set;}
}
public Class4ResponseItem
{
public string Class4Name {get; set;}
public Guid Class4ID {get; set;}
...
public string Class1Name {get; set;}
}
В выше приведённом примере Class2, Class3, Class4 и Class5 содержат поле с названием Class1Name. И при изменении class1Name(это может сделать пользователь) мне нужно удалять кэши которые содержат это поле, в противном случае пользователь может увидеть устаревшие данные. При этом на данный момент я делаю это вручную. Проблема в том, что кэшируемых объектов 75+ и все зависимости держать в голове проблематично.
Решил этот вопрос с помощью рефлексии. При стартапе приложения в отдельный класс добавляются все кэшируемые объекты. По всем полям добавленных классов строится граф зависимостей и далее метод remove выполняется через этот вспомогательный класс. В метод отдаётся только название _objectName изменившегося класса. По графу находятся классы которые содержат ссылку на изменившийся объект и удаляют их. Проблема этого метода в том, что всё зависит от названий переменных. Если название ввести не корректное (вместо Class1Name -> Cls2Nm), то метод перестанет корректно работать. Но мне кажется я изобретаю заново велосипед.
Какие существуют методы для поддержания кэша в актуальном состоянии?