我开始在ASP.NET MVC网站的缓存基础结构上工作。问题是,我似乎无法找到数据缓存一个合理的地方(除“无处不在”)ASP.NET存储库模式/服务层缓存
现在我的建筑看起来像这样:
控制器 - >服务层 - >存储库。该存储库使用Linq to SQL进行数据访问。
该存储库公开了像Insert,GetById和GetQueryable这样的通用方法,该方法返回服务层可以进一步优化的IQueryable。
我喜欢将缓存放入存储库层的想法,因为服务层不应该关心数据来自何处。问题在于缓存失效。服务层拥有关于数据何时变得陈旧的更多信息。例如:
假设我们有一个用户表和一个订单表(规范示例)。服务层提供像GetOrder(INT ID)的方法,这将调用库层:
public Order GetOrder(int id)
{
using(var repo = _repoFactory.Create<Order>())
{
return repo.GetById(id)
}
}
或
repo.GetQueryable(order => order.Id == id && order.HasShipped == false).Single();
如果我们在库层高速缓存,好像那将是非常有限的了解订单数据何时发生变化。假设用户被删除,导致他们的所有订单都被删除了一个CASCADE。服务层可能会使Orders缓存失效,因为它知道用户刚被删除。尽管存储库(因为它是一个工作单元),但不知道。 (忽略我们不应该为删除的用户查询订单的事实,因为这只是一个示例)。
还有其他的情况,我认为这表现出来。假设我们想获取所有用户的订单:
repo.GetQueryable(order => order.UserId == userId).ToList()
该存储库高速缓存此查询的结果,但是,如果加入另外的订单,该查询将不再有效。尽管只有服务层意识到这一点。
这也可能是我对存储库层的理解是错误的。我把它看作是围绕数据源的外观(即,从L2SQL转换到EF到任何服务层都不知道底层源)。
看起来像一个正确的缓存评估和它的危险。 – gt124 2011-04-25 17:56:24
查看此答案:https://stackoverflow.com/a/7805942/13729 – ssmith 2017-11-20 02:06:36