asp.net-mvc - net - mvc model教學




使用存儲庫/服務模式和MVC時緩存數據對象 (3)

我有一個基於MVC的站點,它使用Repository / Service模式進行數據訪問。 編寫的服務用於大多數應用程序(控制台,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 IEnumerable<Album> GetTopSellingAlbums(int count)
    {
        Debug.Print("CachedAlbumRepository:GetTopSellingAlbums");
        string cacheKey = "TopSellingAlbums-" + count;
        var result = HttpRuntime.Cache[cacheKey] as List<Album>;
        if (result == null)
        {
            lock (CacheLockObject)
            {
                result = HttpRuntime.Cache[cacheKey] as List<Album>;
                if (result == null)
                {
                    result = _albumRepository.GetTopSellingAlbums(count).ToList();
                    HttpRuntime.Cache.Insert(cacheKey, result, null, 
                        DateTime.Now.AddSeconds(60), TimeSpan.Zero);
                }
            }
        }
        return result;
    }
}

最簡單的方法是在存儲庫提供程序中處理緩存。 這樣您就不必更改應用程序其餘部分的任何代碼; 它將忽略數據是從緩存而不是存儲庫提供的事實。

所以,我創建了一個控制器用來與後端通信的接口,在實現這個時我會添加緩存邏輯。 用一些DI包裝好的蝴蝶結,你的應用程序將被設置為易於測試。






design-patterns