web-dev-qa-db-ja.com

ドットネットコアのメモリキャッシュ

.netコアクラスライブラリでメモリキャッシュを処理するクラスを作成しようとしています。コアを使用しない場合は、次のように書くことができます

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 core 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テストのほとんどは現在失敗していますが、saveメソッド内のコードは問題ありません。誰かが間違っていることを指摘してもらえますか?主な質問はコンストラクターについてです。代わりにキャッシュを設定するにはどうすればよいですかMemoryCache.Default

_cache = memoryCache ?? MemoryCache.Default; 
9
MJK

コンストラクタは次のとおりです。

using Microsoft.Extensions.Caching.Memory;

。 。 。

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