情景:
如何可以“伪造”(代理?)CustomerEntity,以便所有查询都尝试命中缓存的CustomerEntities。显然,在每个查询中,我可以为每个单独的查询使用缓存模式,但我想将它用于整个Customer表而不管查询。
(缓存预留)
private static readonly DataCache cache = CacheUtil.Instance.Cache;
public List<Customer> GetCustomers()
{
string cacheKey = "test";
var list = (List<Customer>)cache.Get(cacheKey);
if (list == null)
{
using (var context = DataObjectFactory.CreateContext())
{
var customers = context.Customer.Where(w => w.CustomerId > 10).ToList();
list = new List<Customer>();
foreach (var customer in customers)
list.Add(customer);
cache.Put(cacheKey, list);
return list;
}
}
else
{
return list;
}
}
答案 0 :(得分:2)
这需要编写IObjectSet<T>
的自定义实现,它将从缓存返回数据或查询真实的内部ObjectSet<T>
。此实现的实例将在您的上下文中公开,而不是默认ObjectSet<T>
。另一种更简单的方法是简单地隐藏您的上下文并仅通过GetQuery()
之类的指定方法公开查询 - 您的所有查询都将使用此方法而不是context.Customer
,因为context
将无法访问它们。
您还可以查看Caching context wrapper。