Элементы не в кеше после добавления. использование Web Api и кеша памяти
Когда я добавляю элементы в кэш памяти, при следующем запросе он становится пустым. Кто-нибудь может мне помочь?
Вот мой сервис кеша:
public class CacheService : ICacheService
{
private readonly ObjectCache _cache;
public CacheService(ObjectCache cache)
{
_cache = cache;
}
public virtual void Add(object item, string key, int cacheTime, ExpirationInterval expirationInterval = ExpirationInterval.Hours)
{
if (item == null)
return;
var cachePolicy = new CacheItemPolicy();
switch (expirationInterval)
{
case ExpirationInterval.Minutes:
cachePolicy.SlidingExpiration = new TimeSpan(0, cacheTime, 0);
break;
case ExpirationInterval.Hours:
cachePolicy.AbsoluteExpiration = DateTime.Now.AddHours(cacheTime);
break;
case ExpirationInterval.Infinite:
cachePolicy.AbsoluteExpiration = ObjectCache.InfiniteAbsoluteExpiration;
break;
default:
throw new ArgumentOutOfRangeException("expirationInterval");
}
_cache.Add(key, item, cachePolicy);
}
public bool Exists(string key)
{
return _cache[key] != null;
}
public T Get<T>(string key)
{
return (T)_cache[key];
}
Зарегистрируйте мой сервис на ninject здесь:
kernel.Bind<System.Runtime.Caching.ObjectCache>()
.To<System.Runtime.Caching.MemoryCache>()
.InSingletonScope()
.WithConstructorArgument("name", "Enquiries")
.WithConstructorArgument("config", (object) null);
Затем я использую кеш-сервис ниже в службе запросов:
public class EnquiriesService : IEnquiriesService
{
private readonly ICacheService _cacheService;
private readonly IUnitOfWork _unitOfWork;
public EnquiriesService(ICacheService cacheService, IUnitOfWork unitOfWork)
{
_cacheService = cacheService;
_unitOfWork = unitOfWork;
}
public IEnumerable<Enquiry> GetEnquiries(DateTime date)
{
var cacheName = "Enquires_" + date.ToShortDateString();
IEnumerable<Enquiry> enquiries;
if (_cacheService.Exists(cacheName))
{
enquiries = _cacheService.Get<IEnumerable<Enquiry>>(cacheName);
}
else
{
enquiries =
_unitOfWork.EnquiriesRepository.GetAll()
.Where(x => DbFunctions.TruncateTime(x.DateOfEnquiry) == date.Date);
_cacheService.Add(enquiries, cacheName, 24);
}
return enquiries;
}
этот сервис затем вводится в мой контроллер:
public EnquiriesController(IEnquiriesService enquiriesService)
{
_enquiriesService = enquiriesService;
}
[HttpGet]
public IEnumerable<Enquiry> Enquiries(DateTime date)
{
return _enquiriesService.GetEnquiries(date);
}
Любые идеи, почему я вижу, что элементы успешно добавлены, но когда я пытаюсь получить их во второй раз, в кеше ничего нет? Я предполагаю, что кэш памяти создается при каждом запросе? Как я могу остановить это и позволить моему объекту кэша сохраниться?
1 ответ
Похоже, это глючит:
Stackru: привязка Singleton Scope не работает должным образом
Переполнение стека: Ninject InSingletonScope с Web Api RC
Оба поста старые, но вы, похоже, сталкиваетесь с одними и теми же проблемами. Может быть, вы должны использовать этот подход вместо этого:
kernel.Bind<System.Runtime.Caching.ObjectCache>()
.To<System.Runtime.Caching.MemoryCache>()
.ToConstant(new MemoryCache("Enquiries"));
или просто
kernel.Bind<System.Runtime.Caching.ObjectCache>()
.To<System.Runtime.Caching.MemoryCache>()
.ToConstant(MemoryCache.Default);