使用缓存依赖项在 EPiServer CMS 7.5 中缓存对象

Caching objects in EPiServer CMS 7.5 with cache dependencies

我想存储一小部分对象并创建对网站起始页的依赖。因此,当起始页被改变时强制缓存失效。使用旧的缓存实现很容易做到这一点,现在已弃用。

documentation 说我应该使用 CacheEvictionPolicy class。但我无法弄清楚如何使用此 class.

设置依赖项

我的问题是: 如何在 EPiServer 7.5 中缓存依赖于 EPiServer 内容 (IContent) 的对象(不使用已弃用的方法并包括 Web 服务器之间的无效消息功能)?

您应该能够使用 DataFactoryCache.CreateDependency() 创建缓存依赖项。它支持指定一个 ContentReference 作为其参数,例如 ContentReference.StartPage 以在更新起始页时清除缓存条目。

此外,其中大部分内容(尽管对于 EPiServer 6)仍然有效:http://tedgustaf.com/blog/2010/5/cache-objects-in-episerver-with-page-dependencies/

除非我误解了你需要达到的目标?

编辑: 对于 EPiServer 7.5+,您应该使用 CacheEvictionPolicy,例如:

EPiServer.CacheManager.Insert(
                key,
                item,
                new CacheEvictionPolicy(
                    new List<string>() { DataFactoryCache.PageCommonCacheKey(dependencyLink) }
                )
            );

我设法解决了这个问题。使用找到的方法 here.

我创建了一个简单的实现(非线程安全):

    private static ISynchronizedObjectInstanceCache _cacheInstance;
    public static ISynchronizedObjectInstanceCache CacheImplementation
    {
        get
        {
            return (_cacheInstance ?? (_cacheInstance = ServiceLocator.Current.GetInstance<ISynchronizedObjectInstanceCache>()));
        }
        set
        {
            _cacheInstance = value;
        }
    } 
    public IList<MyObject> GetCachedObjects()
    {
        if (_cachedObjects == null)
        {
            object value = CacheImplementation.Get("MyObjectsCacheKey");
            if (value == null)
            {
                // Lookup objects (the slow function that triggered the need for caching)
                _cachedObjects = LookupMyObjects();
                string currentLanguage = ContentLanguage.PreferredCulture.Name;

                // Create dependencies and add to cache
                List<string> cacheDependencyKeys = new List<string>();

                // Add dependency to the start page
                cacheDependencyKeys.Add(DataFactoryCache.PageLanguageCacheKey(ContentReference.StartPage, currentLanguage));

                // Add dependency to the pointed out startpoint of the lookup of "MyObjects" (if not null)
                // This will force a cache invalidation when the page itself or it's children are changed.
                if (CurrentPage.MyObjectsStartPoint != null)
                {
                    cacheDependencyKeys.Add(DataFactoryCache.PageLanguageCacheKey(CurrentPage.MyObjectsStartPoint, currentLanguage));
                    cacheDependencyKeys.Add(DataFactoryCache.ChildrenCacheKey(CurrentPage.MyObjectsStartPoint));
                }
                // Do insert into cache
                CacheImplementation.Insert("MyObjectsCacheKey", _cachedObjects, new CacheEvictionPolicy(cacheDependencyKeys.ToArray()));
            } else 
            {
                _cachedObjects = value as IList<MyObject>;    
            }
        }
        return _cachedObjects;
    } private IList<MyObject> _cachedObjects = null;

编辑: 更改为 ISynchronizedObjectInstanceCache 而不是 IObjectInstanceCache。 EPiServer 的 "CacheManager"-class 使用此实现,并且应该与服务器之间的缓存失效一起使用。