我想要的在概念上非常简单,但我无法弄清楚如何最好地实现这样的事情。
在我的Web应用程序中,我有访问存储库的服务,这些存储库访问与SQL Server数据库交互的EF。所有这些都是每个Web请求实例一次。
我想在存储库和EF(或服务和存储库?)之间有一个额外的层,它静态地跟踪从数据库中拉出并推送到数据库的对象。
假设只通过应用程序完成数据库访问的目标是,我们知道这样的事实,即除非某些存储库访问EF并提交更改,否则对象集并不是真的变化
一个例子是:
Repository调用方法GetAllCarrots();
GetAllCarrots()
对SQL Server检索List<Carrot>
执行查询,如果之间没有其他任何事情发生,我想阻止此查询每次都在SQL Server上实际生成(无论它是什么)处于不同的Web请求,我希望能够处理这种情况)
现在,如果对BuyCarrot()
的调用向表中添加了Carrot
,那么我希望这会使Carrot
的静态缓存无效,这会使GetAllCarrots();
成为{{1}}需要再次查询数据库。
数据库缓存有哪些好资源?
答案 0 :(得分:2)
您可以使用LinqToCache。
它允许您在存储库中使用以下代码:
var queryTags = from t in ctx.Tags select t;
var tags = queryTags.AsCached("Tags");
foreach (Tag t in tags)
{
...
}
我们的想法是,当查询结果发生变化时,您会使用SqlDependency收到通知。只要结果没有改变,您就可以缓存它。
LinqToCache
会跟踪您的查询并在查询时返回缓存的数据。当从SqlServer收到通知时,缓存将被重置。
答案 1 :(得分:1)
我建议你阅读http://rusanu.com/2010/08/04/sqldependency-based-caching-of-linq-queries/。
我遇到了类似的挑战,由于EF的使用和限制,我决定使用IoC将缓存实现为客户端和服务器服务之间的附加服务。监视可能影响缓存数据的所有服务方法。
当你有一个运行服务的服务器场时,如果目标是支持我将使用SqlDependency实现的多个服务器,那么当然不是一个完美的解决方案。