2014-09-03 158 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发布,以防止异常被抛出,具体取决于您如何配置缓存设置(请参阅链接了解完整详细信息)。

相关问题