Cache.cs
1 using sage.ew.global;
2 using System;
3 using System.Collections.Generic;
4 using System.Linq;
5 using System.Reflection;
6 using System.Text;
7 using System.Threading.Tasks;
8 using System.Web.Caching;
9 
10 namespace sage.ew.global
11 {
12  internal class Cache<TKey, TValue>
13  {
14  private readonly Dictionary<TKey, CacheItem<TValue>> _cache = new Dictionary<TKey, CacheItem<TValue>>();
15  public void Store(TKey key, TValue value, TimeSpan expiresAfter)
16  {
17  _cache[key] = new CacheItem<TValue>(value, expiresAfter);
18  }
19  public void Store(TKey key, TValue value)
20  {
21  _cache[key] = new CacheItem<TValue>(value);
22  }
23 
24  public TValue Get(TKey key)
25  {
26  if (!_cache.ContainsKey(key)) return default(TValue);
27 
28  var cached = _cache[key];
29  if ( cached.ExpiresAfter != null &&
30  DateTimeOffset.Now - cached.Created >= cached.ExpiresAfter)
31  {
32  _cache.Remove(key);
33  return default(TValue);
34  }
35  return cached.Value;
36  }
37  }
38 
39  internal class CacheItem<T>
40  {
41  public CacheItem(T value, TimeSpan expiresAfter)
42  {
43  Value = value;
44  ExpiresAfter = expiresAfter;
45  }
46  public CacheItem(T value)
47  {
48  Value = value;
49  }
50  public T Value { get; }
51  internal DateTimeOffset Created { get; } = DateTimeOffset.Now;
52  internal TimeSpan? ExpiresAfter { get; }
53  }
54  }
55