在EPiServer CMS 7.5中缓存具有缓存依赖关系的对象



我想存储一个小的对象列表,并创建一个对网站起始页的依赖项。因此,当起始页被更改时,强制缓存无效。使用旧的缓存实现很容易做到这一点,现在已经弃用了。

文档中说我应该使用CacheEvctionPolicy类。但是我不知道如何用这个类设置依赖关系。

我的问题是:如何在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+,您应该使用缓存驱逐策略,如:

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

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

我创建了一个简单的实现,比如(不是线程安全的):

    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"类使用这个实现,并且应该处理服务器之间的缓存无效问题。

最新更新