这是我目前的解决方案。
鉴于,在存储库中,我们将有类似的调用:
public IEnumerable<MYPOCO> GetData(string someParameter, int anotherParameter);
因此我们可以说这些参数是标准。所以,我介绍了一个Criteria 类,它基本上包含Dictionary<string, object> 实例,并且有一些类型安全的setter 和getter,简化:
public class Criteria
{
private Dictionary<string, object> _criteria = new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase);
public Criteria Set<T>(string key, T value)
{
_criteria[key] = value;
return this;
} // eo Set
public T Get<T>(string key)
{
return _criteria.ContainsKey(key) ? _criteria[key] : default(T);
} // eo Get
public Dictionary<string, object> Items { get { return _criteria; } }
} // eo class Criteria
然后,我为Dictionary<TK, TV>写了一个扩展方法,基于this Stackoverflow answer。最后,IEqualityComparer<Criteria> 类适用于 Criteria 类型。
这意味着我的缓存现在由标准键控,该标准采用传入存储库的参数进行设置:
public class MyPocoRepository<TMYPOCO>
{
private Cache<Criteria, IEnumerable<TMYPOCO>> _cache = new Cache<Criteria, IEnumerable<TMYPOCO>>(CriteriaComparer); // is passed to the dictionary constructor which is actually the cache.
public IEnumerable<TMYPOCO> GetData(string someParameter, int anotherParameter)
{
Criteria criteria = new Criteria();
criteria.Set("someParameter", someParameter)
.Set("anotherParameter", anotherParameter);
// we can check the cache now based on this...
} // eo GetData
} // eo MyPocoRepository<TMYPOCO>
请注意,当我们想要参数完全相同的缓存策略时,这也允许我扩展这个想法,但可能是不同的 user 帐户正在访问它(我们可以添加一个字段,说 - 用户类型,符合条件,即使 LINQ 表达式不会使用它)。