web-dev-qa-db-fra.com

Cache mémoire dans le noyau dotnet

J'essaie d'écrire une classe pour gérer le cache mémoire dans une bibliothèque de classes de base .net. Si je n'utilise pas le noyau, je pourrais écrire

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());
                }
                ....
        }
}
}

Dans le noyau .Net, je n'ai pas pu trouver System.Runtime.Cache. Après avoir lu le noyau .net In Memory Cache , j'ai ajouté la référence Microsoft.Extensions.Caching.Memory (1.1.0) et essayé

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);
                                    }
                                ));
                    }
                    ....
            }
    }
}

Le code Hope dans la méthode de sauvegarde est correct, bien que la plupart de mes tests de mycache échouent pour le moment. Quelqu'un peut-il indiquer ce qui ne va pas? La principale question concerne le constructeur Que dois-je faire pour définir le cache à la place MemoryCache.Default

_cache = memoryCache ?? MemoryCache.Default; 
9
MJK

Le constructeur est:

using Microsoft.Extensions.Caching.Memory;

. . .

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