2017-01-06 12 views
2

Я пытаюсь написать класс для обработки кеша памяти в .NET-классе. Если я использую не ядро, то я мог бы написатьКэш памяти в ядре dotnet

using System.Runtime.Caching; 
using System.Collections.Concurrent; 

namespace n{ 
public class MyCache 
{ 
     readonly MemoryCache _cache; 
     readonly Func<CacheItemPolicy> _cachePolicy; 
     static readonly ConcurrentDictionary<string, object> _theLock = new ConcurrentDictionary<string, object>(); 

     public MyCache(){ 
      _cache = MemoryCache.Default; 
      _cachePolicy =() => new CacheItemPolicy 
      { 
       SlidingExpiration = TimeSpan.FromMinutes(15), 
       RemovedCallback = x =>  
       { 
        object o; 
        _theLock.TryRemove(x.CacheItem.Key, out o); 
       } 
      }; 
     } 
     public void Save(string idstring, object value){ 
       lock (_locks.GetOrAdd(idstring, _ => new object())) 
       { 
         _cache.Add(idstring, value, _cachePolicy.Invoke()); 
       } 
       .... 
     } 
} 
} 

В пределах .Net ядра я не мог найти System.Runtime.Cache. После прочтения ядра .net In Memory Cache, я добавил ссылочный Microsoft.Extensions.Caching.Memory (1.1.0) и попытался

using System.Collections.Concurrent; 
using Microsoft.Extensions.Caching.Memory; 

namespace n 
{ 
    public class MyCache 
    { 
      readonly MemoryCache _cache; 
      readonly Func<CacheItemPolicy> _cachePolicy; 
      static readonly ConcurrentDictionary<string, object> _theLock = new ConcurrentDictionary<string, object>(); 
      public MyCache(IMemoryCache memoryCache){ 
        _cache = memoryCache;// ?? **MemoryCache**; 
      } 

      public void Save(string idstring, object value){ 
        lock (_locks.GetOrAdd(idstring, _ => new object())) 
        { 
          _cache.Set(idstring, value, 
           new MemoryCacheEntryOptions() 
           .SetAbsoluteExpiration(TimeSpan.FromMinutes(15)) 
           .RegisterPostEvictionCallback(
            (key, value, reason, substate) => 
            { 
             object o; 
             _locks.TryRemove(key.ToString(), out o); 
            } 
           )); 
        } 
        .... 
      } 
    } 
} 

Надежда код метод сохранения нормально, хотя большинство моего MyCache тестов неудача в данный момент. Кто-нибудь может указать, что не так? Главный вопрос о конструкторе Что я должен сделать, чтобы установить кэш вместо MemoryCache.Default

_cache = memoryCache ?? MemoryCache.Default; 

ответ

9

Конструктор:

using Microsoft.Extensions.Caching.Memory; 

. . .

MemoryCache myCache = new MemoryCache(new MemoryCacheOptions());