В обычных ситуациях вы бы создали собственный механизм кэширования.
Вы можете начать с определения интерфейса кэширования с некоторыми типичными процедурами кэширования:
//note: using interface so implementation can be changed later
public interface ICache
{
//store by key, use resolver if not present.
T GetOrAdd(string key, Func<T> resolver);
//invalidate all
void Invalidate();
//invalidate by key
void Invalidate(string key);
}
Итак, теперь вам нужна реализация. В зависимости от вашего варианта использования это может быть HttpCache или другой MemoryCache, даже хеш-таблица. Я оставлю это на ваше усмотрение.
Теперь, поскольку это кеш, обычно используется одноэлементная структура, чтобы обеспечить наличие только одного кеша. Обычно этим управляют контейнеры IoC, такие как Unity
или AutoFac
.
Затем, в зависимости от вашего другого кода, вы можете использовать этот кеш в своих запросах. Кому-то нравятся репозитории, другие сервисы. Мне нравится Разделение запросов и команд.
Если вы реализовали это, то использование кеша тривиально, и вы можете применить это к своим состояниям.
Пример:
var address = _db.Addresses.Where(p=>p.Id == id).FirstOrDefault();
var state = cache.GetOrUpdate($"state-{address.StateProvinceId}",
() =>_db.StateProvinces.FirstOrDefault(c => c.Id == address.StateProvinceId));
Но я должен сказать, создание DTO может быть полезно при разделении слоев данных / предметной области. Более того; Вы можете спросить себя, что означает адрес без состояния или что означает stateId в контексте предприятия. Просто сказать; Есть тонны решений, которые могут быть действительными здесь.