Управление кэшированными объектами 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), то метод перестанет корректно работать. Но мне кажется я изобретаю заново велосипед.

Какие существуют методы для поддержания кэша в актуальном состоянии?


Ответы (0 шт):