当前位置:  开发笔记 > 后端 > 正文

使用存储库/服务模式和MVC时缓存数据对象

如何解决《使用存储库/服务模式和MVC时缓存数据对象》经验,为你挑选了2个好方法。

我有一个基于MVC的站点,它使用存储库/服务模式进行数据访问.编写的服务用于大多数应用程序(控制台,winform和Web).目前,控制器直接与服务通信.这限制了应用适当缓存的能力.

我看到我的选项如下:

为Web应用程序编写一个包装器,它实现了执行缓存的IWhatEverService.

通过缓存每个Action的ViewData,在每个控制器中应用缓存.

不要担心数据缓存,只需为每个Action实现OutputCaching.

我可以看到每个人的利弊.使用Repository/Service进行缓存的最佳做法是什么?



1> Brendan Enri..:

史蒂夫史密斯做了两篇很棒的博客文章,演示了如何使用他的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 IEnumerable GetTopSellingAlbums(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;
    }
}



2> 小智..:

最简单的方法是在存储库提供程序中处理缓存.这样您就不必更改应用程序其余部分的任何代码; 它将忽略数据是从缓存而不是存储库提供的事实.

所以,我创建了一个控制器用来与后端通信的接口,在实现中我会添加缓存逻辑.用一些DI将它全部包裹起来,你的应用程序将被设置为易于测试.


嗯....我在这里看不到问题.您可以创建一个标准的Repository或CacheableRepository,它接受ICache依赖(无论可能是什么).仅仅因为你"缓存"并不意味着你必须使用httpcache
推荐阅读
跟我搞对象吧
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有