本来想发布下新版Luke.Net,正好刚刚再次重构了缓存的帮助类这里发布下:
测试代码
[Fact] public void SimpleTest() { ICachecacheMenager = MemoryCache .Instance; var value = cacheMenager.Get(1, () => 1, TimeSpan.FromSeconds(10)); Assert.Equal(value, 1); value = cacheMenager.Get(1, () => 2, TimeSpan.FromSeconds(10)); Assert.Equal(value, 1); System.Threading.Thread.Sleep(10 * 1000); value = cacheMenager.Get(1, () => 3, TimeSpan.FromSeconds(10)); Assert.Equal(value, 3); }
接口
public interface ICache{ TV Get (TK cacheKey, Func getUncachedValue, DateTimeOffset dateTimeOffset); TV Get (TK cacheKey, Func getUncachedValue, TimeSpan timeSpan); void Remove(TK cacheKey); }
用到的单例类
public class SingletonProviderwhere T : new() { SingletonProvider() { } public static T Instance { get { return SingletonCreator.instance; } } class SingletonCreator { static SingletonCreator() { } internal static readonly T instance = new T(); } }
最后是更新后的缓存类,
public class MemoryCache: ICache { private ObjectCache _memoryCache; public static MemoryCache Instance { get { return SingletonProvider >.Instance; } } public MemoryCache() : this(null) { } public MemoryCache(string name) { _memoryCache = new MemoryCache(string.Format("{0}-{1}-{2}", typeof(TK).Name, typeof(TV).Name, name)); } public TV Get (TK cacheKey, Func getUncachedValue, DateTimeOffset dateTimeOffset) { if (_memoryCache.Contains(ParseKey(cacheKey))) { return (TV)_memoryCache[ParseKey(cacheKey)]; } else { var v = getUncachedValue(); object o = v; _memoryCache.Set(ParseKey(cacheKey), o, dateTimeOffset); return v; } } public TV Get (TK cacheKey, Func getUncachedValue, TimeSpan timeSpan) { return Get(cacheKey, getUncachedValue, new DateTimeOffset(DateTime.UtcNow + timeSpan)); } public void Remove(TK cacheKey) { _memoryCache.Remove(ParseKey(cacheKey)); } private string ParseKey(TK key) { return key.GetHashCode().ToString(); } }