2014-09-03 68 views
1

我們使用mvc sitemapprovider作爲麪包屑的解決方案。 基本的東西工作正常,但現在我們看起來更深入一點,並想知道[SiteMapCacheRelease]屬性。 該文檔指出,此屬性將清除給定緩存鍵的緩存。在我們的asp.net mvc web項目中使用MVC SitemapProvider與AppFabric

對於我們的應用程序,我們使用AppFabric作爲緩存解決方案。問題是,我如何讓mvc sitemapProvider強制使用AppFabric呢?

我覺得下面的行負責控制應該使用哪個緩存(在MvcSiteMapContainerInitializer中)。

container.RegisterSingle<System.Runtime.Caching.ObjectCache>(() => System.Runtime.Caching.MemoryCache.Default); 

我該如何將這兩者結合在一起? (AppFabric使用DataCache,而SiteMapProvider似乎期望ObjectCache ...)

回答

1

在默認設置 - System.Runtime.Caching.ObjectCache和MvcSiteMapProvider.Caching.ICacheProvider中實際存在2個用於緩存的可擴展點。在框中還包含2個ICacheProvider實現,其中包括AspNetCacheProvider(System.Web.Caching)和RuntimeCacheProvider(System.Runtime.Caching),但此時沒有DataCacheProvider。如果您決定實施一個,那麼這對於contribute to MvcSiteMapProvider會是一件好事。

有一個post here進入如何實現自己的緩存提供程序。大多數情況下,只需複製並粘貼RuntimeCacheProvider中的代碼,然後將其編輯爲在構造函數中接受DataCache而不是ObjectCache。當然,您需要將方法連接到底層提供程序,但只有5種方法和1個事件需要處理。線程鎖定代碼已由MicroCacheLazyLock處理,因此您需要實現的只是操作本身。

請注意,您還需要實現自己的緩存依賴關係,以便在文件更改時自動重新加載,這是一個稍微模糊的過程。 ICacheDependency返回一個對象數據類型。您的緩存提供程序必須以ICacheProvider可以通過配置NullCacheProvider返回null來指示沒有緩存依賴性的方式來實現,您的實現應與之兼容。

還有附加多個依賴關係的問題 - 您應該實現類似於RuntimeCompositeCacheDependency類的DataCompositeCacheDependency類。這意味着你的所有依賴提供者都應該返回一個IList(或者其他一些集合類型)並且防止null,以便它們可以無縫地插入到彼此中。我不太瞭解DataCache知道如何實現它,但是如果你看看現有的緩存依賴關係,它應該給你一些想法。如果一切都失敗了,您可以使用NullCacheDependency並完全依靠CacheReleaseAttribute在基礎數據更改時重新加載您的SiteMap。

還有一個請求緩存修飾器here,你可能想用它來保持SiteMap對象每次請求多次加載。您可能需要它,直到版本4.7發佈,以防止異常被拋出,具體取決於您如何配置緩存設置(請參閱鏈接瞭解完整詳細信息)。

相關問題