我有一个业务对象项目和一个可能在多个接口(网站,Web服务,控制台应用程序等)中实现的数据层。
我的问题涉及如何在处理数据检索的方法中正确实现缓存。我将使用SqlCacheDependency来确定缓存对象何时需要过期,但我不确定实现缓存本身的最佳方法:
如果库正用于Web项目,我想使用HttpRuntime.Cache;但是,我猜这将是控制台应用程序的一个问题。
在允许多种类型的接口时,在.Net项目的数据层中实现缓存的最佳方法是什么?
答案 0 :(得分:1)
通常我过去看到的是数据/表示层之间的中间层,它实现了特定缓存存储的缓存。
asp.net网站上的This article显示了我过去见过的架构的概述。
这里最重要的是你正确的目标,因为你的选择对于每个单独的目标都不一样,因此,尝试获得可以全面运作的东西将证明是一个具有挑战性的前景和大多数可能会导致使用不完美的方法来达成妥协。
答案 1 :(得分:1)
如果您使用的是.net 4.0,则应查看MemoryCache命名空间中的System.Runtime.Caching。这被添加到.net 4.0中,专门用于解决nonASP.NET应用程序没有缓存API这一事实,或者必须附带System.Web并使用HttpRuntime.Cache。或者,您可以查看AppFabric缓存,它与客户端无关,但可能需要您不需要处理的开销。
如果您使用的是早期版本的.net,那么您可能会发现最简单的方法是咬紧牙关并依赖System.Web,然后您可以在任何地方使用HttpRuntime.Cache - 这不是一个完美的解决方案但是它具有一致性的优点。另一种方法是查看Enterprise Library Caching Block,它再次与客户端无关,但不推荐用于可以使用HttpRuntime内容的Web应用程序。
答案 2 :(得分:1)
添加缓存层。
要么在每个不同的数据层实现中实现缓存,要么可以节省大量工作,只需在数据层上方的单独层中实现缓存,因此您只需执行一次。这有一个额外的好处,你可以缓存你的数据传输对象,而如果你把缓存放在DL中你可能会犯错误的原始数据缓存,这意味着你每次访问时都会将它转换为DTO缓存。
一个重要的目标是使缓存层与regualar未缓存的数据层完全相同。如果你能做到这一点,那么缓存就变成了可选 - 缓存看起来就像任何其他的DL实现 - 而上层并不知道它。这可能很棘手,但收益很好。
所以:
[各种DL实现] - [DL接口] - [缓存层] - [DL接口] - [更高层]