本来想发布下新版Luke.Net,正好刚刚再次重构了缓存的帮助类这里发布下:
测试代码
[Fact]
public void SimpleTest()
{
ICache<int, string> cacheMenager = MemoryCache<int, string>.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<TK,TV>
{
TV Get<TV>(TK cacheKey, Func<TV> getUncachedValue, DateTimeOffset dateTimeOffset);
TV Get<TV>(TK cacheKey, Func<TV> getUncachedValue, TimeSpan timeSpan);
void Remove(TK cacheKey);
}
用到的单例类
public class SingletonProvider<T> where 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<TK, TV> : ICache<TK, TV>
{
private ObjectCache _memoryCache;
public static MemoryCache<TK, TV> Instance
{
get { return SingletonProvider<MemoryCache<TK, TV>>.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<TV>(TK cacheKey, Func<TV> 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<TV>(TK cacheKey, Func<TV> 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();
}
}
作者:KKcat