我有一个基于MVC的站点,它使用存储库/服务模式进行数据访问.编写的服务用于大多数应用程序(控制台,winform和Web).目前,控制器直接与服务通信.这限制了应用适当缓存的能力.
我看到我的选项如下:
为Web应用程序编写一个包装器,它实现了执行缓存的IWhatEverService.
通过缓存每个Action的ViewData,在每个控制器中应用缓存.
不要担心数据缓存,只需为每个Action实现OutputCaching.
我可以看到每个人的利弊.使用Repository/Service进行缓存的最佳做法是什么?
史蒂夫史密斯做了两篇很棒的博客文章,演示了如何使用他的CachedRepository模式来实现你正在寻找的结果.
介绍CachedRepository模式
通过策略模式构建CachedRepository
在这两篇文章中,他向您展示了如何设置此模式,并解释了它为何有用.通过使用此模式,您可以获得缓存,而无需现有代码查看任何缓存逻辑.实际上,您使用缓存的存储库就像它是任何其他存储库一样.
public class CachedAlbumRepository : IAlbumRepository { private readonly IAlbumRepository _albumRepository; public CachedAlbumRepository(IAlbumRepository albumRepository) { _albumRepository = albumRepository; } private static readonly object CacheLockObject = new object(); public IEnumerableGetTopSellingAlbums(int count) { Debug.Print("CachedAlbumRepository:GetTopSellingAlbums"); string cacheKey = "TopSellingAlbums-" + count; var result = HttpRuntime.Cache[cacheKey] as List ; if (result == null) { lock (CacheLockObject) { result = HttpRuntime.Cache[cacheKey] as List ; if (result == null) { result = _albumRepository.GetTopSellingAlbums(count).ToList(); HttpRuntime.Cache.Insert(cacheKey, result, null, DateTime.Now.AddSeconds(60), TimeSpan.Zero); } } } return result; } }
最简单的方法是在存储库提供程序中处理缓存.这样您就不必更改应用程序其余部分的任何代码; 它将忽略数据是从缓存而不是存储库提供的事实.
所以,我创建了一个控制器用来与后端通信的接口,在实现中我会添加缓存逻辑.用一些DI将它全部包裹起来,你的应用程序将被设置为易于测试.