我想存储一小部分对象并创建对网站起始页的依赖项。因此当起始页改变时强制缓存失效。使用旧的缓存实现很容易做到这一点,但现在已弃用。
文档说我应该使用 CacheEvictionPolicy 类。但我不知道如何使用这个类设置依赖项。
我的问题是: 如何在 EPiServer 7.5 中缓存依赖于 EPiServer 内容 (IContent) 的对象(不使用不推荐使用的方法并包括 Web 服务器之间失效消息的功能)?
我想存储一小部分对象并创建对网站起始页的依赖项。因此当起始页改变时强制缓存失效。使用旧的缓存实现很容易做到这一点,但现在已弃用。
文档说我应该使用 CacheEvictionPolicy 类。但我不知道如何使用这个类设置依赖项。
我的问题是: 如何在 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) }
)
);
我设法解决了这个问题。使用这里找到的方法。
我创建了一个简单的实现,例如(不是线程安全的):
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 使用这个实现,并且应该与服务器之间的缓存失效一起工作。