私はこれを解決することができました。ここにある方法を使用します。
次のような単純な実装を作成しました(スレッドセーフではありません):
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;
編集: IObjectInstanceCache の代わりに ISynchronizedObjectInstanceCache に変更されました。EPiServer の「CacheManager」クラスはこの実装を使用し、サーバー間のキャッシュの無効化を処理することになっています。