Элементы, отсутствующие в кеше после его добавления. с использованием веб-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);
    }

Любые идеи, почему я вижу, что элементы успешно добавлены, но когда я пытаюсь получить их во второй раз, в кеше ничего нет? Я предполагаю, что кэш памяти создается при каждом запросе? Как я могу остановить это и позволить моему объекту кеша сохраняться?


person Jonny C    schedule 08.08.2014    source источник


Ответы (1)


Похоже, он глючит:

Stackoverflow: привязка Singleton Scope не работает должным образом
Stackoverflow: 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);
person Stefan Ossendorf    schedule 20.11.2014