这是我目前对此的解决方案。
鉴于此,在存储库中,我们将调用类似于:
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>
,基于这个 Stackoverflow 答案。最后,一个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>
请注意,当我们想要参数完全相同的缓存策略时,这也允许我扩展这个想法,但可能是不同的用户帐户正在访问它(我们可以在条件中添加一个字段,比如用户类型,即使 LINQ 表达式不会使用它)。